如何遍历界面事实

Vin*_*ent 7 ansible

ansible 的 setup 模块提供 ansible_interfaces 事实

"ansible_interfaces": [
    "lo", 
    "eth0",
    "eth1"
], 
Run Code Online (Sandbox Code Playgroud)

每个界面有一些事实:

"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"
}
Run Code Online (Sandbox Code Playgroud)

如何使用 ansible_interfaces 事实循环访问可用接口?

  tasks:
    - name: find interface facts
      debug: msg=ansible_{{ item }}
      with_items: "{{ ansible_interfaces }}"
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为它打印出字符串 ansible_lo、ansible_eth0 和 ansible_eth1,但我希望它从这些接口打印事实。有些服务器有其他接口,比如网桥,所以我事先不知道要使用哪些接口。

ps 这个例子不是很有用,但最终我想用它在elasticsearch中存储像macaddresses这样的事实,以便于搜索哪个服务器有哪个macaddress。

udo*_*dan 12

您遇到了 Jinja/Ansible 模板的局限性之一,即无法对表达式求值,而要获得类似ansible_{{ item }}. 你被绳子卡住了。

幸运的是,有一个全局hostvars对象,您可以在其中通过键访问所有事实,它是……一个字符串。

沿着这些路线的东西应该让你到达那里:

tasks:
  - name: find interface facts
    debug:
      msg: "{{ hostvars[inventory_hostname]['ansible_%s' | format(item)] }}"
    with_items: "{{ ansible_interfaces }}"
Run Code Online (Sandbox Code Playgroud)