Les tâches répétitives dans la gestion de systèmes peuvent être fastidieuses et sujettes à des erreurs.
L’absence d’automatisation peut conduire à des inefficacités et à une gestion suboptimale des ressources.
Cet article explore comment les boucles en Ansible peuvent automatiser ces tâches, améliorant ainsi l’efficacité et la précision.
Devenez un expert d'Ansible et simplifiez vos tâches d'administration.

Boucles Ansible : Introduction
Les boucles en Ansible permettent de répéter une tâche sous condition plusieurs fois avec différentes valeurs. Voici un visuel résumant le fonctionnement d’une boucle
En Ansible, il existe plusieurs methode de generer une boucle, Voici quelques-unes des boucles les plus couramment utilisées en Ansible :
Boucles de base avec loop :
La méthode la plus courante pour créer des boucles en Ansible est d’utiliser le mot clé loop. Voici un exemple :
- name: Installer plusieurs paquets
apt:
name: "{{ item }}"
state: present
loop:
- git
- curl
- vim
Dans cet exemple, la tâche apt sera exécutée trois fois, une fois pour chaque élément de la liste.
Boucles avec « with_items » :
Une méthode plus ancienne mais toujours utilisée est with_items , voici un exemple :
- name: Créer plusieurs utilisateurs
user:
name: "{{ item }}"
state: present
with_items:
- alice
- bob
- charlie
Ce playbook permet d’exécuter la tache trois fois pour créer les utilisateurs dans la liste.
Boucles avec des dictionnaires :
Nous pouvons également utiliser des boucles avec des dictionnaires pour passer plusieurs paramètres :
- name: Ajouter plusieurs utilisateurs avec des détails
user:
name: "{{ item.name }}"
state: present
uid: "{{ item.uid }}"
group: "{{ item.group }}"
loop:
- { name: 'alice', uid: 1001, group: 'admins' }
- { name: 'bob', uid: 1002, group: 'users' }
- { name: 'charlie', uid: 1003, group: 'guests' }
Cette boucle est similaire à la boucle with_items , mais il y a plusieurs paramètres correspondant aux valeurs des clés du dictionnaire
Boucles avec des séquences de nombres :
Pour générer une séquence de nombres, nous pouvons utiliser la fonction range :
- name: Créer plusieurs fichiers
file:
path: "/tmp/file{{ item }}"
state: touch
loop: "{{ range(1, 6) }}"
La fonction range permet de créer un fichier allant de 1 jusqu’à 6
L’ajout de contrôle aux boucles en Ansible permet de définir des conditions spécifiques pour chaque itération de la boucle, de gérer les erreurs, et de contrôler le flux d’exécution. Un exemple :
- name: Installer des paquets uniquement s'ils ne sont pas déjà installés
apt:
name: "{{ item }}"
state: present
loop:
- git
- curl
- vim
when: item not in ansible_facts.packages
Le contrôle consiste à vérifier si le paquet à installer n’est pas déjà présent sur notre machine. Nous pouvons intégrer ce contrôle dans tous les types de boucles en utilisant des conditions spécifiques.
Boucles Ansible : Utilisation
Dans cet exercice, nous allons utiliser des boucles pour exécuter des tâches. La première tâche consiste à afficher une liste de nombres dans une variable. La deuxième tâche consiste à afficher un message d’erreur lorsque le code de retour d’un résultat est différent de 0. Essayons de résoudre l’exercice par nous-mêmes. Sinon, voyons le playbook pour ces tâches maintenant :
– hosts: servers
tasks:
– name: Register loop output as a variable
shell:
cmd: « echo{{item}} »
loop:
– « un »
– « deux »
register: numbers
– name: Fail if return code is not 0
ansible.builtin.fail
msg: « This command({{item.cmd}}) did not have a 0 return code »
when : item.rc !=0
loop: « {{numbers.results}} »
Première tâche : Enregistrer la sortie de la boucle comme une variable :
name : Donne un nom à la tâche, ce qui la rend plus facile à identifier dans la sortie du playbook.
shell : Utilise le module shell pour exécuter une commande shell.
cmd : Spécifie la commande à exécuter, ici echo {{item}} où {{item}} sera remplacé par chaque élément de la boucle.
loop : Définit une boucle sur la liste d’éléments [« un », « deux »].
register : Enregistre la sortie de la tâche sous la variable numbers. Cette variable contiendra les résultats de chaque itération de la boucle.
Deuxième tâche : Échec si le code de retour n’est pas 0 :
name : Donne un nom à la tâche pour identification.
ansible.builtin.fail: Utilise le module fail pour arrêter l’exécution du playbook avec un message d’erreur si une condition spécifiée est remplie.
msg : Le message d’erreur affiché lorsque la tâche échoue. {{item.cmd}} se réfère à la commande exécutée lors de la première tâche.
when : Spécifie une condition pour exécuter cette tâche. Ici, la tâche ne s’exécute que si item.rc (le code de retour de la commande) n’est pas égal à 0.
loop : Itère sur les résultats enregistrés dans numbers.results.
Copions ce playbook dans un fichier exo_boucle.yml pour pouvoir l’executer
Exécutons ce playbook maintenant pour exécuter aussi les taches dedans avec la commande :ansible-playbook -v exo_boucle.yml –become
Ça semble parfait, le résultat nous affiche la liste des valeurs « un » et « deux » pour la première tâche, et il exécute également la deuxième tâche car la valeur retournée est différente de 0. Parfait, tout fonctionne bien maintenant dans ce playbook.
Loop vs With_Items en Ansible
En Ansible, loop et with_* sont deux méthodes différentes pour itérer à travers des éléments, comme des listes, des dictionnaires, des fichiers, etc. Voici une comparaison entre loop et with_* avec des exemples pour mieux comprendre leur utilisation.
Utilisation de loop :
- name: Copier tous les fichiers .txt
copy:
src: "{{ item }}"
dest: /tmp/
loop: "{{ lookup('fileglob', '*.txt', wantlist=True) }}"
lookup(‘fileglob’, ‘*.txt’, wantlist=True): Cette expression récupère tous les fichiers . txt dans le répertoire courant et retourne une liste.
loop: « {{ … }} »: Utilise cette liste comme source d’itération pour la tâche copy.
Avantages de loop :
- Direct et simple à utiliser pour itérer sur des listes générées dynamiquement.
- Permet de manipuler directement chaque élément de la liste dans la tâche.
Utilisation de with_fileglob :
- name: Copier tous les fichiers .txt
copy:
src: "{{ item }}"
dest: /tmp/
with_fileglob: '*.txt'
with_fileglob: ‘*.txt’: Spécifie directement le modèle de recherche pour récupérer tous les fichiers .txt dans le répertoire courant.
Avantages de with_fileglob :
- Plus concis lorsque vous avez juste besoin de spécifier un modèle de fichier à traiter.
- Moins de syntaxe nécessaire par rapport à lookup avec loop.
Passons maintenant au cas pratique pour mieux comprendre la boucle en Ansible.Premièrement, nous allons utiliser loop avec cet playbook :
- hosts: servers
tasks:
- name: Restart services
service:
name: "{{item.name}}"
state: "{{item.status}}"
loop:
- name: apache2
status: Restarted
- name: ssh
status : started
Donc, il faut créer le fichier loop-playbook.yml sur le nœud de contrôle et y copier ce contenu.
Voilà, exécutons ce playbook avec la commande : ansible-playbook -v loop-playbook.yml
Le résultat montre clairement que les tâches sont exécutées une après l’autre dans l’ordre défini dans la liste de bouclage (loop).
Prenons une autre boucle qui est le dictionnaire. On fait la même chose dans le fichier dictionnaire-playbook.yml avec le contenu suivant :
- hosts: servers
tasks:
- name: Restart services
service:
name: "{{item.name}}"
state: Restarted
loop:
- {name: 'apache2'}
- {name: 'uuidd'}
Exécutons ce playbook avec la commande habituelle ansible-playbook -v dictionnaire-playbook.yml –become , et observons le résultat attendu affiché comme ceci
Voilà, les deux tâches sont exécutées dans l’ordre défini par la boucle.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment utiliser les boucles de base en Ansible ?
Quelle est la différence entre loop et with_items en Ansible ?
Comment intégrer du contrôle dans les boucles Ansible ?
Comment utiliser les boucles avec des dictionnaires en Ansible ?
Comment fonctionne la fonction range dans les boucles Ansible ?
Conclusion
En utilisant les boucles en Ansible, vous pouvez automatiser efficacement des tâches complexes et répétitives. Quelle technique de boucle trouvez-vous la plus utile dans vos projets Ansible?