当库存主机作为变量插入时无法访问主机变量

Har*_*ald 3 ansible ansible-facts

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

这是产生错误的模板:

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

失败: [server] (item=servers.cfg) => {"changed": false, "item": "servers.cfg", "msg": "AnsibleUndefinedVariable: 'ansible.vars.hostvars.HostVarsVars 对象'没有属性 'ansible_default_ipv4'"}

如果我不使用方括号中的变量“item”,而是从清单中指定特定主机,Ansible 就能够获取 ipv4 地址。示例(“服务器”是我库存中的主机名):

{{ hostvars['server'].ansible_default_ipv4.address }}
Run Code Online (Sandbox Code Playgroud)

小智 6

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

- 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 }
Run Code Online (Sandbox Code Playgroud)

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


mda*_*iel 5

这是因为您缺少剧本中的任务gather_facts: yes或同等任务;- setup:除非有要求,否则这些事实不会神奇地出现,这是默认情况下发生的,但人们当然可以通过以下方式关闭gather_facts: no

一个简单的测试将说明我的意思:

- hosts: all
  gather_facts: yes
  tasks:
  - debug: var=ansible_default_ipv4 verbosity=0
Run Code Online (Sandbox Code Playgroud)

然后改变gather_facts: no并观察kaboom

  • 即使使用 ```gather_facts: yes``` 对我来说也不起作用 (8认同)