Ansible
如何循環通過介面事實
ansible 的 setup 模組提供了 ansible_interfaces 的事實
"ansible_interfaces": [ "lo", "eth0", "eth1" ],
每個界面都有一些事實:
"ansible_eth0": { "active": true, "device": "eth0", "ipv4": { "address": "192.168.10.2", "broadcast": "192.168.10.255", "netmask": "255.255.255.0", "network": "192.168.10.0" }, "macaddress": "52:54:00:5c:c1:36", "module": "virtio_net", "mtu": 1500, "pciid": "virtio0", "promisc": false, "type": "ether" }
如何使用 ansible_interfaces 事實循環訪問可用的介面?
tasks: - name: find interface facts debug: msg=ansible_{{ item }} with_items: "{{ ansible_interfaces }}"
這顯然是行不通的,因為它列印出字元串 ansible_lo、ansible_eth0 和 ansible_eth1,但我希望它從這些介面列印出事實。有些伺服器還有其他介面,比如網橋,所以我事先不知道要使用哪些介面。
ps這個例子不是很有用,但最終我想用它來在elasticsearch中儲存macaddresses之類的事實,以便於搜尋哪個伺服器有哪個macaddress。
您遇到了 Jinja/Ansible 模板的限制之一,即無法評估表達式,這將需要獲得類似
ansible_{{ item }}
. 你被一根繩子困住了。幸運的是,有一個全域
hostvars
對象,您可以在其中通過鍵訪問所有事實,這是一個字元串。這些方面的東西應該讓你到達那裡:
tasks: - name: find interface facts debug: msg: "{{ hostvars[inventory_hostname]['ansible_%s' | format(item)] }}" with_items: "{{ ansible_interfaces }}"