鉴于此调试:
- name: Display all variables/facts known for a host
debug: var=hostvars[inventory_hostname]
部分地产生这个输出:
ok: [ny2-uat-app02] => {
"var": {
"hostvars[inventory_hostname]": {
...
"ansible_eth1": {
"active": true,
"device": "eth1",
"ipv4": {
...
},
"ipv6": [
{
...
}
],
...
为什么这一行在模板中:
- seeds: "{% for host in groups['seeds'] %}{{ hostvars[host]['ansible_' + internode_interface]['ipv4']['address'] }}{% if not loop.last %},{% endif %}{% endfor %}"
产生此错误:
fatal: [ny2-uat-app02] => {'msg': "AnsibleUndefinedVariable: One or more undefined variables: 'dict object' has no attribute u'ansible_eth1'", 'failed': True}
调试任务在ansible任务之前运行,以处理模板。
我想要完成的是将新节点添加到现有群集中。
答案 0 :(得分:4)
因为当您运行{% for host in groups['seeds'] %}
时,特定主机无法访问组seeds
中其他主机的变量,因此任务失败。
要访问其他主机的变量,您应该启用fact caching。
在Playbook文件中,您应该添加gather_facts: True
来更新事实。
答案 1 :(得分:0)
另一个提醒:当主机需要其他主机的变量时,请勿将ansible-playbook命令中的主机限制为特定主机!
ansible-playbook -l 'node1' hosts.yml
无法从'all'中找到其他主机的ansible_eth1,因此应该
ansible-playbook hosts.yml