Aller au contenu
English
English
Infrastructure as Code medium

Modules utilitaires Ansible : debug, setup, add_host, group_by, wait_for_connection

30 min de lecture

Logo Ansible

Cinq modules utilitaires servent de briques transversales dans les playbooks : afficher une variable (debug), collecter les facts (setup), ajouter un hôte dynamique (add_host), regrouper par caractéristique (group_by), attendre la reconnexion SSH (wait_for_connection).

Ils n'apparaissent pas dans une section thématique unique parce qu'ils traversent toutes les sections, fichiers, paquets, services, réseau. Cette page les regroupe pour les avoir sous la main.

  • Afficher une variable ou un message via debug:.
  • Collecter un sous-ensemble de facts avec gather_subset:.
  • Construire un inventaire dynamique au fil du play.
  • Grouper des hôtes selon un fact pour cibler un play suivant.
  • Attendre la reconnexion SSH après reboot ou provisioning.
- name: Afficher un message simple
ansible.builtin.debug:
msg: "Deploiement OK pour {{ inventory_hostname }}"
- name: Afficher la valeur d'une variable
ansible.builtin.debug:
var: ansible_facts.default_ipv4.address
- name: Afficher plusieurs lignes
ansible.builtin.debug:
msg:
- "User : {{ ansible_user }}"
- "IP : {{ ansible_default_ipv4.address }}"

var: vs msg:, var: accepte un nom de variable (sans {{ }}), msg: accepte une expression Jinja. Mélanger les deux est l'erreur la plus fréquente.

verbosity: 2 : n'affiche que si -vv ou plus, utile pour des logs verbeux sans polluer les runs normaux.

Par défaut, gather_facts: true au niveau du play appelle setup automatiquement. Mais on peut le rappeler manuellement ou filtrer :

- name: Collecter uniquement le hardware et le system
ansible.builtin.setup:
gather_subset:
- hardware
- system
- name: Tout sauf le reseau et la virtualisation
ansible.builtin.setup:
gather_subset:
- '!network'
- '!virtual'

Subsets utiles : min (minimum), hardware, network, virtual, mounts, pkg_mgr, service_mgr. Exclure avec ! réduit le temps de collecte sur grands parcs (passe de 3-5s à < 1s).

Pattern fréquent : provisionner une VM via Terraform/cloud, récupérer son IP, l'ajouter à l'inventaire dans le même run.

- name: Recuperer l'IP de la nouvelle VM
ansible.builtin.command: terraform output -raw new_vm_ip
register: vm_ip
delegate_to: localhost
- name: Ajouter la VM a l'inventaire dynamique
ansible.builtin.add_host:
name: new-web
groups: webservers
ansible_host: "{{ vm_ip.stdout }}"
ansible_user: ec2-user
- name: Configurer la nouvelle VM
hosts: new-web
tasks:
- name: Installer nginx
ansible.builtin.package:
name: nginx
state: present

add_host: ne persiste pas, l'hôte n'existe que pour le run en cours. Pour le persister, écrire le résultat dans inventory/hosts via template: ou lineinfile:.

- name: Grouper par famille d'OS
ansible.builtin.group_by:
key: "os_{{ ansible_facts.os_family }}"

Résultat : Ansible crée à la volée des groupes os_RedHat, os_Debian, etc. Un play suivant peut cibler hosts: os_RedHat directement, sans toucher l'inventaire.

- name: Grouper par nombre de coeurs
ansible.builtin.group_by:
key: "cpu_{{ ansible_facts.processor_cores }}"

Cas d'usage typique : déployer une config différente selon la classe d'hôte (faible/forte CPU, prod/staging, AZ cloud) sans dupliquer l'inventaire.

Différent de wait_for : wait_for_connection utilise la méthode de connexion Ansible (SSH, WinRM, local) plutôt que de tester un port nu.

- name: Reboot
ansible.builtin.reboot:
- name: Attendre que SSH reponde reellement
ansible.builtin.wait_for_connection:
delay: 10
timeout: 300
sleep: 5

Avantage sur wait_for: port: 22 : wait_for_connection valide toute la chaîne (SSH up + auth fonctionnelle + Python disponible), pas juste le port TCP. Plus fiable après un reboot ou un provisioning cloud.

Ces cinq symptômes partagent un trait : la tâche réussit et le playbook continue, ce qui rend le défaut invisible jusqu'au jeu suivant. Les deux premiers relèvent de la variable attendue, absente ou trop coûteuse à collecter ; les trois derniers viennent du moment où l'inventaire est résolu, avant les tâches qui prétendent le modifier.

SymptômeCauseFix
debug: var: affiche VARIABLE IS NOT DEFINEDVariable mal référencéeUtiliser default('') ou tester is defined
gather_facts: true lent (> 5s)Collecte complète sur grand parcgather_subset: ['!all', 'min']
add_host: invisible au play suivantPlays dans le même fichier mais sans meta: refresh_inventoryAjouter meta: refresh_inventory ou nouveau play
wait_for_connection timeout malgré SSH OKAuth method changée pendant le rebootVérifier ansible_user et clés SSH
group_by crée le groupe mais play suivant videPlay déjà parti, groupes appliqués au play suivantMettre le group_by dans un play séparé

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  • debug: = var: pour une variable, msg: pour une expression. verbosity: filtre par -v level.
  • setup: gather_subset: = collecte sélective, majeure sur grand parc.
  • add_host: = ajout volatil pour ce run, parfait après provisioning cloud.
  • group_by: = groupes dynamiques sur facts, sans toucher l'inventaire.
  • wait_for_connection: > wait_for: port: 22 après un reboot, valide toute la chaîne.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn