当 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不收集任何事实的效果!
我有一个 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不收集任何事实的效果!