Skip to main content

Résumé pratique 05 - Les boucles dans Ansible

📝 Introduction​

Dans ce chapitre, nous allons explorer l'utilisation des boucles dans Ansible pour automatiser des tâches répétitives de manière efficace. Les boucles vous permettent d'exécuter une action plusieurs fois sans avoir à répéter manuellement le code pour chaque élément. Cette fonctionnalité est particulièrement utile pour :

  • Créer ou gérer plusieurs utilisateurs.
  • Déployer des configurations sur plusieurs serveurs ou fichiers.
  • Automatiser des tâches sur des listes d'éléments.

📋 Table des Matières​

  1. Étape Préparatoire : Création du Dossier de Travail
  2. Configurer l'Inventaire Ansible
  3. Partie 1 : Boucler sur une Liste
  4. Partie 2 : Boucler sur une Liste de Dictionnaires
  5. Partie 3 : Boucler sur un Dictionnaire
  6. Partie 4 : Boucler sur une Plage de Nombres
  7. Partie 5 : Boucler sur les Hôtes de l'Inventaire
  8. Partie 6 : Utiliser une Pause dans une Boucle
  9. Conclusion

📂 Étape Préparatoire : Création du Dossier de Travail​

  1. Créer un dossier pour le projet Ansible :

    mkdir ansible_project_loops

    Ce dossier ansible_project_loops servira à stocker tous les fichiers et playbooks nécessaires pour cette pratique.

  2. Naviguer dans le dossier :

    cd ansible_project_loops

🗂️ Configurer l'Inventaire Ansible​

  1. Créer un fichier inventory.ini pour définir les nœuds :

    nano inventory.ini
  2. Ajouter les informations des nœuds :

    [node_containers]
    node1 ansible_host=172.20.0.2 ansible_user=root ansible_python_interpreter=/usr/bin/python3
    node2 ansible_host=172.20.0.3 ansible_user=root ansible_python_interpreter=/usr/bin/python3
    node3 ansible_host=172.20.0.4 ansible_user=root ansible_python_interpreter=/usr/bin/python3
    node4 ansible_host=172.20.0.5 ansible_user=root ansible_python_interpreter=/usr/bin/python3
    node5 ansible_host=172.20.0.6 ansible_user=root ansible_python_interpreter=/usr/bin/python3
    node6 ansible_host=172.20.0.7 ansible_user=root ansible_python_interpreter=/usr/bin/python3

    Remarque : L'ajout de ansible_python_interpreter=/usr/bin/python3 permet d'éviter les avertissements liés à la découverte automatique de l'interpréteur Python.

  3. Enregistrer et quitter l'éditeur.


📝 Partie 1 : Boucler sur une Liste​

Étape 1 : Écrire un Playbook pour Afficher les Éléments d'une Liste​

  1. Créer un fichier nommé print-list.yml :

    nano print-list.yml
  2. Ajouter le contenu suivant pour afficher une liste de nombres premiers :

    ---
    - name: Afficher une Liste de Nombres Premiers
    hosts: node1
    become: yes
    vars:
    prime_numbers:
    - 2
    - 3
    - 5
    - 7
    - 11
    tasks:
    - name: Afficher les Nombres Premiers
    debug:
    msg: "Nombre premier : {{ item }}"
    loop: "{{ prime_numbers }}"

    Explications :

    • vars : Définit une variable prime_numbers qui est une liste de nombres premiers.
    • loop : Itère sur chaque élément de la liste prime_numbers.
    • {{ item }} : Représente l'élément courant de la boucle.
  3. Enregistrer et quitter l'éditeur.

  4. Exécuter le playbook :

    ansible-playbook -i inventory.ini print-list.yml

    Résultat attendu :

    Le playbook affichera chaque nombre premier de la liste.


📝 Partie 2 : Boucler sur une Liste de Dictionnaires​

