使用with_items在同一个循环中的Ansible循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用with_items在同一个循环中的Ansible循环相关的知识,希望对你有一定的参考价值。
[寻求帮助,试图在多个池中循环,而某些池可能具有多个主机。我尝试做with_nested
和with_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循环