如何在Ansible中循环条件时使用

时间:2015-12-22 17:36:13

标签: loops conditional ansible

我需要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")

1 个答案:

答案 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变量只是主机上存在的所有网络设备(eth0eth1lo等)的列表。上面的任务将循环遍历每个设备,然后查找变量名称,如ansible_eth0ansible_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