Ansible

循環遍歷 ansible 事實

  • May 10, 2021

希望你好好的。

儘管我在網路和文件上進行了搜尋,但我仍然無法遍歷 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

引用自:https://serverfault.com/questions/1062541