如何使用 Ansible 访问不同主机的主机变量?

如何使用 Ansible 访问不同主机的主机变量?

假设我有一个主机收集一些数据,
它位于一个组中[collectors]。我也有组内主机[reporters]
因此,我想根据 IP 地址设置记者变量groups['collectors'][0]。但是设置记者的剧本不在[collectors]组上运行,因此不会收集该主机的事实。有没有办法不硬编码 IP 地址?

答案1

您可以通过执行以下操作来访问几乎任何库存事实/变量:

{{ 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 服务器在 playbook 运行之间存储事实。启用此功能后,一个 playbook 可以引用之前运行的另一个 playbook 获取的事实。Ansible 文档给出的示例:

例如,想象一下一个拥有数千台主机的大型基础设施。事实缓存可以配置为每晚运行,但一小组服务器的配置可以临时运行或全天定期运行。启用事实缓存后,无需“访问”所有服务器来引用变量及其相关信息。

相关内容