Vous administrez plusieurs serveurs Linux et vous passez encore vos journées à enchaîner des commandes SSH à la main ? Vous maintenez des scripts Bash de 500 lignes que plus personne n’ose toucher ? Il est temps de passer à Ansible.
Dans ce premier chapitre, nous allons poser les fondations : comprendre ce qu’est Ansible, pourquoi il s’est imposé comme l’outil d’automatisation de référence, et surtout — écrire ensemble votre premier playbook fonctionnel.
Qu’est-ce qu’Ansible ?#
Ansible est un outil open source d’automatisation IT développé initialement par Michael DeHaan en 2012, puis racheté par Red Hat en 2015. Il permet d’automatiser trois grandes familles de tâches :
- La gestion de configuration — installer des paquets, gérer des fichiers de config, créer des utilisateurs
- Le déploiement d’applications — pousser du code, redémarrer des services, orchestrer des mises à jour
- L’orchestration d’infrastructure — provisionner des VMs, configurer des load balancers, gérer du cloud
Sa philosophie tient en trois mots : simple, agentless, idempotent.
Pourquoi pas juste des scripts Bash ?#
Soyons honnêtes : un script Bash bien écrit peut faire beaucoup. Mais passé un certain seuil, les problèmes s’accumulent :
| Critère | Script Bash | Ansible |
|---|---|---|
| Idempotence | À gérer manuellement (if/else partout) | Native — un module ne refait pas ce qui est déjà fait |
| Lisibilité | Dépend du développeur | YAML structuré, lisible par tous |
| Gestion d’erreurs | set -e et bricolage | Gestion intégrée, handlers, blocs rescue |
| Multi-serveurs | Boucles SSH fragiles | Parallélisme natif sur l’inventaire |
| Maintenance | Cauchemar au-delà de 200 lignes | Rôles, variables, templates réutilisables |
| Documentation | Le script est la doc (en théorie) | Le playbook est la doc (en pratique) |
Un script Bash dit « exécute ces commandes ». Ansible dit « assure-toi que le système est dans cet état ». La différence est fondamentale.
Ansible vs Puppet vs Chef#
Ansible n’est pas le seul outil de gestion de configuration. Puppet et Chef existent depuis plus longtemps. Voici ce qui les distingue :
Puppet utilise un langage déclaratif propriétaire (Puppet DSL) et repose sur un agent installé sur chaque machine cible. Il faut un Puppet Server central. La courbe d’apprentissage est raide.
Chef utilise Ruby comme langage de configuration. Il nécessite également un agent (chef-client) et un serveur central (Chef Infra Server). Puissant mais complexe.
Ansible utilise YAML — un format que n’importe quel ops peut lire en 5 minutes. Il ne nécessite aucun agent sur les machines cibles. Il se connecte en SSH, exécute ce qu’il faut, et repart. C’est cette simplicité qui explique son adoption massive.
En résumé : si vous démarrez aujourd’hui, Ansible est le choix le plus pragmatique. Pas d’infrastructure à maintenir pour l’outil lui-même, pas de langage à apprendre, et une communauté immense.
Architecture d’Ansible#
Comprendre l’architecture d’Ansible, c’est comprendre pourquoi il est si simple à déployer.
Le modèle agentless#
Contrairement à Puppet ou Chef, Ansible ne requiert aucun daemon sur les machines cibles. Tout ce qu’il lui faut :
- Python installé sur les machines distantes (présent par défaut sur quasi toutes les distributions Linux)
- Un accès SSH depuis la machine de contrôle
C’est tout. Pas de port supplémentaire à ouvrir, pas de certificat à gérer, pas de service à superviser. Votre machine de contrôle (votre laptop, un bastion, un runner CI) lance Ansible, qui se connecte en SSH, pousse un petit module Python, l’exécute, récupère le résultat, et nettoie derrière lui.
Les composants clés#
| |
- Playbook : fichier YAML décrivant l’état souhaité de vos machines. C’est votre « recette ».
- Inventaire : liste des machines cibles, organisées en groupes.
- Modules : unités de travail réutilisables (installer un paquet, copier un fichier, démarrer un service…). Ansible en fournit des milliers.
- Tasks : une action unitaire dans un playbook (appel à un module avec des paramètres).
- Handlers : tâches déclenchées par notification (ex : redémarrer Nginx après modification de sa config).
- Rôles : structure de réutilisation qui regroupe tasks, handlers, templates, variables.
- Facts : informations collectées automatiquement sur les machines cibles (OS, IP, RAM…).
Installation#
Sur Debian / Ubuntu#
| |
Cette méthode installe la version packagée par la distribution. Elle peut être un peu ancienne.
Via pip (recommandé)#
Pour avoir la dernière version :
| |
Vérifier l’installation#
| |
Vous devriez voir quelque chose comme :
| |
Configurer SSH#
Ansible utilise SSH. Assurez-vous que votre clé publique est déployée sur les machines cibles :
| |
L’inventaire#
L’inventaire est le fichier qui dit à Ansible sur quelles machines travailler. C’est le point de départ de tout.
Inventaire statique#
Le format le plus simple est le fichier INI. Créez un fichier inventory.ini :
| |
Quelques explications :
[webservers]et[databases]sont des groupesansible_hostspécifie l’adresse IP ou le FQDN[all:vars]définit des variables pour tous les hôtesansible_userindique l’utilisateur SSH à utiliser
Vous pouvez aussi utiliser le format YAML (inventory.yml) :
| |
Inventaire dynamique#
En environnement cloud, vos serveurs apparaissent et disparaissent. Maintenir un fichier statique devient vite pénible. Ansible supporte les inventaires dynamiques : des scripts ou plugins qui interrogent une API (AWS, Azure, GCP, VMware…) pour générer la liste des machines à la volée.
Exemple avec le plugin AWS EC2 — créez un fichier aws_ec2.yml :
| |
| |
Pour ce cours, nous utiliserons l’inventaire statique. L’inventaire dynamique sera couvert en détail dans un chapitre ultérieur.
Commandes ad-hoc#
Avant d’écrire des playbooks, commençons par les commandes ad-hoc. Ce sont des commandes Ansible one-shot, parfaites pour des actions rapides.
Syntaxe#
| |
Exemples pratiques#
| |
Le flag --become active l’élévation de privilèges (équivalent sudo).
Les commandes ad-hoc sont utiles pour du dépannage ou des actions ponctuelles. Pour tout ce qui doit être reproductible et versionné, on écrit un playbook.
Les modules essentiels#
Ansible embarque des milliers de modules. Voici ceux que vous utiliserez quotidiennement :
apt / yum — Gestion des paquets#
| |
Les états possibles : present (installé), absent (désinstallé), latest (dernière version).
copy — Copier des fichiers#
| |
template — Fichiers dynamiques avec Jinja2#
| |
Le template Jinja2 correspondant (vhost.conf.j2) :
server {
listen 80;
server_name {{ domain_name }};
root {{ document_root }};
index index.html;
location / {
try_files $uri $uri/ =404;
}
}La différence avec copy : template traite les variables Jinja2 ({{ }}) avant de déposer le fichier.
service — Gérer les services#
| |
États possibles : started, stopped, restarted, reloaded.
user — Gérer les utilisateurs#
| |
Votre premier playbook : déployer Nginx#
Passons à la pratique. Nous allons écrire un playbook complet qui installe et configure Nginx sur les serveurs du groupe webservers.
Structure du projet#
| |
Le fichier d’inventaire#
| |
Le template Nginx#
# templates/nginx-default.conf.j2
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/{{ site_name }};
index index.html;
server_name {{ ansible_hostname }};
location / {
try_files $uri $uri/ =404;
}
}La page d’accueil#
| |
Le playbook#
| |
Exécuter le playbook#
| |
Le flag --check simule l’exécution sans rien modifier. Le flag --diff affiche les différences sur les fichiers modifiés. Prenez l’habitude de toujours faire un dry-run avant d’appliquer.
Comprendre la sortie#
| |
- ok : la tâche s’est exécutée, rien n’a changé (état déjà conforme)
- changed : la tâche a modifié quelque chose sur la machine
- unreachable : impossible de se connecter
- failed : la tâche a échoué
Relancez le même playbook : tout passera en ok au lieu de changed. C’est l’idempotence en action.
Exercices pratiques#
Exercice 1 — Tester la connectivité#
Créez un inventaire avec au moins une machine (ça peut être localhost) et vérifiez la connectivité :
| |
Exercice 2 — Commandes ad-hoc#
Utilisez des commandes ad-hoc pour :
- Afficher l’uptime de toutes vos machines
- Vérifier la version de Python installée
- Créer un fichier
/tmp/ansible-test.txtavec le contenu « Hello from Ansible »
| |
Exercice 3 — Modifier le playbook Nginx#
Partez du playbook fourni dans ce chapitre et ajoutez :
- L’installation du paquet
curlen plus de Nginx - Une tâche qui vérifie que le site répond (module
uri) - Un handler qui redémarre Nginx (pas seulement reload)
Indice pour la vérification :
| |
Exercice 4 — Variables et template#
Créez un playbook qui :
- Définit une variable
messageavec la valeur de votre choix - Utilise un template Jinja2 pour générer un fichier
/var/www/html/index.htmlcontenant ce message - S’assure que Nginx sert cette page
C’est l’occasion de pratiquer la différence entre copy et template.
Bonnes pratiques pour bien démarrer#
Avant de passer au chapitre suivant, quelques règles à intégrer dès maintenant :
- Nommez toutes vos tâches. Un
name:explicite en français ou anglais rend le playbook lisible et la sortie compréhensible. - Utilisez
--check --diffsystématiquement avant d’appliquer en production. - Versionnez vos playbooks dans Git dès le premier jour.
- Une tâche = une action. Ne combinez pas plusieurs opérations dans une seule tâche.
- Utilisez les FQCN (Fully Qualified Collection Names) comme
ansible.builtin.aptplutôt que justeapt. C’est la convention moderne et ça évite les ambiguïtés.
Récapitulatif#
Dans ce premier chapitre, vous avez appris :
- Ce qu’est Ansible et pourquoi il surpasse les scripts Bash et les outils à agent
- L’architecture agentless : SSH, pas d’agent, pas de serveur central
- L’installation via pip ou apt
- L’inventaire statique (INI / YAML) et le concept d’inventaire dynamique
- Les commandes ad-hoc pour des actions rapides
- Les modules essentiels : apt, yum, copy, template, service, user
- Votre premier playbook complet pour déployer Nginx
Dans le prochain chapitre, nous approfondirons les variables, les facts et les templates Jinja2 pour rendre vos playbooks véritablement dynamiques.
Cet article fait partie de la série Apprendre Ansible sur devopslab.ch — des cours DevOps gratuits, en français, pensés pour la pratique.