Ansible

如何循環通過介面事實

  • December 7, 2021

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 }}"

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