Как указать разные хосты для разных плейбуков в одном скрипте

9

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

---
- include playbook_1.yml
    hosts: tag_postgres
- include: playbook_2.yml
    hosts: tag_rabbitmq

Я могу поместить все разные пьесы в один сценарий и вызвать, но тогда я не смогу повторно использовать некоторый set_fact из одной пьесы в другую, и, следовательно, много дублирования задач.

Еще одно следствие вопроса, могу ли я запустить ec2s на Амазонке, которая будет иметь

hosts: localhost

и конфигурация запущенных ec2, которые в основном будут настраивать инвентаризацию -i ec2.py, и хосты будут определены как

hosts: tag_<some_tag>

происходит через одну и ту же книгу или набор включенных книг (разные роли)?

Панкадж Лал
источник
знаете ли вы, что вы можете иметь более одного hosts:раздела в своем yaml и, по сути, иметь несколько списков игр, используя разные группы хостов в вашем инвентаре?
Йонси Солис

Ответы:

4

На самом деле, вы можете иметь более одного хоста: раздел для playbook. Похоже, что хозяева: начинает новую игру. См. , Например, http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ .

Как-то так у меня работает (ansible 2.2):

---
- hosts: localhost 
  connection: local
  roles:
    - { role: ec2,
        tag: 'master',
        instance_type: t2.2xlarge,
        count: 1
      }
  tasks:
  - shell: hostname # reports localhost

- hosts: tag_master
  tasks:
  - shell: hostname # reports instance(s) with tag 'master'

Итак, поместите hosts: вверху каждого включенного .yml, а не после include :.

Билл Уэлч
источник
4

http://docs.ansible.com/ansible/playbooks_variables.html#information-discovered-from-systems-facts

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

Факты - это информация, полученная от общения с вашими удаленными системами ...

Факты получены из ваших удаленных хостов. Так что это причина, по которой вы обычно можете обмениваться фактами между вашими разными хостами, когда в вашем файле * .yml есть несколько сборников .

Теперь вы можете получить доступ к фактам с других хостов, если вы сделаете что-то подобное в другой части своей книги:

{{ hostvars['server01.example.com']['ansible_eth0']['ipv4']['address'] }}
...
...
{{ hostvars[groups['servers'][0]]['ansible_eth0']['ipv4']['address'] }}

но в этом случае вам нужно помнить, что вам нужно получить факты, прежде чем использовать это. Затем вы можете настроить первую часть в своей игровой книге, чтобы получить все факты для всех хостов или использовать для этого кэширование фактов (см .: http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching ).

Теперь, если вы хотите обмениваться опциями в своих книгах, возможно, может быть лучше переосмыслить информацию для добавления в переменные, и, таким образом, вы можете «поделиться» вашими переменными с помощью одной и той же includeинструкции, посмотрите на это:

http://docs.ansible.com/ansible/playbooks_variables.html#variables-defined-from-included-files-and-roles

Йонси Солис
источник
2
Мой вопрос был очень специфичен для хостов, а не для переменных вообще. Моя потребность в том, чтобы иметь возможность создать основную книгу воспроизведения, в которой нет хоста, но каждая включенная книга воспроизведения либо содержит хост, либо может быть предоставлена ​​ему в качестве параметра. Я всегда могу запустить их как отдельные сборники, но тогда факты, полученные в одном, не переносят в следующий, и поэтому существует большая избыточность
Pankaj Lal
еще раз прочитайте выше, пожалуйста: «Теперь вы можете получить доступ к фактам с других хостов, если вы делаете что-то подобное в другой части вашей книги: ... но в этом случае вам нужно помнить, что вам нужно получить факты, прежде чем использовать это «так, да, вы можете поделиться своими фактами между включенными пьесами в вашей главной пьесе.
Йонси Солис