强制所有主机上的事实收集

teh*_*ehK 22 hosts limit ansible ansible-facts

我坐在一个相当复杂的Ansible项目前面,我们用它来设置我们的本地开发环境(多个VM),并且有一个角色使用Ansible收集的事实来/etc/hosts在每个VM上设置文件.不幸的是,当你只想为一个主机运行playbook时(使用-limit参数),其他主机的事实(显然)都会丢失.

有没有办法强制Ansible在所有主机上收集事实,即使你将剧本限制在一个特定的主机上?

我们尝试在剧本中添加一个剧本来收集所有主持人的事实,但当然这也限于-limit参数给出的一个主持人.如果有一种方法可以强制这个游戏在其他播放之前在所有主机上运行,​​那将是完美的.

我已经google了一下,发现了使用redis进行事实缓存的解决方案,但由于我们的本地操作本使用,我想避免使用其他软件.我知道,这不是什么大不了的事,但我只是在寻找一个"更清洁",仅限Ansible的解决方案,并且想知道,如果存在的话.

cor*_*ord 16

Ansible版本2使用委托事实引入了一种干净的官方方式(参见:http://docs.ansible.com/ansible/latest/playbooks_delegation.html#delegated-facts).

---
# This play will still work as intended if called with --limit "<host>" or --tags "some_tag"

- name: Hostfile generation
  hosts: all
  become: true

  pre_tasks:
    - name: Gather facts from ALL hosts (regardless of limit or tags)
      setup:
      delegate_to: "{{ item }}"
      delegate_facts: True
      when: hostvars[item]['ansible_default_ipv4'] is not defined
      with_items: "{{ groups['all'] }}"

  tasks:
    - template:
        src: "templates/hosts.j2"
        dest: "/etc/hosts"
      tags:
        - hostfile

     ...
Run Code Online (Sandbox Code Playgroud)


Bru*_*e P 10

通常,即使您不想在所有主机上运行任务,获取所有主机的事实的方法是执行以下操作:

- hosts: all
  tasks: [ ]  
Run Code Online (Sandbox Code Playgroud)

但正如您所提到的, - limit参数将限制将应用于哪些主机.

我认为没有办法简单地告诉Ansible忽略任何游戏中的--limit参数.但是,在Ansible中可能还有另一种方法可以完全按照您的要求进行操作.

我没有亲自使用它,但是从Ansible 1.8开始,可以使用事实缓存.简而言之,启用事实缓存Ansible将使用redis服务器缓存它遇到的主机的所有事实,并且您将能够在后续的playbooks中引用它们:

启用事实缓存后,一组中的机器可能引用另一组中的机器变量,尽管事实上它们尚未与当前执行的/ usr/bin/ansible-playbook进行通信.

  • 感谢您的回答.这也是我们的第一个解决方案,但事实上缓存是解决此问题的唯一解决方案.有一些可以覆盖限制参数来收集事实的东西会很好. (2认同)

mwp*_*mwp 6

这似乎仍然是一个问题,在2016年没有一个干净的解决方案,但更新版本的Ansible提供了一个"jsonfile"事实缓存后端,这似乎是一个体面的妥协安装Redis本地只是为了满足这种需要.现在我只是ansible all -m setup在运行带有--limit选项的剧本之前启动.足够爵士乐!

http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching