假设我有一个主机收集一些数据,
它位于一个组中[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 文档给出的示例:
例如,想象一下一个拥有数千台主机的大型基础设施。事实缓存可以配置为每晚运行,但一小组服务器的配置可以临时运行或全天定期运行。启用事实缓存后,无需“访问”所有服务器来引用变量及其相关信息。