从 jinjar2 模板中的清单循环 Ansible hostvars
Loop Ansible hostvars from inventory in jinjar2 template
我是 Ansible 的新手,只是库存中的变量有问题。在清单中,我有不同的变量,其中包含 MAC 或 IP 地址。我想遍历它们,如果存在,则在 jinjar2 模板中处理它们。
我的库存(缩短):
net6_prd:
children:
net6_prd_test:
hosts:
net6-tst-01:
eth1_mac: "001 eth1 mac"
eth1_ip: "001 eth1 ip"
eth2_mac: "001 eth2 mac"
eth2_ip: "001 eth2 ip"
net6-tst-02:
eth1_mac: "002 eth1 mac"
eth1_ip: "002 eth1 ip"
eth2_mac: "002 eth2 mac"
eth2_ip: "002 eth2 ip"
在 jinjar2 模板中,我使用了以下循环:
{% for ihost in hostvars -%}
# example={{ hostvars[items]['eth1_mac'] }}
{% endfor %}
不幸的是,这不起作用。 Ansible 报告变量不存在。
FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'eth1_mac'"}
我也曾尝试通过 groups[net6_prd]
对 net6_prd
中的所有主机进行 运行,但这也不起作用。其他人知道我的循环有什么问题吗?
变量hostvars
实际上包含了所有的主机,不管他们是不是剧中目标。这就是您可能会遇到此问题的原因,您的主机可能没有在您的清单中定义这些变量。
根据您要循环的主机,您可以使用:
ansible_play_hosts
special variable,其中
List of hosts in the current play run, not limited by the serial. Failed/Unreachable hosts are excluded from this list.
groups['net6_prd_test']
,这将列出名为 net6_prd_test
的组中的所有主机
- 根据您的需要,还有更多选择。
所以你最终会在你的模板中:
{% for _host in ansible_play_hosts %}
# example={{ hostvars[_host].eth1_mac }}
{% endfor %}
如果你真的无法避免使用那些未定义的变量来定位主机,你也可以在你的循环中进行过滤:
{% for _host in hostvars if hostvars[_host].eth1_mac is defined %}
# example={{ hostvars[_host].eth1_mac }}
{% endfor %}
我是 Ansible 的新手,只是库存中的变量有问题。在清单中,我有不同的变量,其中包含 MAC 或 IP 地址。我想遍历它们,如果存在,则在 jinjar2 模板中处理它们。
我的库存(缩短):
net6_prd:
children:
net6_prd_test:
hosts:
net6-tst-01:
eth1_mac: "001 eth1 mac"
eth1_ip: "001 eth1 ip"
eth2_mac: "001 eth2 mac"
eth2_ip: "001 eth2 ip"
net6-tst-02:
eth1_mac: "002 eth1 mac"
eth1_ip: "002 eth1 ip"
eth2_mac: "002 eth2 mac"
eth2_ip: "002 eth2 ip"
在 jinjar2 模板中,我使用了以下循环:
{% for ihost in hostvars -%}
# example={{ hostvars[items]['eth1_mac'] }}
{% endfor %}
不幸的是,这不起作用。 Ansible 报告变量不存在。
FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'eth1_mac'"}
我也曾尝试通过 groups[net6_prd]
对 net6_prd
中的所有主机进行 运行,但这也不起作用。其他人知道我的循环有什么问题吗?
变量hostvars
实际上包含了所有的主机,不管他们是不是剧中目标。这就是您可能会遇到此问题的原因,您的主机可能没有在您的清单中定义这些变量。
根据您要循环的主机,您可以使用:
ansible_play_hosts
special variable,其中List of hosts in the current play run, not limited by the serial. Failed/Unreachable hosts are excluded from this list.
groups['net6_prd_test']
,这将列出名为net6_prd_test
的组中的所有主机
- 根据您的需要,还有更多选择。
所以你最终会在你的模板中:
{% for _host in ansible_play_hosts %}
# example={{ hostvars[_host].eth1_mac }}
{% endfor %}
如果你真的无法避免使用那些未定义的变量来定位主机,你也可以在你的循环中进行过滤:
{% for _host in hostvars if hostvars[_host].eth1_mac is defined %}
# example={{ hostvars[_host].eth1_mac }}
{% endfor %}