Ansible - 7 Conditions et boucles dans Ansible : when et loop

Un même playbook doit souvent fonctionner sur plusieurs systèmes. Les conditions permettent de choisir la tâche adaptée à chaque machine. Cette leçon montre comment utiliser when, combiner des conditions avec or et and, puis répéter une tâche sur une liste grâce à loop.

Exécuter une tâche selon le système

Les familles de Linux n'utilisent pas le même gestionnaire de paquets. Les systèmes de la famille Debian utilisent apt, et ceux de la famille Red Hat utilisent yum.

La directive when indique la condition à remplir pour exécuter la tâche. La variable ansible_os_family contient la famille du système. Pour comparer deux valeurs, on utilise le double signe égal.

- name: Installer le paquet sur les systèmes Debian
  apt:
    name: <nom-du-paquet>
  when: ansible_os_family == "Debian"

Combiner des conditions avec or et and

Le mot-clé or demande qu'au moins une des deux conditions soit vraie. Il sert, par exemple, à utiliser une même tâche pour deux familles de systèmes.

Le mot-clé and exige que les deux conditions soient vraies en même temps. Avec apt, on cible uniquement la famille Debian.

En pratique, or convient quand plusieurs cas doivent déclencher la même tâche. and convient quand la tâche ne doit s'exécuter que si toutes les conditions sont réunies.

Répéter une tâche avec loop

Plutôt que d'écrire une tâche par paquet, on déclare une liste de paquets. Chaque élément porte un nom et une propriété indiquant s'il doit être installé.

La directive loop répète la tâche pour chaque élément. Le nom de l'élément courant s'écrit item.name. La condition when peut aussi porter sur item, pour ne traiter que certains éléments.

Une liste de paquets évite de répéter le même bloc pour chaque logiciel. Le playbook reste lisible, même avec de nombreux paquets à installer.

Utiliser le résultat d'une tâche précédente

Une tâche peut utiliser le résultat d'une tâche précédente. Le mot-clé register enregistre ce résultat dans une variable. La vidéo prend l'exemple de la vérification de l'état d'un service, suivie de l'envoi d'un email en cas de panne.

La méthode find recherche une chaîne et renvoie sa position, ou -1 si elle n'est pas trouvée. Si le résultat contient le mot down, la condition est vraie et l'email est envoyé.

when: result.stdout.find('down') != -1

En résumé

when exécute une tâche seulement si la condition est vraie. Les mots-clés or et and combinent plusieurs conditions. loop répète une tâche sur une liste, et register conserve un résultat pour les tâches suivantes.

Points clés

  • when exécute une tâche uniquement si la condition est vraie.
  • Le double signe égal sert à comparer deux valeurs.
  • or demande qu'une condition au moins soit vraie, and demande que les deux le soient.
  • loop répète une tâche pour chaque élément d'une liste.
  • register conserve le résultat d'une tâche pour la suivante.
  • find renvoie -1 quand la chaîne n'est pas trouvée.

Questions fréquentes

Pourquoi utiliser == et non un seul signe égal ?

Le signe égal simple affecte une valeur. Pour comparer deux valeurs dans une condition, on utilise le double signe égal.

Que renvoie find si la chaîne n'est pas trouvée ?

La méthode renvoie -1. Il faut donc tester si le résultat est différent de -1 pour savoir qu'elle est présente.

Quelle différence entre when et loop ?

when décide si une tâche s'exécute. loop répète la tâche pour chaque élément d'une liste.