AnsibleUndefinedVariable:'ansible.vars.hostvars.HostVarsVars对象'没有属性

问题描述 投票:0回答:3

我正在使用 Ansible,在运行我的 playbook 后收到此错误。

这是我的剧本:


---
- name: Set 192.168.122.4 Hostname
  hosts: 192.168.122.4
  gather_facts: false
  become: true
  tasks:
    - name : Name 4
      hostname:
        name:  ansible1.example.com

- name: Set 192.168.122.5 Hostname
  hosts: 192.168.122.5
  gather_facts: false
  become: true
  tasks:
    - name : Name 5
      hostname:
        name: ansible2.example.com

- name: Manage Hosts File
  hosts: all
  gather_facts: true
  become: true
  tasks:
    
    - name: Deploy Hosts Template
      template:
        src: hosts.j2
        dest: /etc/hosts

这是我的模板


# Managed by Ansible
127.0.0.1 localhost
{% for host in groups['all'] %}
{{ hostvars[host]['ansible_default_ipv4']['address'] }} {{ hostvars[host]['ansible_fqdn'] }} {{ hostvars[host]['ansible_hostname'] }}
{% endfor %}

我收到此错误:

AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'ansible_default_ipv4

我尝试使用调试模块来查看是否从

ansible_default_ipv4
收到响应,并且我得到了一个列表,其中包括地址,这就是我想要的。因此,远程服务器并不是没有该设置,而是有,信息就在那里,但我如何检索它以便可以填充这个
/etc/hosts
文件。

但我发现这与

ansible_default_ipv4
本身无关,因为它会给另一个对象带来相同的错误。

所以我猜测这与模板中的这些神奇变量有关。

我的参考资料是:

RHCE 8 - Ansible RHCE - 使用 Jinja 模板填充主机文件 作者:theurbanpenguin 在 YouTube 上,查找一下

linux ansible
3个回答
10
投票

谢谢@Jack @Zeitounator,问题出在我的库存上。显然,如果您在库存中留下了一台您没有使用的服务器,例如,我的库存是

10.0.2.[4:7]

但是我把我的 [7] 机器关掉了,一旦我移除并制作了我的库存,就像

10.0.2.[4:6]它开始工作了。

所以我猜测,如果你的库存中列出了一台不再使用的机器,它可能会导致魔法变量出现问题。

我的教训是保持库存文件干净。

谢谢


0
投票

如果您使用

serial: 1
其他主机的事实(如
ansible_default_ipv4
)可能不可用。有关更多信息,请参阅在串行运行剧本时访问“其他”主机事实


-3
投票

您必须指定主机:全部

gathering:这仅影响游戏的 Gather_facts 指令完成的收集,

© www.soinside.com 2019 - 2024. All rights reserved.