Como especificar hosts diferentes para playbooks diferentes em um script ansible

9

Pelo que entendi, cada playbook recebe uma entrada de hosts. Quero saber que, se eu criar um manual de contêineres que inclui outros manuais, posso parametrizar os hosts de cada manual de instruções. Então, algo como

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

Consigo colocar todos os playbooks diferentes em um script e chamada, mas dessa forma não consigo reutilizar alguns set_fact de um playbook para outro e, portanto, há muita duplicação de tarefas.

Outro corolário da questão é: posso lançar ec2s na amazon que teria

hosts: localhost

e configuração dos ec2s lançados, que basicamente configurariam o inventário -i ec2.pye teriam hosts especificados como

hosts: tag_<some_tag>

acontecendo através do mesmo manual ou de um conjunto de manuais incluídos (papéis diferentes)?

Pankaj Lal
fonte
você sabia que pode ter mais de uma hosts:seção no yaml e, em essência, possui vários manuais usando diferentes grupos de hosts em seu inventário?
Yonsy Solis 29/07/19

Respostas:

4

Na verdade, você pode ter mais de um host: seção por manual. Parece que um anfitrião: inicia uma nova peça. Consulte http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ , por exemplo.

Algo assim funciona para mim (versão 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'

Então, coloque hosts: no topo de cada .yml incluído, não depois do include :.

Bill Welch
fonte
4

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

... Há outros lugares de onde as variáveis ​​podem vir, mas esse é um tipo de variável descoberta, que não é definida pelo usuário.

Fatos são informações derivadas da conversação com seus sistemas remotos ...

Os fatos são derivados de seus hosts remotos. Portanto, esse é o motivo pelo qual normalmente você pode compartilhar fatos entre seus diferentes hosts quando o seu arquivo * .yml tiver vários manuais .

Agora, você pode acessar fatos de outros hosts se fizer algo assim em outra parte do seu manual:

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

mas, nesse caso, você precisa se lembrar de que precisa obter os fatos antes de usá-lo. Em seguida, você pode configurar uma primeira parte do seu manual que obtenha todos os fatos de todos os hosts ou use o cache de fatos para isso (consulte: http://docs.ansible.com/ansible/playbooks_variables.html#fact-caching )

Agora, se você gosta de compartilhar opções em seus playbooks, talvez seja melhor repensar as informações para inserir variáveis ​​e, com isso, você pode "compartilhar" suas variáveis ​​com a mesma includeinstrução, veja o seguinte:

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

Yonsy Solis
fonte
2
Minha pergunta era muito específica para hosts, e não variáveis ​​em geral. Minha necessidade é ser capaz de criar um manual mestre que não possua um host, mas cada manual incluído contém um host ou pode ser fornecido como parâmetro. Eu sempre pode executá-los como playbooks separadas, mas fatos, então, obtido em um não levar adiante para a próxima e assim não há um monte de redundância
Pankaj Lal
leia acima novamente, por favor: "Agora, você pode acessar fatos de outros hosts se fizer algo assim em outra parte do seu manual: ... mas, neste caso, você deve se lembrar que precisa obter os fatos antes de usar isto ", sim, você pode compartilhar seus fatos entre os manuais incluídos no manual mestre.
Yonsy Solis