Ansible - Débutant : automatiser la configuration de tes serveurs
🎯 Objectifs
- Comprendre pourquoi Ansible existe et quel problème il résout
- Installer Ansible et vérifier l'installation
- Créer un inventaire de machines
- Écrire et exécuter un premier playbook
- Utiliser les modules Ansible les plus courants
📋 Prérequis
- Linux Débutant - ligne de commande, fichiers, SSH
- Un terminal avec Python 3 installé
- Accès SSH à au moins une machine (locale ou distante)
🤔 Pourquoi Ansible ?
Imagine que tu dois configurer 10 serveurs identiques : installer Nginx, créer un utilisateur, copier un fichier de configuration. Tu pourrais te connecter manuellement à chacun et taper les mêmes commandes. Ça prend du temps et tu risques de faire une erreur sur l'un d'eux.
Le problème : configurer plusieurs serveurs à la main, c'est long, répétitif et source d'erreurs.
La solution Ansible : tu écris ta recette une seule fois, et Ansible l'applique sur autant de machines que tu veux, de façon identique.
💡 Ansible traduit des instructions lisibles en français (ou anglais) en commandes SSH. Pas besoin d'apprendre un nouveau langage de programmation.
🍳 Ansible, c'est quoi exactement ?
L'analogie : Ansible, c'est comme une recette de cuisine.
- Tu listes tes ingrédients (les serveurs à configurer) → c'est l'inventaire.
- Tu décris les étapes à suivre → c'est le playbook.
- Chaque étape fait appel à un ustensile de cuisine spécialisé → c'est un module.
La cuisine se fait à distance : tu donnes la recette depuis ton ordinateur, et Ansible la suit sur chaque serveur via SSH. Aucun agent n'est installé sur les serveurs cibles - c'est l'un des grands avantages d'Ansible.
🏗️ Architecture Ansible
Ton ordinateur (Control Node)
│
│ SSH
▼
Serveur 1 (Managed Node)
Serveur 2 (Managed Node)
Serveur 3 (Managed Node)| Terme | Définition |
|---|---|
| Control node | Ta machine depuis laquelle tu lances Ansible |
| Managed node | Les serveurs que tu veux configurer |
| Inventaire | La liste de tes managed nodes |
| Playbook | Le fichier YAML qui décrit les tâches à exécuter |
| Task | Une action unique (installer un paquet, copier un fichier...) |
| Module | L'outil Ansible qui exécute une tâche précise |
| Play | Un groupe de tâches appliqué à un groupe de serveurs |
🔧 Installation
Linux (Ubuntu/Debian)
Référence officielle : docs.ansible.com/installation_guide
# Mettre à jour les paquets
sudo apt update
# Installer Ansible
sudo apt install ansible -y
# Vérifier l'installation
ansible --versionmacOS
# Avec Homebrew
brew install ansible
# Vérifier
ansible --versionVérification
ansible --version
# ansible [core 2.16.x]
# python version = 3.x.x
# jinja version = 3.x.x✅ Si tu vois la version d'Ansible et de Python, tu es prêt.
📋 L'Inventaire
Qu'est-ce que c'est ?
L'inventaire est un fichier qui liste tes serveurs. Sans inventaire, Ansible ne sait pas où aller.
Format INI (le plus simple)
# inventaire.ini
# Un serveur seul
serveur1 ansible_host=192.168.1.10
# Un groupe de serveurs
[webservers]
web1 ansible_host=192.168.1.11
web2 ansible_host=192.168.1.12
[databases]
db1 ansible_host=192.168.1.20Variables dans l'inventaire
Tu peux ajouter des variables directement dans le fichier :
[webservers]
web1 ansible_host=192.168.1.11 ansible_user=ubuntu ansible_port=22
web2 ansible_host=192.168.1.12 ansible_user=ubuntu ansible_port=22
[webservers:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_ed25519| Variable | Rôle |
|---|---|
ansible_host | Adresse IP ou nom DNS du serveur |
ansible_user | Utilisateur SSH |
ansible_port | Port SSH (défaut : 22) |
ansible_ssh_private_key_file | Clé SSH privée à utiliser |
Tester la connectivité
# Ping sur tous les serveurs de l'inventaire
ansible all -i inventaire.ini -m ping
# Ping sur un groupe
ansible webservers -i inventaire.ini -m ping💡 Le module
pingAnsible ne fait pas un vrai ping réseau - il vérifie que la connexion SSH fonctionne et que Python est disponible sur la cible.
📖 Le Playbook
Structure de base
Un playbook est un fichier YAML. Il contient un ou plusieurs plays, chaque play s'applique à un groupe de serveurs et contient des tasks.
---
# premier-playbook.yml
- name: Configurer les serveurs web # Nom du play
hosts: webservers # Groupe de serveurs cibles
become: true # Utiliser sudo pour les tâches
tasks:
- name: Installer Nginx # Nom de la tâche
ansible.builtin.apt: # Module utilisé
name: nginx # Paramètre du module
state: present # État désiré
- name: Démarrer et activer Nginx
ansible.builtin.service:
name: nginx
state: started
enabled: trueLancer un playbook
# Syntaxe de base
ansible-playbook -i inventaire.ini premier-playbook.yml
# Tester sans appliquer (dry-run)
ansible-playbook -i inventaire.ini premier-playbook.yml --check
# Mode verbeux (utile pour déboguer)
ansible-playbook -i inventaire.ini premier-playbook.yml -v| Option | Description |
|---|---|
-i | Fichier d'inventaire |
--check | Simulation sans changement réel |
-v / -vv / -vvv | Augmenter la verbosité |
--limit web1 | Restreindre l'exécution à un hôte |
--tags deploy | Exécuter uniquement les tâches taguées |
📦 Les Modules Essentiels
ansible.builtin.apt - Gestion des paquets (Debian/Ubuntu)
- name: Installer plusieurs paquets
ansible.builtin.apt:
name:
- nginx
- curl
- vim
state: present
update_cache: true # Équivalent de apt update
- name: Supprimer un paquet
ansible.builtin.apt:
name: apache2
state: absentansible.builtin.copy - Copier des fichiers
- name: Copier la configuration Nginx
ansible.builtin.copy:
src: files/nginx.conf # Sur ton control node
dest: /etc/nginx/nginx.conf # Sur le serveur cible
owner: root
group: root
mode: '0644'ansible.builtin.file - Gérer fichiers et répertoires
- name: Créer un répertoire
ansible.builtin.file:
path: /var/www/monapp
state: directory
owner: www-data
mode: '0755'
- name: Créer un lien symbolique
ansible.builtin.file:
src: /etc/nginx/sites-available/monapp
dest: /etc/nginx/sites-enabled/monapp
state: linkansible.builtin.service - Gérer les services
- name: Démarrer Nginx
ansible.builtin.service:
name: nginx
state: started # started, stopped, restarted, reloaded
enabled: true # Démarrer au bootansible.builtin.command et ansible.builtin.shell
- name: Exécuter une commande simple
ansible.builtin.command: whoami
- name: Exécuter une commande avec pipe (nécessite shell)
ansible.builtin.shell: "cat /etc/os-release | grep NAME"⚠️ Préfère toujours les modules spécialisés (apt, copy, file...) à
commandoushell. Les modules sont idempotents : les relancer plusieurs fois donne le même résultat.shelletcommandne le sont pas forcément.
ansible.builtin.debug - Afficher des informations
- name: Afficher un message
ansible.builtin.debug:
msg: "L'installation est terminée sur {{ inventory_hostname }}"🔄 L'idempotence : un concept clé
C'est quoi ? Un playbook idempotent peut être lancé 10 fois de suite - il ne modifie la machine que si quelque chose doit changer.
L'analogie : c'est comme allumer la lumière dans une pièce déjà éclairée. Rien ne change. Ansible fonctionne pareil : si Nginx est déjà installé, il ne le réinstalle pas.
Pourquoi c'est important ? Tu peux relancer ton playbook après une panne, une modification partielle, ou pour vérifier l'état du système. C'est sûr.
⚠️ Erreurs Courantes
| Erreur | Cause | Solution |
|---|---|---|
UNREACHABLE! => {"msg": "Failed to connect"} | SSH inaccessible | Vérifier l'IP, le port, la clé SSH |
fatal: [host]: FAILED! sudo: a password is required | become: true sans mot de passe | Configurer le sudoers sans mot de passe ou utiliser --ask-become-pass |
ERROR! Syntax Error while loading YAML | Indentation incorrecte | Vérifier les espaces (YAML est strict) |
MODULE FAILURE | Module introuvable | Vérifier le nom du module et sa syntaxe |
Changed=0 toujours | Playbook déjà appliqué | C'est normal - c'est l'idempotence |
📊 Récapitulatif
| Concept | Rôle | Fichier |
|---|---|---|
| Inventaire | Liste des serveurs cibles | inventaire.ini |
| Playbook | Recette des tâches à exécuter | playbook.yml |
| Play | Groupe de tâches pour un groupe de serveurs | Dans le playbook |
| Task | Une action unique | Dans le play |
| Module | L'outil qui exécute la tâche | ansible.builtin.apt, etc. |
📚 Ressources
🚀 Prochaines étapes
Tu sais écrire un inventaire et un playbook de base. Passons au niveau supérieur :
- Ansible Intermédiaire : variables, templates et rôles - Organise et réutilise ton code Ansible