当 inventory_host 作为变量插入时无法访问 hostvars

Unable to access hostvars when the inventory_host is inserted as a variable

我有一个 jinja2 模板,我正在尝试遍历一个主机组,并将所有主机的 ipv4 地址插入到我的模板中。但是当我这样做时我遇到了一个错误,即使我这样做的方式是每个 post 和文章建议的方式。

这是产生错误的模板:

{% if groups['linux-hosts'] %}
{% for item in groups['linux-hosts'] %}
define host {
    use                     generic-host-normal
    host_name               {{ item }}
    alias                   {{ item }}
    address                 {{ hostvars[item].ansible_default_ipv4.address }}
}
{% endfor %}
{% endif %}

我得到的错误是:

failed: [server] (item=servers.cfg) => {"changed": false, "item": "servers.cfg", "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars object' has no attribute 'ansible_default_ipv4'"}

如果我不使用方括号中的变量 'item',而是从清单中指定特定主机,Ansible 能够获取 ipv4 地址。示例('server' 是我清单中主机的名称):

{{ hostvars['server'].ansible_default_ipv4.address }}

这是因为您的剧本中缺少 gather_facts: yes 或等效的 - setup: 任务;除非请求,否则这些事实不会神奇地出现,这是默认情况下发生的,但肯定可以通过 gather_facts: no

关闭

一个简单的测试就会明白我的意思:

- hosts: all
  gather_facts: yes
  tasks:
  - debug: var=ansible_default_ipv4 verbosity=0

然后改变gather_facts: no并观察kaboom

我在类似的用例中遇到过这个问题。我的问题原来是我将主机包括在一个不是该剧目标的组中。因此,收集事实并没有针对组中的所有主机 运行。我通过 运行ning 设置针对我需要的所有主机解决了这个问题

- name: get cluster facts
  hosts: k8s-cluster
  tags:
    - always
  tasks:
    - name:
      setup:
      become: true

- name: deploy HA Proxy
  hosts: kube-master
  become: yes
  roles:
    - { role: ansible-role-haproxy }

注意:kube-master 是 k8s-cluster 的一个子集

此处描述的解决方案对我有用。

在您的剧本顶部添加一个空白剧本以收集所有主持人的事实。 Ansible hostvars has no attribute 'ansible_nodename'

我遇到了同样的问题。

对我来说,问题是我的 运行 我的剧本带有 --tags 标志。
这导致Ansible不收集任何事实的效果!