Étape 1 : Ajouter Plusieurs Utilisateurs avec une Boucle​

  1. Créer un fichier add-users.yml pour ajouter plusieurs utilisateurs avec des mots de passe :

    nano add-users.yml
  2. Ajouter le contenu suivant :

    ---
    - name: Ajouter Plusieurs Utilisateurs
    hosts: database
    become: yes
    vars:
    db_users:
    - username: "alice"
    password: "password1"
    uid: 1001
    - username: "bob"
    password: "password2"
    uid: 1002
    - username: "charlie"
    password: "password3"
    uid: 1003
    tasks:
    - name: Créer les Utilisateurs
    user:
    name: "{{ item.username }}"
    uid: "{{ item.uid }}"
    password: "{{ item.password | password_hash('sha512') }}"
    shell: "/bin/bash"
    state: present
    loop: "{{ db_users }}"

    Explications :

    • db_users : Liste de dictionnaires, chaque dictionnaire contenant les informations d'un utilisateur.
    • Module user : Utilisé pour gérer les comptes utilisateurs sur les hôtes cibles.
    • password_hash('sha512') : Hash le mot de passe en utilisant l'algorithme SHA-512 pour la sécurité.
    • loop: "{{ db_users }}" : Itère sur chaque utilisateur dans la liste db_users.
  3. Enregistrer et quitter l'éditeur.

  4. Exécuter le playbook :

    ansible-playbook -i inventory.ini add-users.yml
  5. Vérification :

    Utilisez la commande suivante pour confirmer que les utilisateurs ont été ajoutés :

    ansible database -m command -a "getent passwd alice bob charlie" -i inventory.ini

    Remarque : La commande getent passwd affiche les entrées des utilisateurs spécifiés.


📝 Partie 3 : Boucler sur un Dictionnaire​

Ansible ne peut pas boucler directement sur un dictionnaire. Il faut le transformer en une liste de paires clé/valeur en utilisant le filtre dict2items.

Étape 1 : Afficher les Paires Clé/Valeur d'un Dictionnaire​

  1. Créer un fichier nommé print-dictionary.yml :

    nano print-dictionary.yml
  2. Ajouter le contenu suivant :

    ---
    - name: Afficher les Informations d'un Employé
    hosts: node1
    become: yes
    vars:
    employee:
    name: "Alice"
    title: "Administratrice Système"
    company: "TechCorp"
    tasks:
    - name: Afficher le Dictionnaire Employé
    debug:
    msg: "{{ item.key }}: {{ item.value }}"
    loop: "{{ employee | dict2items }}"

    Explications :

    • employee : Un dictionnaire contenant des informations sur un employé.
    • dict2items : Convertit le dictionnaire en une liste de paires clé/valeur.
    • {{ item.key }} et {{ item.value }} : Représentent respectivement la clé et la valeur de chaque élément.
  3. Enregistrer et quitter l'éditeur.

  4. Exécuter le playbook :

    ansible-playbook -i inventory.ini print-dictionary.yml

    Résultat attendu :

    Le playbook affichera chaque attribut de l'employé, par exemple :

    name: Alice
    title: Administratrice Système
    company: TechCorp

📝 Partie 4 : Boucler sur une Plage de Nombres​

Étape 1 : Afficher une Plage de Nombres​

  1. Créer un fichier range-loop.yml :

    nano range-loop.yml
  2. Ajouter le contenu suivant :

    ---
    - name: Boucler sur une Plage de Nombres
    hosts: node1
    become: yes
    tasks:
    - name: Afficher les Nombres de 5 à 14
    debug:
    msg: "Nombre : {{ item }}"
    loop: "{{ range(5, 15) | list }}"

    Explications :

    • range(5, 15) : Génère un itérable de nombres de 5 à 14 (15 est exclu).
    • | list : Convertit l'itérable en une liste.
  3. Enregistrer et quitter l'éditeur.

  4. Exécuter le playbook :

    ansible-playbook -i inventory.ini range-loop.yml

    Résultat attendu :

    Le playbook affichera les nombres de 5 à 14.


📝 Partie 5 : Boucler sur les Hôtes de l'Inventaire​

