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 的一个子集
这是因为您缺少剧本中的任务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
归档时间: |
|
查看次数: |
14190 次 |
最近记录: |