58 votes

Comment accéder à la variable d'hôte d'un hôte différent avec Ansible ?

Supposons que j'ai un hôte qui collecte des données et
qui est dans un groupe [collectors]. J'ai aussi des hôtes dans le groupe [reporters].
Donc, je veux définir une variable sur les reporters à partir de l'adresse IP groups['collectors'][0]. Mais le playbook pour configurer les reporters ne s'exécute pas sur le groupe [collectors], donc les faits pour cet hôte ne sont pas collectés. Existe-t-il un moyen de ne pas coder en dur l'adresse IP ?

108voto

ADickens Points 1

Vous pouvez accéder à presque tous les faits/variables de l'inventaire en faisant quelque chose comme ceci :

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

ou, si vous préférez le faire via un index dans un groupe :

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

Le truc principal est que vous devez collecter les faits pour tous les hôtes/groupes qui vous intéressent. Vous voudriez donc modifier votre playbook qui s'exécute contre le groupe de reporters pour inclure une tâche no-op (factice) qui est appliquée au groupe de collecteurs. Cela forcera Ansible à collecter des faits sur les hôtes collecteurs afin qu'ils puissent être accédés à partir du groupe de reporters. Vous voudrez donc ajouter quelque chose comme ceci au début de votre playbook de reporters :

- hosts: collectors
  name: Rassembler les faits des collecteurs
  tasks: [ ]

Les crochets vides signifient essentiellement qu'aucune tâche ne sera exécutée, mais cela forcera quand même Ansible à collecter des faits sur les collecteurs afin que vous puissiez ensuite les référencer dans les tâches que vous exécutez contre vos reporters.

Éditer #1

Il m'est venu à l'esprit que je devrais également mentionner qu'à partir de la version 1.8 d'Ansible, il existe une fonctionnalité de mise en cache des faits désormais disponible. La mise en cache des faits repose sur un serveur redis pour stocker les faits entre les exécutions de playbook. Avec cette fonction activée, un playbook peut référencer des faits qui ont été obtenus par un autre playbook qui a été exécuté précédemment. L'exemple donné dans la documentation d'Ansible :

Imaginez, par exemple, une très grande infrastructure avec des milliers d'hôtes. La mise en cache des faits pourrait être configurée pour s'exécuter chaque nuit, mais la configuration d'un petit ensemble de serveurs pourrait être exécutée de manière ad-hoc ou périodique tout au long de la journée. Avec la mise en cache des faits activée, il ne serait pas nécessaire de "redemander" à tous les serveurs pour référencer des variables et des informations à leur sujet.

3 votes

Y a-t-il un moyen de définir un index associatif en tant que variable ? par exemple ansible localhost --extra-vars "metamorphosis_ip=172.16.3.73" -a "echo {{ hostvars[{{ metamorphosis_ip }}]['inv_domain'] }} "

0 votes

Pour ajouter à la réponse ci-dessus, assurez-vous de faire référence à la FAQ Ansible ici : docs.ansible.com/ansible/faq.html qui explique en détail des choses, comme la boucle sur un groupe d'hôtes ou le paramétrage d'une variable pour obtenir un hôte spécifique dans un groupe.

0 votes

Merci pour l'idée de récupérer des faits à partir d'un nœud avec une liste de tâches vide.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X