Ansible根据定义的变量从另一个组获取主机IP

Ansible根据定义的变量从另一个组获取主机IP,ansible,ansible-inventory,Ansible,Ansible Inventory,我想根据变量名从inventory文件中的另一个组获取主机的IP 库存文件示例: [master] master-0.example.io master-1.example.io master-2.example.io [replica] replica-0.example.io master_host=master-0.example.io replica-1.example.io master_host=master-1.example.io replica-2.example.io ma

我想根据变量名从
inventory
文件中的另一个组获取主机的IP

库存文件示例:

[master]
master-0.example.io
master-1.example.io
master-2.example.io

[replica]
replica-0.example.io master_host=master-0.example.io
replica-1.example.io master_host=master-1.example.io
replica-2.example.io master_host=master-2.example.io
稍后在playbook中,我想运行一个命令,但对于该命令,我需要主控IP(FQDN不起作用)。我尝试了以下操作,但不起作用:

- name: Test run
  shell: "echo {{ ansible_default_ipv4.address }}:{{ port }} {{ hostvars['master_host']['ansible_default_ipv4', 'address'] }}:{{ port }}"

你知道有没有什么办法可以解决这个问题?或者,如果有任何其他方法可以做到这一点-基本上我需要的是将
master-0
replica-0
等进行匹配,并且我不想将IP放入
inventory
文件。

hostvars
是一个散列。散列中的每个顶部条目都是清单中主机的名称。要处理该散列,请使用不存在的字符串
'master\u host'
。您需要的是,对正在执行命令的特定主机使用变量
master\u host
的值

两种可能的正确语法是:

  • {{hostvars[master\u host].ansbible\u default\u ipv4.address}
  • {{hostvars[master\u host]['ansbible\u default\u ipv4']['address']}}

。。。或点或括号语法之间的任何混合。

您好,感谢您的及时回复。它成功了,谢谢你!我也在尝试
hostvars['master\u host']['ansible\u default\u ipv4','address']
,但似乎
ansible\u default\u ipv4
address
需要分开(我在PlayBook的另一部分的
map
中使用了这种语法,我很高兴能提供帮助。阅读doc.map with attribute需要一个按哈希顺序排列的后续元素列表。在jinja2表达式中寻址哈希与此无关。