2015-05-04 2 views
15

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

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

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

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

ответ

9

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

- hosts: all 
    tasks: [ ] 

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

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

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

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

+2

Спасибо за ваш ответ. Это было наше первое решение, но, похоже, кэширование на самом деле является единственным решением этой проблемы. Было бы неплохо иметь что-то, что может переопределить предельный параметр для сбора фактов. – tehK

5

Это все еще кажется, что проблема без чистого раствора здесь в 2016 году, но более новые версии анзибль предлагают «jsonfile» факт кэширования бэкенд, который, кажется, достойный компромисс установки Redis локально только для решения этой проблемы необходимость. Теперь я просто запускаю ansible all -m setup перед запуском playbook с опцией --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: .., для сбора фактов или всего остального.

4

Ansible version 2 представил чистый, официальный способ сделать это с помощью делегированных фактов (см .: http://docs.ansible.com/ansible/latest/playbooks_delegation.html#delegated-facts).

--- 
# This play will still work as intended if called with --limit 

- 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" 
Смежные вопросы