如何借助Jinja2模板和Ansible将机器IP地址放入HAProxy配置文件?

如何借助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

我对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 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
。如果这仍然失败,三重检查您的剧本在开始时实际上正在收集所有需要的主机的事实。