问题描述
我对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 %}