如何使用Ansible访问其他主机的主机变量?


45

假设有一个主机收集了一些数据,并且它在一个组中[collectors]。我也有小组主持人[reporters]。因此,我想从groups['collectors'][0]IP地址为记者设置一个变量。但是,用于设置记者的剧本并未按[collectors]小组运行,因此未收集该主持人的事实。有没有一种方法可以不对IP地址进行硬编码?

Answers:


87

通过执行以下操作,您可以访问几乎所有库存事实/变量:

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

或者,如果您想通过索引进入组:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

最大的窍门是,您需要收集所有感兴趣的主机/组的事实。因此,您需要修改针对记者组运行的剧本,以包括适用的无操作(虚拟)任务到收藏家小组。这将导致Ansible收集有关收集器主机的事实,以便可以从报告者组访问它们。因此,您可能想在记者剧本的顶部添加以下内容:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

空括号基本上意味着将不执行任何任务,但这仍将迫使Ansible收集有关收集器的事实,以便您随后可以在针对报告者的任务中引用它们。

编辑#1

我想到我还应该提到,从Ansible 1.8版开始,现在提供了一个事实缓存功能。事实缓存依靠redis服务器在剧本运行之间存储事实。启用该功能后,一个剧本可以引用以前运行的另一本剧本获得的事实。Ansible文档提供的示例:

例如,想象一下一个拥有数千台主机的超大型基础架构。可以将事实缓存配置为每晚运行,但是一小部分服务器的配置可以临时运行或全天运行。启用事实缓存后,不必“命中”所有服务器来引用变量和有关它们的信息。


2
有没有一种方法可以将关联索引设置为变量?在示例中,ansible localhost --extra-vars“ metamorphosis_ip = 172.16.3.73” -a“ echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}”
更正了

要添加到上面的答案中,请确保您在此处引用Ansible常见问题解答:docs.ansible.com/ansible/faq.html,其中详细解释了一些事情,例如循环访问一组主机或设置变量以获取特定主机在一组。
einarc

感谢您提出从任务列表为空的节点中获取事实的想法。
pedz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.