Chapitre 3 - Travailler avec les Playbooks Ansible - Pratique 03
Dans ce chapitre, nous allons explorer l'utilisation des playbooks dans Ansible pour automatiser des tâches complexes de manière efficace. Les playbooks avancés vous permettent d'organiser et de réutiliser votre code de manière structurée. Cette fonctionnalité est particulièrement utile pour :
- Créer des playbooks modulaires et réutilisables.
- Organiser les tâches de manière logique avec des tags.
- Gérer efficacement des configurations complexes.
📋 Table des Matières
- Introduction
- Étape Préparatoire : Créer un Dossier de Travail
- Configurer l'Inventaire Ansible
- Vérifier l'Inventaire et la Connectivité
- Partie 1 : Créer et Exécuter votre Premier Playbook
- Partie 2 : Créer un Playbook Multi-Tâches
- Partie 3 : Réutiliser des Tâches via l'Importation
- Partie 4 : Utiliser les Tags pour l'Exécution Sélective
- Conclusion
📝 Introduction
Dans cette pratique, vous allez apprendre à automatiser des tâches sur vos conteneurs Docker en utilisant Ansible avec des playbooks. Nous commencerons par des tâches simples avant de passer à des opérations plus avancées. Assurez-vous d’avoir bien configuré Docker, Docker Compose et Ansible avant de débuter.
📂 Étape Préparatoire : Créer un Dossier de Travail
-
Créer un dossier pour le projet Ansible :
mkdir ansible_project
Cela crée un dossier nommé
ansible_project
dans votre répertoire actuel. Ce dossier servira de conteneur pour tous vos fichiers et playbooks Ansible. -
Naviguer dans le dossier nouvellement créé :
cd ansible_project
🗂️ Configurer l'Inventaire Ansible
L'inventaire Ansible est un fichier essentiel pour définir les hôtes gérés par Ansible. Il spécifie les adresses IP, les utilisateurs, et peut organiser les hôtes en groupes.
-
Créer un fichier
inventory.ini
:nano inventory.ini
-
Ajouter les informations des nœuds dans
inventory.ini
:[node_containers]
node1 ansible_host=172.20.0.2 ansible_user=root
node2 ansible_host=172.20.0.3 ansible_user=root
node3 ansible_host=172.20.0.4 ansible_user=root
node4 ansible_host=172.20.0.5 ansible_user=root
node5 ansible_host=172.20.0.6 ansible_user=root
node6 ansible_host=172.20.0.7 ansible_user=root
[web]
node1
node5
[database]
node2
node3
[mail]
node4
node6Explications :
- [node_containers] : Groupe principal contenant tous les conteneurs.
ansible_host
: Spécifie l'adresse IP de chaque nœud.ansible_user
: Définit l’utilisateur pour l’accès SSH, iciroot
pour tous les nœuds.- [web], [database], [mail] : Groupes permettant de structurer les nœuds selon leur fonction.
-
Enregistrer et quitter l'éditeur :
- Appuyez sur
Ctrl + X
, puisY
etEntrée
.
- Appuyez sur
🌐 Vérifier l'Inventaire et la Connectivité
Avant d'exécuter des playbooks, il est important de vérifier que l'inventaire est correctement configuré et que la connectivité SSH est opérationnelle.
-
Lister les hôtes d'un groupe spécifique :
ansible web -i inventory.ini --list-hosts
-
Lister tous les hôtes dans l'inventaire :
ansible all -i inventory.ini --list-hosts
-
Tester la connectivité avec une commande
ping
:ansible all -m ping -i inventory.ini
-
Vérifier un nœud individuel (exemple avec node1) :
ansible node1 -i inventory.ini --list-hosts
-
Exécuter une commande sur un nœud (par exemple, obtenir la date sur node1) :
ansible node1 -m command -a "date" -i inventory.ini
Note : Si vous rencontrez des avertissements concernant l'interpréteur Python, vous pouvez spécifier l'interpréteur Python dans l'inventaire pour chaque hôte :
node1 ansible_host=172.20.0.2 ansible_user=root ansible_python_interpreter=/usr/bin/python3
📝 Partie 1 : Créer et Exécuter votre Premier Playbook
Étape 1 : Écrire un Playbook de Base pour la Création de Fichiers
-
Créer un fichier nommé
first-playbook.yml
:nano first-playbook.yml
-
Ajouter le contenu suivant :
---
- name: Premier Playbook de Création de Fichier
hosts: all
become: yes
tasks:
- name: Créer un fichier de configuration
file:
path: /tmp/foo.conf
mode: '0664'
owner: root
state: touchExplications :
hosts: all
: Le playbook s'exécute sur tous les hôtes définis dans l'inventaire.become: yes
: Exécute les tâches avec les privilèges élevés (root).- tasks : Liste des tâches à exécuter.
- Le module
file
est utilisé pour gérer les fichiers et répertoires.
-
Enregistrer et quitter l'éditeur :
- Appuyez sur
Ctrl + X
, puisY
etEntrée
.
- Appuyez sur
Étape 2 : Exécuter le Playbook
-
Lancer le playbook :
ansible-playbook -i inventory.ini first-playbook.yml
-
Vérifier que le fichier a bien été créé :
ansible all -m command -a "ls -l /tmp/foo.conf" -i inventory.ini
📝 Partie 2 : Créer un Playbook Multi-Tâches 🚀
🔥 Étape 1 : Écrire un Playbook avec Plusieurs Tâches
👷 1. Créer un fichier nommé multi-tasks-playbook.yml
:
nano multi-tasks-playbook.yml
📝 2. Ajouter le contenu suivant :
---
- name: 🚒 Installation et Archivage des Logs
hosts: all
become: yes
tasks:
- name: 🔧 Installer tmux sur tous les nœuds
package:
name: tmux
state: present
tags: install_tmux
- name: 📦 Créer une archive des logs système
archive:
path: /var/log
dest: /tmp/logs.tar.gz
format: gz
excludes:
- '/var/log/wtmp'
- '/var/log/btmp'
tags: archive_logs
- name: 🔧 Installation de Git sur les nœuds Ubuntu
hosts: node1,node5,node6
become: yes
tasks:
- name: 🔄 Mettre à jour le cache APT
apt:
update_cache: yes
tags: update_cache
- name: 📥 Installer Git
apt:
name: git
state: present
tags: install_git
💡 Explications :
- ✅ Des tags ont été ajoutés pour permettre une exécution sélective des tâches.
- 📂 Exclusion de certains fichiers lors de l'archivage des logs pour éviter d'inclure des fichiers sensibles ou volumineux.
- 🔄 Mise à jour du cache APT avant l'installation de Git sur les nœuds Ubuntu.
😱 Oups !!! 🔥 Erreur repérée ! On a besoin d'un pompier ici ! 👨🚒👩🚒
Défi : Trouvez l'erreur pour nous aider à maîtriser le feu dans ce Playbook ! 🔍
🏆 Solution (ne regardez pas si vous voulez relever le défi !)
---
- name: 🚒 Installation et Archivage des Logs
hosts: all
become: yes
tasks:
- name: 🔧 Installer tmux sur tous les nœuds
package:
name: tmux
state: present
tags: install_tmux
- name: 📦 Créer une archive des logs système
archive:
path: /var/log
dest: /tmp/logs.tar.gz
format: gz
exclusion_patterns:
- '/var/log/wtmp'
- '/var/log/btmp'
tags: archive_logs
- name: 🔧 Installation de Git sur les nœuds Ubuntu
hosts: node1,node5,node6
become: yes
tasks:
- name: 🔄 Mettre à jour le cache APT
apt:
update_cache: yes
tags: update_cache
- name: 📥 Installer Git
apt:
name: git
state: present
tags: install_git
🎉 Bravo ! Vous avez trouvé l'erreur : il fallait remplacer excludes
par exclusion_patterns
pour que tout fonctionne correctement ! 🚒 Notre premier pompier du jour est Imane ! 👏🏅
- Enregistrer et quitter l'éditeur.
Étape 2 : Exécuter le Playbook Multi-Tâches
-
Lancer le playbook :
ansible-playbook -i inventory.ini multi-tasks-playbook.yml
-
Vérifier que l’archive a bien été créée :
ansible all -m command -a "ls -lh /tmp/logs.tar.gz" -i inventory.ini
-
Vérifier que
tmux
est installé :ansible all -m shell -a "tmux -V" -i inventory.ini
-
Vérifier que
git
est installé sur les nœuds Ubuntu :ansible node1,node5,node6 -m shell -a "git --version" -i inventory.ini
📝 Partie 3 : Réutiliser des Tâches via l'Importation
Étape 1 : Créer un Fichier de Tâches Réutilisables
-
Créer un fichier nommé
group-tasks.yml
:nano group-tasks.yml
-
Ajouter le contenu suivant :
---
- name: Créer le groupe développeurs
group:
name: developpeurs
- name: Créer le groupe sécurité
group:
name: securite
- name: Créer le groupe finance
group:
name: finance -
Enregistrer et quitter l'éditeur.
Étape 2 : Importer les Tâches dans un Playbook Principal
-
Modifier
first-playbook.yml
pour incluregroup-tasks.yml
:---
- name: Premier Playbook de Création de Fichier et de Groupes
hosts: all
become: yes
tasks:
- name: Créer un fichier de configuration
file:
path: /tmp/foo.conf
mode: '0664'
owner: root
state: touch
- name: Importer les tâches pour créer des groupes
import_tasks: group-tasks.yml -
Lancer le playbook avec importation de tâches :
ansible-playbook -i inventory.ini first-playbook.yml
-
Vérifier que les groupes ont été créés :
ansible all -m command -a "getent group developpeurs securite finance" -i inventory.ini
📝 Partie 4 : Utiliser les Tags pour l'Exécution Sélective
Les tags permettent de cibler des tâches spécifiques lors de l'exécution d'un playbook.
-
Taguer les tâches dans
multi-tasks-playbook.yml
(si ce n'est pas déjà fait) :- name: Installer tmux sur tous les nœuds
package:
name: tmux
state: present
tags: install_tmux
- name: Créer une archive des logs système
archive:
path: /var/log
dest: /tmp/logs.tar.gz
format: gz
excludes:
- '/var/log/wtmp'
- '/var/log/btmp'
tags: archive_logs
- name: Mettre à jour le cache APT
apt:
update_cache: yes
tags: update_cache
- name: Installer Git
apt:
name: git
state: present
tags: install_git -
Exécuter des Tâches Spécifiques par Tag :
-
Pour installer uniquement
tmux
:ansible-playbook -i inventory.ini multi-tasks-playbook.yml --tags install_tmux
-
Pour créer l’archive uniquement :
ansible-playbook -i inventory.ini multi-tasks-playbook.yml --tags archive_logs
-
Pour installer uniquement
git
sur les nœuds Ubuntu :ansible-playbook -i inventory.ini multi-tasks-playbook.yml --tags install_git
-
Pour exécuter toutes les tâches sauf celles d'un tag spécifique :
ansible-playbook -i inventory.ini multi-tasks-playbook.yml --skip-tags install_tmux
-
🎯 Conclusion
Dans ce chapitre, vous avez appris à :
- Écrire des playbooks Ansible avec des tâches simples et multiples.
- Utiliser des modules Ansible appropriés pour gérer les paquets, les fichiers, et les archives.
- Réutiliser des tâches via l'importation de fichiers de tâches.
- Utiliser les tags pour exécuter sélectivement des parties de vos playbooks.
Ces pratiques vous permettront d'automatiser efficacement la gestion de vos conteneurs Docker et de vos serveurs, tout en maintenant vos playbooks organisés et maintenables.
🛠️ Conseils Supplémentaires
- Utiliser les Rôles Ansible : Pour des projets plus complexes, envisagez d'utiliser des rôles pour organiser vos playbooks et vos tâches.
- Variables et Templates : Utilisez des variables pour rendre vos playbooks plus flexibles, et des templates Jinja2 pour générer des fichiers de configuration dynamiques.
- Gestion des Différences de Plateforme : Utilisez des conditions
when
pour gérer les différences entre les systèmes d'exploitation. - Vérification des Erreurs : Toujours vérifier les messages d'erreur lors de l'exécution des playbooks pour corriger les problèmes potentiels.
📚 Ressources Utiles
🙌 Félicitations !
Vous avez amélioré vos compétences en écriture de playbooks Ansible avancés, en réutilisant des tâches, et en utilisant des fonctionnalités puissantes comme les tags. Continuez à pratiquer et à explorer les fonctionnalités d'Ansible pour automatiser efficacement vos tâches d'administration système.