Ansible
循環遍歷 ansible 事實
希望你好好的。
儘管我在網路和文件上進行了搜尋,但我仍然無法遍歷 ansible 2.9 事實。
我想從所有主機上的自定義介面中檢索 IP 地址並放入一個列表中。這是我嘗試過的:
--- - hosts: all gather_facts: True vars: ip_private_list: [] - set_fact: ip_private_list: "{{ ip_private_list + [item] }}" with_items: "{{ hostvars[inventory_hostname]['ansible_ens256']['ipv4']['address'] }}" delegate_facts: true
我不明白為什麼 ip_private_list 沒有填充元素,當我嘗試使用 msg 進行調試時,我得到“Ansible Undefined”
關於資料結構或正確的方法,我有什麼想念的嗎?
謝謝你的幫助
此查詢應為您提供 IP 地址列表
- set_fact: ipl: "{{ hostvars|dict2items| json_query('[].value[].ansible_ens256.ipv4[].address') }}" run_once: true
筆記
映射主機並從主機變數中提取變數。例如
shell> cat playbook.yml - hosts: test_11,test_12,test_13 tasks: - set_fact: ipv4_dict: "{{ dict(ansible_play_hosts|zip(_ipv4)) }}" vars: _ipv4: "{{ ansible_play_hosts| map('extract', hostvars, ['ansible_wlan0', 'ipv4'])| list }}" run_once: true
給出列表字典
ipv4_dict: test_11: - address: 10.1.0.61 broadcast: 10.1.0.61 netmask: 255.255.255.255 network: 10.1.0.61 test_12: - address: 10.1.0.62 broadcast: 10.1.0.62 netmask: 255.255.255.255 network: 10.1.0.62 test_13: - address: 10.1.0.63 broadcast: 10.1.0.63 netmask: 255.255.255.255 network: 10.1.0.63
字典的值是列表,因為與適配器關聯的 IP 地址可能更多。使用此字典選擇 IP 地址,例如
- set_fact: ipv4_address: "{{ dict(ansible_play_hosts|zip(_address)) }}" vars: _address: "{{ ipv4_dict|dict2items|json_query('[].value[].address') }}" run_once: true
給字典
ipv4_address: test_11: 10.1.0.61 test_12: 10.1.0.62 test_13: 10.1.0.63
如果您想要一個簡單的 IP 地址列表,請選擇字典的值,例如
- set_fact: ip_private_list: "{{ ipv4_address.values()|list }}" run_once: true
給
ip_private_list: - 10.1.0.61 - 10.1.0.62 - 10.1.0.63