我需要ansible来检查所有远程IP地址,如果远程系统在特定子网中,则将文件复制到远程系统。我很难弄清楚如何在when
子句中对列表或字典进行ansible循环。
这会引发语法错误Error was expected string or buffer
,因为ansible_all_ipv4_addresses
是列表或字典,而不是字符串:
- name: auto.direct 10g
copy: src=auto.direct.10g dest=/etc/auto.direct owner=root group=root mode=0644
when: ansible_all_ipv4_addresses | search("192.168.17")
答案 0 :(得分:0)
听起来你想要这样的东西:
- name: auto.direct 10g
copy: src=auto.direct.10g dest=/etc/auto.direct owner=root group=root mode=0644
when: ansible_{{ item }}['ipv4']['address'].find("192.168.17") != -1
with_items: ansible_interfaces
ansible_interfaces
变量只是主机上存在的所有网络设备(eth0
,eth1
,lo
等)的列表。上面的任务将循环遍历每个设备,然后查找变量名称,如ansible_eth0
,ansible_lo
等。它从每个变量中获取ipv4地址字符串,然后执行查找(因为字符串只是一个python字符串)。
仅供参考,这对于理解/排除/调试此类事情非常有帮助:
- name: debug
debug: var=ansible_eth0 (or 'ansible_eth0['ipv4']', etc)
或者如果你想做一些与我上面使用的逻辑相关的事情:
- debug: var=ansible_{{ item }}['ipv4']['address']
when: ansible_{{ item }}['ipv4']['address'].find('10.') != -1
with_items: ansible_interfaces