Aller au contenu
Infrastructure as Code medium

Modules wait_for et pause Ansible : synchronisation

10 min de lecture

Logo Ansible

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.

  • 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).
  • Notion de port TCP (le module wait_for: port: ne teste que TCP, pas UDP).

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: 10

Comportement : 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.

- name: Verifier que le port 9999 est BIEN libre
ansible.builtin.wait_for:
port: 9999
host: 127.0.0.1
state: stopped
timeout: 5

state: 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.

- 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: 10

Utile pour synchroniser avec un process asynchrone qui crée un flag-file en fin de traitement.

- name: Verifier qu un service a logge "Ready"
ansible.builtin.wait_for:
path: /var/log/messages
search_regex: 'systemd.*Started.*chronyd'
timeout: 30

Cas 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.

- name: Demarrer le service
ansible.builtin.systemd_service:
name: chronyd
state: restarted
- name: Pause de 5 secondes pour stabilisation
ansible.builtin.pause:
seconds: 5

pause: 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).
- 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) | bool

En CI : --extra-vars "confirm_required=false" saute la pause. En manuel : on demande confirmation.

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 failed

Mitigation :

  • Augmenter timeout: : si l’app peut prendre 60s, mettre timeout: 90.
  • Combiner avec until: sur uri: : tester un endpoint HTTP plutôt qu’un port TCP brut (cf. module uri).
- 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 sondage

Par 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.

SymptômeCauseFix
Timeout when waiting for port 323UDP testé en TCPwait_for: port: ne teste que TCP
Race condition au démarragewait_for: lancé trop tôtAugmenter timeout:, ou utiliser uri: until:
pause: bloque la CIPas de mode non-interactifConditionner avec `when: confirm_required
search_regex lentGros log lu à chaque pollUtiliser un fichier dédié plus petit
  • 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: sur wait_for: = à dimensionner avec marge (× 2 ou × 3 du temps attendu).

Cette page a un lab d’accompagnement : labs/modules-diagnostic/wait-for-pause/ dans stephrobert/ansible-training.

Challenge — sur db1.lab :

  1. Lancer en arrière-plan une commande qui crée un fichier après 3s.
  2. wait_for: path: pour attendre.
  3. pause: 1s pour stabilisation.
  4. wait_for: port: 22 (sshd, TCP).

Validation pytest+testinfra :

Fenêtre de terminal
ansible-playbook solution.yml
pytest -v labs/modules-diagnostic/wait-for-pause/challenge/tests/

4 tests vérifient marker, succès, et écoute sshd.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn