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