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

问题描述 投票:21回答:4

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

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

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

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

ansible limit hosts ansible-facts
4个回答
11
投票

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

when: hostvars[item]['ansible_default_ipv4'] is not defined是一张支票,以确保您不会检查您已经了解事实的主人的事实

---
# 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

     ...

10
投票

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

- hosts: all
  tasks: [ ]  

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

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

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

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


6
投票

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

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


1
投票

您可以将您的剧本修改为:

...
- hosts: "{{ limit_hosts|default('default_group') }}"
  tasks:
    ...
...

当你运行它时,如果没有定义some_var(正常状态),那么它将在default_group库存组上运行,但是如果你运行它:

ansible-playbook --extra-vars "limit_hosts=myHost" myplaybook.yml

然后它只会在你的myHost上运行,但你仍然可以有其他部分使用不同的hosts: ..声明,事实收集,或其他任何实际。

© www.soinside.com 2019 - 2024. All rights reserved.