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)