2015-12-22 21 views
2

我需要檢查所有遠程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

這聽起來像你想要的東西是這樣的:

- 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 
相關問題