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

hry*_*zik 50 ansible

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

Bru*_*e P 96

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

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}
Run Code Online (Sandbox Code Playgroud)

或者,如果你想通过一个组的索引来做到这一点:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}
Run Code Online (Sandbox Code Playgroud)

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

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]
Run Code Online (Sandbox Code Playgroud)

空括号基本上意味着不会执行任何任务,但这仍然会强制 Ansible 收集有关收集器的事实,以便您可以在针对记者运行的任务中引用它们。

编辑 #1

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

例如,想象一下拥有数千台主机的大型基础设施。事实缓存可以配置为每晚运行,但一小组服务器的配置可以全天临时或定期运行。启用事实缓存后,就没有必要“命中”所有服务器来引用变量和有关它们的信息。

  • 有没有办法将关联索引设置为变量?例如ansible localhost --extra-vars "metamorphosis_ip=172.16.3.73" -a "echo {{ hostvars[{{ metamorphosis_ip }}]['inv_domain'] }} " (3认同)
  • 自发布以来,事实的名称似乎有所改变。为了完成这项工作,我必须将其更改为 `{{ hostvars[groups['collectors'][0]]['ansible_default_ipv4']['address'] }}` (2认同)