使用with_items在同一个循环中的Ansible循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用with_items在同一个循环中的Ansible循环相关的知识,希望对你有一定的参考价值。

[寻求帮助,试图在多个池中循环,而某些池可能具有多个主机。我尝试做with_nestedwith_subelements,但似乎都没有做到我想要的。

- name: Pool members
  bigip_pool_member:
    state: present
    pool: "{{ item.pool }}"
    partition: Common
    host: "{{ item.host }}"
    port: "{{ item.port }}"
    provider:
      server: bigip.domain.com
      user: admin
      password: admin
      validate_certs: no
  delegate_to: localhost
  with_items:
    - { pool: pool, host: [10.10.10.10, 10.10.10.11], port: 80 }
    - { pool: pool2, host: 10.10.10.10, port: 80 }

我相信host字段一次只能取一个值,因此我需要遍历一个池的主机。输出将类似于

  bigip_pool_member:
    state: present
    pool: pool
    partition: Common
    host: 10.10.10.10
    port: 80

  bigip_pool_member:
    state: present
    pool: pool
    partition: Common
    host: 10.10.10.11
    port: 80

  bigip_pool_member:
    state: present
    pool: pool2
    partition: Common
    host: 10.10.10.10
    port: 80
答案

循环subelements是您要寻找的。例如,请参阅下面的手册,以了解如何引用所需的属性

- hosts: localhost
  vars:
    my_pools:
      - {pool: pool, host: [10.10.10.10, 10.10.10.11], port: 80}
      - {pool: pool2, host: [10.10.10.10], port: 80}
  tasks:
    - debug:
        msg: "pool:{{ item.0.pool }} port:{{ item.0.port }} host:{{ item.1 }}"
      with_subelements:
        - "{{ my_pools }}"
        - host

给予

    "msg": "pool:pool port:80 host:10.10.10.10"
    "msg": "pool:pool port:80 host:10.10.10.11"
    "msg": "pool:pool2 port:80 host:10.10.10.10"

注意

  • 简单地将对属性的引用放入您的代码中。
  • 保持一致。即使列表仅包含一项,属性host也必须是列表。
  • 使用loop代替with_subelements
      loop: "{{lookup('subelements', my_pools, 'host', {'skip_missing': True})}}"


以下是经过最少的更改即可使其正常工作的任务
- name: Pool members
  bigip_pool_member:
    state: present
    pool: "{{ item.0.pool }}"
    partition: Common
    host: "{{ item.1 }}"
    port: "{{ item.0.port }}"
    provider:
      server: bigip.domain.com
      user: admin
      password: admin
      validate_certs: no
  delegate_to: localhost
  with_subelements:
    - - {pool: pool, host: [10.10.10.10, 10.10.10.11], port: 80}
      - {pool: pool2, host: [10.10.10.10], port: 80}
    - host

(未测试)

以上是关于使用with_items在同一个循环中的Ansible循环的主要内容,如果未能解决你的问题,请参考以下文章

在ansible中使用double with_items循环

ansible-playbook循环安装软件包(with_items)

将项目分配给ansible中的var with_items

asible之-玩转各种循环

Ansible Playbook 使用循环语句

自动化运维工具Ansible实战playbook循环