我正在尝试使 Ansible 与 --limit 一起工作,为此我需要有关其他主机的事实,我正在使用 fact_caching 对其进行缓存。我应该运行什么命令,以便它简单地收集所有主机上的所有事实并缓存它们,而不运行任何任务?如果像设置模块这样的东西缓存了它收集的事实,它会是完美的,但它似乎没有。
4 回答
这是我解决问题的方法:
1.- 在您的剧本 (site.yml) 上启用事实收集:
gather_facts: yes
2.-在 ansible.cfg 上启用事实缓存:
2.1.- 选项 1 - 如果您有时间安装 redis,请使用此选项:
[defaults]
gathering = smart
fact_caching = redis
# two hours timeout
fact_caching_timeout = 7200
2.2.- 选项 2 - 现在使用它来测试很简单,但比 redis 慢:
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/facts_cache
# two hours timeout
fact_caching_timeout = 7200
3.- 更新或创建事实缓存。为此,只需执行一项任务即可创建一个新角色(缓存更新):执行ping。我们使用 ping 是因为它是最简单和最快的 ansible 任务,因此它将帮助我们快速更新缓存:
- name: Pinging server to update facts cache
ping:
问候,
创建一个只有一行的新剧本:
- hosts: all
并运行它会收集所有事实,如果 fact_caching 开启,它将缓存它们以在未来的剧本中使用--limit。
绝对最快的方法是使用 Ansible 在 1.8 版中引入的事实缓存。它需要使用 redis 服务器来存储事实,但它可以让您在 playbook 运行之间存储事实。如文档所述:
例如,想象一下拥有数千台主机的非常大的基础架构。事实缓存可以配置为每晚运行,但一小部分服务器的配置可以临时运行或全天定期运行。启用事实缓存后,无需“访问”所有服务器来引用变量和有关它们的信息。
--limit 的问题在于它会限制你 ansible 将与之交互的所有主机,因此它甚至会限制像特殊主机组这样all
会影响的主机。如果您没有使用 --limit 而是使用主机组,那么您可以执行以下操作:
---
- hosts: all
tasks: []
- hosts: my_host_group
tasks:
- name: task1
...
- name: task2
...
在此示例中,第一次播放将强制收集自您指定以来您拥有的所有主机的事实hosts: all
。然后第二个播放将在组中的主机上执行所需的任务my_host_group
。
下面是一个示例,展示了如何使用/usr/bin/ansible
来运行一个临时任务,该任务收集事实并将它们存储在指定的目录中。
$ ANSIBLE_CONFIG=facts.cfg ansible r4i1 -i lab -m setup
以下是内容facts.cfg
[defaults]
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /home/lab/facts
以及示例主机的输出
$ head /home/lab/facts/r4i1
{
"ansible_all_ipv4_addresses": [
"10.10.20.89"
],
"ansible_all_ipv6_addresses": [
"fe80::46a8:42ff:fe18:141c"
],
"ansible_apparmor": {
"status": "disabled"
},