如何借助Jinja2模板和Ansible将机器IP地址放入HAProxy配置文件?
我对Ansible hostvars有些误解。我正在播放3台主机的playbook中的模板任务,清单文件如下。以下是playbook任务:如何借助Jinja2模板和Ansible将机器IP地址放入HAProxy配置文件?,ansible,jinja2,ansible-inventory,Ansible,Jinja2,Ansible Inventory,我对Ansible hostvars有些误解。我正在播放3台主机的playbook中的模板任务,清单文件如下。以下是playbook任务: - name: Template a HAProxy config template: src: ./haproxy.cfg.j2 dest: /etc/haproxy/haproxy.cfg owner: root group: root mode: '0644' 这是我的示例库存文件: server10 an
- name: Template a HAProxy config
template:
src: ./haproxy.cfg.j2
dest: /etc/haproxy/haproxy.cfg
owner: root
group: root
mode: '0644'
这是我的示例库存文件:
server10 ansible_host=192.168.70.15
server20 ansible_host=192.168.70.20
server30 ansible_host=192.168.70.25
[servergroup]
server10
server20
server30
这是我的*.j2
配置文件的一部分:
{% for host in hostvars %}
server {{ host }} {{ ansible_default_ipv4.address }}
{% endfor %}
我想得到这样的东西:
server server10 192.168.70.15
server server20 192.168.70.20
server server30 192.168.70.25
server server10 192.168.70.15
server server30 192.168.70.15
server server10 192.168.70.15
问题就在这里——我得到了这样的结果:
server server10 192.168.70.15
server server20 192.168.70.20
server server30 192.168.70.25
server server10 192.168.70.15
server server30 192.168.70.15
server server10 192.168.70.15
如何正确使用IP变量?ansible\u default\u ipv4。address是当前正在运行任务的主机的默认ip4地址,即服务器10(如果我收到您的示例清单) 如果您想从其他主机获取事实,则需要通过
hostvars
magic dictionary导航这些事实。有关更多信息,请参阅
在您的情况下,您可以这样修复模板:
{% for host in hostvars %}
server {{ host }} {{ hostvars[host].ansible_default_ipv4.address }}
{% endfor %}
请注意,ansible\u default\u ipv4
仅适用于特定的主机
,前提是您以前收集了该主机的事实
或者,您可以使用库存中已登记的信息,而无需收集事实:
{% for host in groups['servergroup'] %}
server {{ host }} {{ hostvars[host].ansible_host }}
{% endfor %}
有个错误。收集事实:是
“AnsibleUndefinedVariable:'ansible.vars.hostvars.HostVarsVars对象'没有属性'ansible\u default\u ipv4'”
我无法重现您的问题。你正在运行哪个ansible版本?尝试替换为hostvars[host].ansible\u facts.default\u ipv4.address
。如果这仍然失败,三重检查您的剧本在开始时实际上正在收集所有需要的主机的事实。