Принудительный сбор фактов на всех хостах

Я сижу перед довольно сложным проектом Ansible, который мы используем для настройки наших локальных сред разработки (несколько виртуальных машин), и есть одна роль, которая использует факты, собранные Ansible, для настройки файла /etc/hosts на каждой виртуальной машине. К сожалению, когда вы хотите запустить playbook только для одного хоста (используя параметр -limit), факты с других хостов (очевидно) отсутствуют.

Есть ли способ заставить Ansible собирать факты на всех хостах, даже если вы ограничиваете playbook одним конкретным хостом?

Мы попытались добавить игру в playbook для сбора фактов со всех хостов, но, конечно, это также ограничивается одним хостом, заданным параметром -limit. Если бы существовал способ заставить эту игру проходить на всех хозяевах раньше других, это было бы идеально.

Я немного погуглил и нашел решение с кешированием фактов с помощью Redis, но, поскольку наш playbook используется локально, я хотел избежать необходимости в дополнительном программном обеспечении. Я знаю, это не имеет большого значения, но я просто искал «более чистое» решение, предназначенное только для Ansible, и задавался вопросом, существует ли оно.


person tehK    schedule 04.05.2015    source источник


Ответы (4)


В 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

     ...
person corford    schedule 14.08.2017
comment
вы должны добавить: tags: всегда, чтобы запускать предзадачу независимо от тегов. Но молодцы !!!! очень полезный. - person seb835; 06.04.2020

В общем, способ получить факты для всех хостов, даже если вы не хотите запускать задачи на всех хостах, - это сделать что-то вроде этого:

- hosts: all
  tasks: [ ]  

Но, как вы упомянули, параметр --limit ограничивает то, к каким хостам это будет применяться.

Я не думаю, что есть способ просто указать Ansible игнорировать параметр --limit при любом воспроизведении. Однако может быть другой способ делать то, что вы хотите, полностью в Ansible.

Я не использовал его лично, но в Ansible 1.8 доступно кеширование фактов. Вкратце, с включенным кешированием фактов Ansible будет использовать сервер Redis для кэширования всех фактов о встречающихся хостах, и вы сможете ссылаться на них в последующих руководствах:

При включенном кэшировании фактов машина в одной группе может ссылаться на переменные о машинах в другой группе, несмотря на то, что они не были связаны в текущем выполнении / usr / bin / ansible-playbook.

person Bruce P    schedule 04.05.2015
comment
Спасибо за Ваш ответ. Это тоже было наше первое решение, но, похоже, кеширование фактов - пока единственное решение этой проблемы. Было бы неплохо иметь что-то, что может переопределить параметр limit для сбора фактов. - person tehK; 06.05.2015

Это по-прежнему кажется проблемой без чистого решения здесь в 2016 году, но более новые версии Ansible предлагают бэкэнд кеширования фактов «jsonfile», который кажется достойным компромиссом для локальной установки Redis только для удовлетворения этой потребности. Теперь я просто запускаю ansible all -m setup перед запуском playbook с опцией --limit. Достаточно хорошо для джаза!

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

person mwp    schedule 30.06.2016

Вы можете изменить свою книгу так, чтобы:

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

И когда вы запустите его, если some_var не определено (нормальное состояние), тогда он будет работать в default_group группе инвентаризации, НО если вы запустите его как:

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

Тогда он будет работать только на вашем myHost, но у вас все равно могут быть другие разделы с другими hosts: .. объявлениями, для сбора фактов или чего-то еще.

person Arik Kfir    schedule 01.08.2016
comment
это дублирование групп и параметра -l. [db:children] something-DB группируйте свои вещи и используйте группы. - person Deil; 25.03.2019