web-dev-qa-db-fra.com

Comment spécifier différents hôtes pour différents playbooks dans un script ansible

Si je comprends bien, chaque playbook prend une entrée d'hôtes. Je veux savoir que si je crée un playbook conteneur qui inclut d'autres playbooks, puis-je paramétrer les hôtes pour chaque playbook inclus. Donc quelque chose comme

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

Je suis capable de mettre tous les playbooks différents dans un script et un appel, mais de cette façon, je ne suis pas en mesure de réutiliser certains set_fact d'un playbook dans un autre et il y a donc beaucoup de duplication de tâches.

Un autre corollaire de la question est, puis-je lancer ec2s sur Amazon qui aurait

hosts: localhost

et la configuration des ec2 lancés, qui configureraient essentiellement l'inventaire à partir de -i ec2.py, et ont des hôtes spécifiés comme

hosts: tag_<some_tag>

se passe-t-il par le même livre de jeu ou un ensemble de livres de jeu inclus (différents rôles)?

9
Pankaj Lal

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

... Il y a d'autres endroits d'où peuvent provenir des variables, mais ce sont des types de variables qui sont découverts, non définis par l'utilisateur.

Les faits sont des informations dérivées de la conversation avec vos systèmes distants ...

Les faits proviennent de vos hôtes distants. C'est donc la raison pour laquelle normalement vous pouvez partager des faits entre vos différents hôtes lorsque votre *. Yml Le fichier a plusieurs playbooks .

Maintenant, vous pouvez accéder aux faits d'autres hôtes si vous faites quelque chose comme ça dans une autre partie de votre livre de jeu:

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

mais dans ce cas, vous devez vous rappeler que vous devez obtenir les faits avant de l'utiliser. Ensuite, vous pouvez configurer une première partie de votre playbook qui obtient tous les faits pour tous les hôtes ou utiliser la mise en cache des faits pour cela (voir: http://docs.ansible.com/ansible/playbooks_variables.html#fact- mise en cache )

Maintenant, si vous aimez partager des options dans vos playbooks, il peut être préférable de repenser les informations à mettre dans les variables et, avec cela, vous pouvez "partager" vos variables avec la même instruction include, regardez ceci:

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

4
Yonsy Solis

En fait, vous pouvez avoir plus d'un hôte: section par playbook. Il semble qu'un hôte: démarre une nouvelle pièce. Voir http://www.tecmint.com/use-ansible-playbooks-to-automate-complex-tasks-on-multiple-linux-servers/ , par exemple.

Quelque chose comme ça fonctionne pour moi (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'

Donc, mettez les hôtes: en haut de chaque .yml inclus, pas après l'include:.

4
Bill Welch