
Deux modules pour la synchronisation temporelle dans un play :
ansible.builtin.wait_for:= attendre une condition (port ouvert, fichier créé, regex dans un fichier, machine SSH-prête). Sondage actif.ansible.builtin.pause:= attendre un délai fixe (secondes/minutes) ou demander une confirmation interactive à l’opérateur.
wait_for: est le bon choix dans 90% des cas — sondage actif jusqu’à condition vraie. pause: est utile pour des délais incompressibles ou des confirmations humaines.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Attendre l’ouverture d’un port TCP (cas le plus courant).
- Attendre la fermeture d’un port (
state: stopped). - Attendre l’apparition d’un fichier ou d’une regex dans un fichier.
- Pause simple (
seconds:) ou interactive (prompt:). - Diagnostiquer un timeout
wait_for:(mauvais host, port firewallé, race condition).
Prérequis
Section intitulée « Prérequis »- Notion de port TCP (le module
wait_for: port:ne teste que TCP, pas UDP).
wait_for: port: — le pattern n°1
Section intitulée « wait_for: port: — le pattern n°1 »Cas typique : après démarrage d’un service, attendre que le port soit prêt avant les tâches qui en dépendent.
- name: Demarrer chronyd ansible.builtin.systemd_service: name: chronyd state: started
- name: Attendre que sshd reponde sur 22 ansible.builtin.wait_for: port: 22 host: 127.0.0.1 timeout: 10Comportement : wait_for: polle (par défaut toutes les secondes) jusqu’à ce que le port soit ouvert, ou échoue après timeout: secondes.
host: par défaut = 127.0.0.1. Pour tester un port d’un autre host depuis le managed node, spécifier host: 10.10.20.21.
state: stopped — attendre la fermeture
Section intitulée « state: stopped — attendre la fermeture »- name: Verifier que le port 9999 est BIEN libre ansible.builtin.wait_for: port: 9999 host: 127.0.0.1 state: stopped timeout: 5state: stopped = succès si le port est libre. Pratique avant de démarrer un service — vérifier que rien d’autre n’utilise le port.
wait_for: path: — apparition d’un fichier
Section intitulée « wait_for: path: — apparition d’un fichier »- name: Lancer une commande qui crée un fichier en arriere-plan ansible.builtin.shell: | ( sleep 3 && touch /tmp/marker.txt ) &
- name: Attendre que le fichier apparaisse ansible.builtin.wait_for: path: /tmp/marker.txt timeout: 10Utile pour synchroniser avec un process asynchrone qui crée un flag-file en fin de traitement.
wait_for: search_regex: — chercher une regex
Section intitulée « wait_for: search_regex: — chercher une regex »- name: Verifier qu un service a logge "Ready" ansible.builtin.wait_for: path: /var/log/messages search_regex: 'systemd.*Started.*chronyd' timeout: 30Cas d’usage : attendre le log “Server ready” d’une app, “Database initialized”, etc.
Limitation : wait_for: search_regex: lit le fichier à chaque poll — sur un log de plusieurs Go, c’est lent.
pause: seconds: — délai fixe
Section intitulée « pause: seconds: — délai fixe »- name: Demarrer le service ansible.builtin.systemd_service: name: chronyd state: restarted
- name: Pause de 5 secondes pour stabilisation ansible.builtin.pause: seconds: 5pause: seconds: = sleep simple. Pas adaptatif (5s même si le service est prêt en 1s). Préférer wait_for: quand une condition précise existe.
Quand préférer pause: :
- Pas de condition précise mesurable.
- Délai imposé par un système externe (cool-down API).
pause: prompt: — confirmation interactive
Section intitulée « pause: prompt: — confirmation interactive »- name: Confirmation manuelle avant migration BDD ansible.builtin.pause: prompt: | Vous allez lancer la migration de la base de production. Tapez ENTER pour continuer, Ctrl+C pour annuler.Ansible bloque le play en attendant une touche. Cas d’usage : opérations critiques où un humain doit valider.
Pattern CI/CD : conditionner la pause au mode interactif :
- ansible.builtin.pause: prompt: "Confirmer la migration ?" when: confirm_required | default(false) | boolEn CI : --extra-vars "confirm_required=false" saute la pause. En manuel : on demande confirmation.
Le piège : race condition au démarrage
Section intitulée « Le piège : race condition au démarrage »Ansible peut lancer un service via systemd_service: et passer immédiatement à wait_for: port: — sans attendre que systemd ait réellement démarré le binaire.
# ❌ Race condition possible- ansible.builtin.systemd_service: name: myapp state: started
- ansible.builtin.wait_for: port: 8080 timeout: 30 # Si myapp met 35s a demarrer → wait_for failedMitigation :
- Augmenter
timeout:: si l’app peut prendre 60s, mettretimeout: 90. - Combiner avec
until:sururi:: tester un endpoint HTTP plutôt qu’un port TCP brut (cf. module uri).
Sondage espacé sur services lents
Section intitulée « Sondage espacé sur services lents »- name: Attendre un service lent (poll moins frequent) ansible.builtin.wait_for: port: 8080 timeout: 300 delay: 10 # Attendre 10s avant le 1er sondage sleep: 5 # 5s entre chaque sondagePar défaut, wait_for: sonde toutes les secondes dès le départ. Sur un service très lent (Docker registry, base de données), c’est trop. delay: retarde le 1er sondage. sleep: espace les sondages suivants.
Pièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
Timeout when waiting for port 323 | UDP testé en TCP | wait_for: port: ne teste que TCP |
| Race condition au démarrage | wait_for: lancé trop tôt | Augmenter timeout:, ou utiliser uri: until: |
pause: bloque la CI | Pas de mode non-interactif | Conditionner avec `when: confirm_required |
search_regex lent | Gros log lu à chaque poll | Utiliser un fichier dédié plus petit |
À retenir
Section intitulée « À retenir »wait_for:= sondage actif jusqu’à condition vraie.port:+state: started/stopped= test de port TCP (pas UDP).path:= attendre l’apparition d’un fichier.search_regex:= chercher une chaîne dans un fichier (lent sur gros logs).pause: seconds:= sleep simple, non adaptatif.pause: prompt:= confirmation interactive humaine.timeout:surwait_for:= à dimensionner avec marge (× 2 ou × 3 du temps attendu).
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/modules-diagnostic/wait-for-pause/ dans stephrobert/ansible-training.
Challenge — sur db1.lab :
- Lancer en arrière-plan une commande qui crée un fichier après 3s.
wait_for: path:pour attendre.pause:1s pour stabilisation.wait_for: port: 22(sshd, TCP).
Validation pytest+testinfra :
ansible-playbook solution.ymlpytest -v labs/modules-diagnostic/wait-for-pause/challenge/tests/4 tests vérifient marker, succès, et écoute sshd.