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

问题描述

我对Ansible hostvar有一些误解。我正在从3个主机的剧本中播放模板任务,清单文件如下。这是剧本任务:

- 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

如何正确使用IP变量?

解决方法

ansible_default_ipv4.address是您当前在其上运行任务的主机的默认ip4地址,即server10(如果我相信您的示例清单)。

如果您要从其他主机获取事实,则需要通过hostvars魔术词典浏览这些事实。有关更多信息,请参见the relevant section in the fine manual

根据您的情况,您可以像这样修复模板:

{% for host in hostvars %}
  server {{ host }} {{ hostvars[host].ansible_default_ipv4.address }}
{% endfor %}

请注意,ansible_default_ipv4仅对于特定的host存在,前提是您以前为该主机收集了事实。

或者,您可以使用已经在库存中注册的信息,而不必在这种情况下收集事实:

{% for host in groups['servergroup'] %}
  server {{ host }} {{ hostvars[host].ansible_host }}
{% endfor %}