收集事实到事实缓存的最快方法

时间:2015-09-21 20:19:13

标签: caching ansible ansible-facts

我正在努力使Ansible与--limit一起工作并且这样做我需要关于其他主机的事实,我正在使用fact_caching进行缓存。我应该运行什么命令,以便它只是收集所有主机上的所有事实并缓存它们,而不运行任何任务?像setup module这样的东西如果能够缓存收集到的事实就会很完美,但似乎没有。

4 个答案:

答案 0 :(得分:24)

以下是我解决问题的方法:

1.-在您的剧本(site.yml)上启用事实收集:

gather_facts: yes

2.-在ansible.cfg上启用facts caching

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是因为它是最简单和最快速的任务,因此它可以帮助我们快速更新缓存:

- name: Pinging server to update facts cache
  ping:             

问候,

答案 1 :(得分:3)

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

- hosts: all

并且运行它会收集所有事实,如果启用了fact_caching,它将缓存它们以便在将来的playbooks中使用--limit。

答案 2 :(得分:0)

绝对最快的方法是使用1.8版本中引入的Ansible fact caching。它需要使用redis服务器来存储事实,但它可以让你在playbook运行之间存储事实。正如文档所述:

  

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

--limit的问题在于它会限制你将与之交互的所有主机,因此它甚至会限制像all这样的特殊主机组会影响的主机。如果您没有使用--limit但是使用了主机组,那么您可以执行以下操作:

---
- hosts: all
  tasks: []

- hosts: my_host_group
  tasks:
  - name: task1
    ...
  - name: task2
    ...

在此示例中,第一次播放将强制收集自您指定hosts: all以来所有主机的事实。然后,第二个游戏将在组my_host_group中的主机上执行所需的任务。

答案 3 :(得分: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"
    },