15

我正在尝试使 Ansible 与 --limit 一起工作,为此我需要有关其他主机的事实,我正在使用 fact_caching 对其进行缓存。我应该运行什么命令,以便它简单地收集所有主机上的所有事实并缓存它们,而不运行任何任务?如果像设置模块这样的东西缓存了它收集的事实,它会是完美的,但它似乎没有。

4

4 回答 4

40

这是我解决问题的方法:

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:             

问候,

于 2015-09-22T12:38:54.303 回答
3

创建一个只有一行的新剧本:

- hosts: all

并运行它会收集所有事实,如果 fact_caching 开启,它将缓存它们以在未来的剧本中使用--limit。

于 2015-09-22T15:39:50.180 回答
0

绝对最快的方法是使用 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

于 2015-09-22T00:21:48.177 回答
0

下面是一个示例,展示了如何使用/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"
    }, 
于 2018-05-24T13:55:25.897 回答