假设我有一个收集一些数据的主机,
它在一个组中[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 收集有关收集器的事实,以便您可以在针对记者运行的任务中引用它们。
我突然想到,我还应该提到,从 Ansible 1.8 版开始,现在可以使用事实缓存功能。事实缓存依赖于 redis 服务器来存储剧本运行之间的事实。启用它后,一个剧本可以引用先前运行的另一个剧本获得的事实。Ansible 文档给出的示例:
例如,想象一下拥有数千台主机的大型基础设施。事实缓存可以配置为每晚运行,但一小组服务器的配置可以全天临时或定期运行。启用事实缓存后,就没有必要“命中”所有服务器来引用变量和有关它们的信息。
归档时间: |
|
查看次数: |
104316 次 |
最近记录: |