【问题标题】:Fastest way to gather facts to fact cache将事实收集到事实缓存的最快方法
【发布时间】:2015-09-21 20:19:12
【问题描述】:

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

【问题讨论】:

    标签: caching ansible ansible-facts


    【解决方案1】:

    这是我解决问题的方法:

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

    - name: Pinging server to update facts cache
      ping:             
    

    您好,

    【讨论】:

    • 我已经完成了其余的工作,但 ping 命令正是我要找的。另外,gather_facts 默认为 yes。
    • 如何创建一个 ping 我们库存中所有服务器的 ping?
    • Easy: 1) set: "hosts: all" on your site.yml 2) set: "roles: cache-update" on your site.yml 执行时它将运行您的 ping 任务在所有主机上运行。
    【解决方案2】:

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

    - hosts: all
    

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

    【讨论】:

      【解决方案3】:

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

      例如,想象一下拥有数千台主机的非常大的基础架构。事实缓存可以配置为每晚运行,但一小部分服务器的配置可以临时运行或全天定期运行。启用事实缓存后,无需“访问”所有服务器来引用变量和有关它们的信息。

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

      ---
      - hosts: all
        tasks: []
      
      - hosts: my_host_group
        tasks:
        - name: task1
          ...
        - name: task2
          ...
      

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

      【讨论】:

      • 我已经启用了事实缓存(通过 json 而不是 redis),并且我们已经使用了主机组。我们有时也使用 --limit 。我一直在寻找一些方法来更新事实缓存而不运行整个剧本。
      • 你能用一个简单的剧本,只运行setup,目标all主机吗?这样,您的所有事实都会被缓存,而无需对系统进行任何更新。
      【解决方案4】:

      以下示例展示了如何使用/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"
          }, 
      

      【讨论】:

      • 尽管 OP 说它不能以临时方式使用设置模块,但这正是我所做的。
      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2011-09-17
      • 2022-01-12
      • 2015-09-12
      • 1970-01-01
      相关资源
      最近更新 更多