web-dev-qa-db-fra.com

Recharger l'inventaire dynamique d'Ansible

J'utilise Ansible pour configurer des instances EC2 et déployer une application. Il existe un script d'hôtes qui rassemble des informations sur les serveurs et les groupes liés aux tags. Je voudrais exécuter ces actions comme un seul playbook, donc

  1. De nouvelles instances sont créées si nécessaire
  2. Le script des hôtes charge l'inventaire (y compris les faits des serveurs)
  3. Le playbook de déploiement fonctionne

Cependant, l'inventaire est chargé à l'avance, il n'y a donc pas de données de serveurs/groupes si les serveurs sont créés/mis à jour pendant la lecture. Je peux 1) séparer les playbooks de provision et de déploiement 2) utiliser l'astuce add_Host pour émuler l'inventaire dynamique lorsque les serveurs sont mis à jour, mais il y a des inconvénients dans ces approches.

Puis-je forcer Ansible à recharger l'inventaire? Mes fichiers de test sont: hosts script:

#!/bin/sh
echo `date` >> log.log
echo "{\"standalone\":[\"localhost\"]}"

Échantillon playbook.yml:

---
- hosts: all
  tasks:
    - name: show inventory_hostname
      command: echo {{ inventory_hostname }}

Je l'exécute ansible-playbook -i hosts playbook.yml -v et voir deux exécutions:

$> cat log.log
Thu Mar 12 09:43:16 SAMT 2015
Thu Mar 12 09:43:16 SAMT 2015

mais je n'ai pas trouvé de commande pour le doubler.

45
Vladimir Chervanev

Avec Ansible 2.0+, vous pouvez actualiser votre inventaire en cours de partie en exécutant la tâche :

- meta: refresh_inventory
44
James Orenthal

J'ai trouvé le meta: refresh_inventory insuffisant.
J'ai dû ajouter un appel explicite à ec2.py --refresh-cache première.

 - nom: actualiser l'inventaire 
 hôtes: localhost 
 connexion: local 
 rassembler_facts: fausses 
 tâches: 
 - nom: actualiser EC2 cache 
 Commande: /etc/ansible/ec2.py --refresh-cache 
 - nom: Actualiser le cache EC2 en mémoire 
 Meta: refresh_inventory 
18
dsz

Ansible ne prend actuellement pas en charge cela. Si vous regardez le code source de ansible ou ansible-playbook vous verrez que l'inventaire est chargé en premier, puis l'objet d'inventaire est passé à la commande ansible qui exécute la tâche ou le playbook spécifié. Déplacer le traitement de l'inventaire afin qu'il se produise dans les gestionnaires de tâches/playbooks serait probablement une entreprise assez importante pour un certain nombre de raisons.

Votre meilleur pari lorsque vous faites quelque chose comme ça est de simplement diviser votre playbook en deux et d'envelopper leurs appels dans un script Shell que vous n'avez à invoquer qu'une seule fois.

7
Bruce P

Vous pouvez également modifier le fichier ec2.ini et définir l'option:

cache_max_age = 0

pour éviter la nécessité de recharger en vous assurant que rien n'est mis en cache en premier lieu.

1
fuzzygroup