Étape 1 : Exécuter une Tâche sur Tous les Nœuds de l'Inventaire​

  1. Créer un fichier loop-inventory.yml :

    nano loop-inventory.yml
  2. Ajouter le contenu suivant :

    ---
    - name: Boucler sur les Hôtes de l'Inventaire
    hosts: node1
    become: yes
    tasks:
    - name: Vérifier la Connectivité avec Tous les Hôtes
    ping:
    data: "Ping depuis node1"
    delegate_to: "{{ item }}"
    loop: "{{ groups['all'] }}"

    Explications :

    • groups['all'] : Contient tous les hôtes définis dans l'inventaire.
    • delegate_to: "{{ item }}" : Exécute la tâche sur l'hôte spécifié par item au lieu du nœud cible (node1).
    • Module ping : Vérifie la connectivité Ansible entre les hôtes.
  3. Enregistrer et quitter l'éditeur.

  4. Exécuter le playbook :

    ansible-playbook -i inventory.ini loop-inventory.yml

    Résultat attendu :

    Le playbook testera la connectivité avec chaque hôte de l'inventaire depuis node1.


📝 Partie 6 : Utiliser une Pause dans une Boucle​

Étape 1 : Créer un Compte à Rebours avec une Pause​

  1. Créer un fichier countdown.yml :

    nano countdown.yml
  2. Ajouter le contenu suivant :

    ---
    - name: Compte à Rebours de 10 Secondes
    hosts: node1
    become: yes
    tasks:
    - name: Afficher le Compte à Rebours
    debug:
    msg: "{{ item }} secondes restantes..."
    loop: "{{ range(10, 0, -1) | list }}"
    loop_control:
    delay: 1
    - name: Afficher le Message Final
    debug:
    msg: "C'est l'heure !"

    Explications :

    • range(10, 0, -1) : Génère une liste de nombres de 10 à 1 en décrémentant de 1.
    • loop_control: delay: 1 : Insère une pause de 1 seconde entre chaque itération de la boucle.
    • {{ item }} : Représente le nombre de secondes restantes.
  3. Enregistrer et quitter l'éditeur.

  4. Exécuter le playbook :

    ansible-playbook -i inventory.ini countdown.yml

    Résultat attendu :

    Le playbook affichera un compte à rebours de 10 à 1 avec une pause d'une seconde entre chaque nombre, puis affichera "C'est l'heure !".


🎯 Conclusion​

Dans ce chapitre, vous avez appris à :

  • Utiliser les boucles simples avec loop pour itérer sur des listes.
  • Boucler sur des listes de dictionnaires pour effectuer des tâches complexes comme la création d'utilisateurs.
  • Transformer et boucler sur des dictionnaires en utilisant le filtre dict2items.
  • Utiliser des plages de nombres avec range() pour générer des séquences numériques.
  • Boucler sur les hôtes de l'inventaire pour effectuer des actions sur plusieurs nœuds.
  • Introduire des pauses dans les boucles avec loop_control pour contrôler le timing des tâches.

Ces techniques vous permettent de rendre vos playbooks plus dynamiques et efficaces, en automatisant des tâches répétitives sans répéter le code.


🛠️ Conseils Supplémentaires​

  • Filtres Jinja2 : Explorez d'autres filtres comme items2dict, map, et select pour manipuler vos données.
  • Boucles avec with_items : Bien que loop soit recommandé, vous pouvez rencontrer with_items dans des playbooks plus anciens.
  • Contrôle des Boucles : Utilisez loop_control pour accéder à des variables spéciales comme index, index0, first, last.
  • Gestion des Échecs dans les Boucles : Pour continuer l'exécution en cas d'erreur sur un élément, utilisez ignore_errors ou failed_when.

📚 Ressources Utiles​


🙌 Félicitations !​

Vous avez amélioré vos compétences en Ansible en apprenant à utiliser les boucles pour automatiser des tâches répétitives. Continuez à explorer ces fonctionnalités pour rendre vos playbooks encore plus puissants et efficaces.