Chapitre 117 minIntermédiaire
C'est quoi Ansible ? Infrastructure as code et idempotence
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- expliquer ce que l'automatisation apporte face aux manipulations à la main ;
- définir l'infrastructure as code, l'approche déclarative et l'idempotence ;
- décrire l'architecture d'Ansible : nœud de contrôle, nœuds gérés, modules ;
- situer Ansible face aux scripts, à Puppet et à Terraform ;
- repérer où l'automatisation compte à l'E6 SISR.
3 exercices corrigés2 schémas
Ansible est un outil d'automatisation libre qui configure des serveurs, des postes et des équipements réseau à partir de fichiers texte écrits en YAML, sans installer de logiciel sur les machines gérées. Ce chapitre explique pourquoi on automatise, ce que recouvre l'infrastructure as code, ce qu'est l'idempotence, comment Ansible fonctionne et où il se situe face aux autres outils.
Pourquoi automatiser l'administration
Sorbier Logistique fait tourner une douzaine de serveurs : deux contrôleurs de domaine, un serveur de fichiers, un serveur de gestion, un serveur de journaux et de supervision, le serveur web de la DMZ, et bientôt un serveur de recette. Jusqu'ici, chaque installation suivait une procédure dans un document de traitement de texte de quinze pages. Antoine Mercier, le responsable informatique, a fait le compte des problèmes :
- Le temps. Préparer un serveur Debian (paquets, heure, comptes des administrateurs, durcissement SSH, pare-feu, agent de supervision) prend une demi-journée. Pour dix serveurs, une semaine.
- Les oublis. Sur
srv-journaux, quelqu'un a sauté l'étape du pare-feu. Personne ne s'en est aperçu pendant six mois. - La dérive de configuration. Chloé a corrigé un réglage SSH à la main sur un serveur, pas sur les autres. Deux serveurs installés avec la même procédure ne sont plus identiques : on parle de dérive (configuration drift).
- La traçabilité. Qui a changé quoi, quand, et pourquoi ? La procédure dit ce qu'il fallait faire, pas ce qui a été fait.
- La reconstruction. Si un serveur est perdu, le reconstruire à l'identique dépend de la mémoire de celui qui l'a installé.
Un script Bash ou PowerShell règle une partie du problème : il enchaîne les commandes sans en oublier. Mais un script écrit naïvement ne sait pas dans quel état il trouve la machine. Lancé deux fois, il peut ajouter deux fois la même ligne dans un fichier, échouer parce qu'un compte existe déjà, ou redémarrer un service pour rien.
| Méthode | Ce qu'elle garantit | Sa limite |
|---|---|---|
| À la main, avec une procédure | Rien : tout dépend de l'attention de la personne | Lente, sujette aux oublis et à la dérive |
| Script Bash ou PowerShell | Les mêmes commandes, dans le même ordre | Décrit des actions ; ne sait pas toujours si elles sont déjà faites |
| Ansible | Un état décrit, vérifié et appliqué seulement là où il manque | Demande d'apprendre l'outil et de décrire proprement l'état voulu |
C'est quoi l'infrastructure as code
L'infrastructure as code (IaC, « infrastructure sous forme de code ») consiste à décrire l'infrastructure (serveurs, configurations, réseaux, machines virtuelles) dans des fichiers texte lisibles par un outil, puis à laisser cet outil appliquer la description. Les fichiers deviennent la référence : pour savoir comment un serveur est configuré, on lit le dépôt, pas le serveur.
Ce que ça change concrètement :
- Reproductible. Le même fichier produit le même serveur, aujourd'hui comme dans un an, en recette comme en production.
- Versionné. Les fichiers vivent dans un dépôt Git : chaque modification a un auteur, une date, un message et peut être annulée (cours Git et GitHub).
- Relu et testé. Une modification passe par une revue et par des contrôles automatiques avant d'être appliquée (chapitre 15).
- Documenté. Le code est une documentation qui ne peut pas être fausse : c'est lui qui configure.
- Rapide. Préparer dix serveurs prend le même temps qu'en préparer un.
Deux styles d'écriture existent.
L'approche impérative décrit les étapes : « installe chrony, puis ajoute cette ligne au fichier, puis redémarre le service ». C'est le style d'un script.
L'approche déclarative décrit le résultat : « chrony doit être installé, le fichier doit contenir ces lignes, le service doit tourner ». L'outil compare l'état réel à l'état voulu et ne fait que ce qui manque.
Voici le même besoin écrit des deux façons. D'abord en Bash :
#!/bin/bash
# Impératif : une suite d'actions
apt-get install -y chrony
echo "server 192.168.10.177 iburst" >> /etc/chrony/chrony.conf
systemctl restart chrony
Puis en Ansible :
# Déclaratif : l'état attendu
- name: Chrony doit être installé
ansible.builtin.apt:
name: chrony
state: present
- name: Le fichier doit déclarer le contrôleur de domaine comme source d'heure
ansible.builtin.lineinfile:
path: /etc/chrony/chrony.conf
line: server 192.168.10.177 iburst
Lance le script Bash trois fois : le fichier contient trois fois la même ligne, et chrony a redémarré trois fois. Lance les tâches Ansible trois fois : la première exécution installe le paquet et ajoute la ligne, les deux suivantes constatent que tout est déjà en place et ne touchent à rien.
L'idempotence
Une opération est idempotente quand l'appliquer une fois ou plusieurs fois donne le même résultat. C'est la propriété centrale de la gestion de configuration : tu peux relancer un playbook autant de fois que tu veux, sur des serveurs neufs comme sur des serveurs déjà configurés, sans rien casser.
Pour chaque tâche, Ansible affiche l'un de ces statuts :
| Statut | Sens |
|---|---|
ok | L'état voulu était déjà là : rien n'a été modifié |
changed | L'état n'était pas le bon : Ansible a fait la modification |
failed | La tâche a échoué : Ansible s'arrête pour cet hôte |
skipped | La tâche a été sautée, parce qu'une condition était fausse |
unreachable | Ansible n'a pas pu se connecter à l'hôte |
L'idempotence ne tombe pas du ciel : elle vient des modules. Le module apt vérifie si le paquet est installé avant d'agir, lineinfile cherche la ligne avant de l'ajouter, user regarde si le compte existe. Dès que tu remplaces un module par une commande brute (command, shell), tu perds cette garantie, et c'est à toi de la reconstruire (chapitre 4).
Comment fonctionne Ansible
Ansible repose sur une architecture sans agent (agentless) et en mode poussé (push) : rien n'est installé sur les machines gérées, c'est la machine d'administration qui se connecte à elles et leur pousse le travail.
- Le nœud de contrôle (control node) est la machine où Ansible est installé et d'où tu lances les commandes. Chez Sorbier, c'est le bastion d'administration, une VM Debian 13. Il doit tourner sous Linux ou macOS : Windows ne peut pas être nœud de contrôle, sauf à travers WSL.
- Les nœuds gérés (managed nodes) sont les machines qu'Ansible configure : serveurs Linux et Windows, switchs, pare-feu, hyperviseurs.
- L'inventaire est la liste des nœuds gérés, rangés en groupes (chapitre 3).
- Un playbook est un fichier YAML qui dit quelles tâches appliquer à quels groupes (chapitre 5).
- Un module est l'unité de travail : un petit programme qui sait faire une chose de façon idempotente (installer un paquet, déposer un fichier, créer un compte).
Ce qui se passe quand Ansible exécute une tâche sur un serveur Linux :
- Ansible lit l'inventaire, résout les variables de l'hôte et prépare le module avec ses arguments.
- Il ouvre une connexion SSH avec le compte prévu (OpenSSH du système, avec tes clés et ton fichier
~/.ssh/config). - Il dépose le module dans un dossier temporaire de l'hôte (
~/.ansible/tmp), ou le passe directement à l'interpréteur si le pipelining est activé (chapitre 2). - Le Python du serveur exécute le module, qui compare l'état réel à l'état demandé, agit si besoin et renvoie un résultat en JSON (
changed,failed, valeurs utiles). - Ansible supprime les fichiers temporaires, affiche le statut et passe à la tâche suivante.
Ansible traite plusieurs hôtes en parallèle : par défaut 5 à la fois (le réglage forks). Une tâche est exécutée sur tous les hôtes visés avant de passer à la suivante : c'est la stratégie linear, celle par défaut.
Ce qu'il faut sur chaque famille de machines :
| Nœud géré | Connexion | Ce qu'il doit avoir |
|---|---|---|
| Linux, BSD, macOS | SSH (port 22) | Un serveur SSH et Python 3 (déjà présents sur Debian 13) |
| Windows Server, Windows 10 et 11 | WinRM (ports 5985, 5986) ou SSH | PowerShell 5.1 (fourni), WinRM activé ou OpenSSH Server (chapitre 10) |
| Switchs, routeurs | SSH vers la ligne de commande (network_cli), ou une API | SSH activé et un compte ; rien d'autre, les modules tournent sur le nœud de contrôle (chapitre 12) |
| Hyperviseur, cloud, application | API HTTPS | Un compte ou un jeton d'API (chapitre 13) |
Le vocabulaire d'Ansible
| Terme | Définition | Exemple chez Sorbier |
|---|---|---|
| Nœud de contrôle | La machine où Ansible est installé | Le bastion, 192.168.10.210 |
| Nœud géré | Une machine configurée par Ansible | srv-web, srv-ad, sw-etage1 |
| Inventaire | La liste des nœuds gérés, en groupes, avec leurs variables | inventaire/hosts.yml |
| Module | Le programme qui réalise une action idempotente | ansible.builtin.apt, ansible.windows.win_feature |
| Tâche (task) | Un appel de module avec ses arguments, et un nom | « Installer Apache » |
| Play | Un ensemble de tâches appliqué à un groupe d'hôtes | « Configurer les serveurs web » |
| Playbook | Un fichier YAML qui contient un ou plusieurs plays | site.yml |
| Handler | Une tâche lancée seulement si une autre l'a notifiée | « Recharger Apache » |
| Fact | Une information collectée sur l'hôte | Distribution, adresses IP, mémoire |
| Rôle | Un dossier qui range tâches, variables, fichiers et handlers pour les réutiliser | socle, web |
| Collection | Un paquet de modules, de plugins et de rôles, distribué par Ansible Galaxy | community.general, microsoft.ad |
Le nom complet d'un module s'écrit espace.collection.module : c'est le FQCN (fully qualified collection name). ansible.builtin.copy est le module copy de la collection builtin, livrée avec ansible-core. Écris toujours le FQCN : c'est sans ambiguïté, et ansible-lint l'exige.
Ansible face aux autres outils
Ansible a été créé en 2012 par Michael DeHaan, racheté par Red Hat en 2015, et Red Hat appartient à IBM depuis 2019. Le moteur, ansible-core, est un logiciel libre sous licence GPL v3, gratuit. Red Hat vend une offre commerciale, Red Hat Ansible Automation Platform, qui ajoute une interface web, la planification, la gestion fine des droits et le support. Son projet amont libre s'appelle AWX (dernière version publiée en juillet 2024) ; d'autres interfaces libres existent, comme Semaphore UI.
| Outil | Ce qu'il fait | Agent sur les machines | Langage | Où tu le croises |
|---|---|---|---|---|
| Scripts Bash et PowerShell | Enchaîner des commandes | Non | Bash, PowerShell | Partout, pour les tâches ponctuelles (cours Scripts) |
| Ansible | Configurer des machines existantes, orchestrer des déploiements | Non (SSH, WinRM, API) | YAML et Jinja2 | PME, administrations, équipes réseau, laboratoires SISR |
| Puppet | Maintenir une configuration en continu | Oui (l'agent tire sa configuration) | DSL Puppet | Grands parcs, entreprises historiques |
| Chef | Maintenir une configuration en continu | Oui | Ruby | Grands parcs |
| Salt | Configurer et exécuter à grande échelle | Oui en général (minion), mode SSH possible | YAML et Jinja2 | Grands parcs |
| Terraform, OpenTofu | Créer l'infrastructure : VM, réseaux, ressources cloud | Non (API) | HCL | Cloud, hyperviseurs (chapitre 14) |
| GPO | Appliquer des réglages aux postes et serveurs Windows du domaine | Client intégré à Windows | Interface graphique | Parcs Windows (cours Windows Server) |
Les outils à agent (Puppet, Chef, Salt) fonctionnent en mode tiré (pull) : chaque machine interroge régulièrement un serveur central et corrige elle-même sa dérive. Ansible, en mode poussé, n'agit que quand tu le lances : pour corriger la dérive en continu, on le planifie (tâche cron, AWX, pipeline).
Ansible et le BTS SIO
Au BTS SIO, l'automatisation appartient à l'option SISR, dans le bloc 2 évalué à l'épreuve E6.
- La compétence « Exploiter, dépanner et superviser une solution d'infrastructure réseau » comprend la sous-compétence automatiser des tâches d'administration, dont l'indicateur est que l'automatisation réponde au besoin exprimé.
- L'environnement technologique exigé pour l'E6 SISR comprend un logiciel de gestion des configurations : Ansible en est l'exemple type, à côté de l'inventaire GLPI.
- Parmi les solutions dont il faut au moins une, le référentiel cite une solution gérée à l'aide de procédures automatisées écrites avec un langage de scripting.
Une réalisation professionnelle qui déploie des serveurs avec un dépôt Ansible versionné coche ces cases et donne à la commission quelque chose de concret à regarder : tu modifies une variable, tu relances, le serveur change, et la deuxième exécution n'affiche aucun changed. Le cours sur l'épreuve E6 SISR détaille les attendus ; le chapitre 15 dit quoi mettre dans ton dossier.
Exercices
Exercice 1 sur 3 Idempotent ou pas ? Réussi À revoir
Pour chaque action, dis si elle est idempotente telle qu'elle est écrite, et justifie en une phrase.
echo "nameserver 192.168.10.177" >> /etc/resolv.conf- La tâche Ansible
ansible.builtin.aptavecname: apache2etstate: present. useradd clambertsystemctl restart apache2- La tâche Ansible
ansible.builtin.lineinfileavecpath: /etc/hostsetline: "192.168.10.180 srv-journaux". mkdir -p /srv/sauvegardes
Voir la réponseMasquer la réponse de l'exercice 1
- Non :
>>ajoute la ligne à chaque exécution ; après trois passages, elle est là trois fois. - Oui : le module vérifie si le paquet est installé et ne fait rien s'il l'est.
- Non : la deuxième exécution échoue, car le compte existe déjà (
useradd: user 'clambert' already exists). - Non au sens d'Ansible : l'état final est le même (le service tourne), mais le service est coupé et relancé à chaque fois. Une modification qui interrompt le service à chaque passage, c'est exactement ce qu'on veut éviter ; en Ansible, on redémarre dans un handler, seulement après un changement.
- Oui :
lineinfilecherche la ligne et ne l'ajoute que si elle manque. - Oui : avec
-p,mkdirne fait rien et ne renvoie pas d'erreur si le dossier existe.
Tu avais trouvé ?
Exercice 2 sur 3 Le vocabulaire Réussi À revoir
Associe chaque élément à son terme : nœud de contrôle, nœud géré, inventaire, module, play, playbook, collection.
ansible.windows- Le fichier
site.yml, qui contient deux plays - Le bastion Debian 13 depuis lequel tu lances
ansible-playbook ansible.builtin.user- Le fichier qui dit que
srv-webfait partie du groupeserveurs_webet a l'adresse192.168.10.225 srv-fichiers- La partie de
site.ymlqui applique le rôlewebau groupeserveurs_web
Voir la réponseMasquer la réponse de l'exercice 2
- Collection (la collection Windows de l'espace
ansible). - Playbook.
- Nœud de contrôle.
- Module (le module
userde la collectionbuiltin). - Inventaire.
- Nœud géré.
- Play.
Tu avais trouvé ?
Exercice 3 sur 3 Le bon outil Réussi À revoir
Pour chaque besoin de Sorbier, propose l'outil le plus adapté parmi : script PowerShell lancé une fois, GPO, Ansible, Terraform ou OpenTofu. Justifie.
- Imposer un fond d'écran et verrouiller la session après 10 minutes sur tous les postes Windows du domaine.
- Installer et configurer le même socle (heure, comptes, SSH durci, pare-feu) sur les six serveurs Debian, et le garder identique dans le temps.
- Créer trois VM sur le cluster Proxmox VE à partir d'une description versionnée, et les supprimer à la fin du projet.
- Renommer une seule fois 40 fichiers d'un dossier selon une règle.
- Créer les 25 comptes Active Directory des saisonniers chaque printemps, à partir d'une liste.
Voir la réponseMasquer la réponse de l'exercice 3
- GPO : c'est un réglage de postes du domaine, appliqué et réappliqué en continu par Windows lui-même.
- Ansible : un état décrit une fois, appliqué à tous, relançable pour corriger la dérive.
- Terraform ou OpenTofu : leur métier est de créer et détruire des ressources d'infrastructure à partir d'une description, en gardant un état. Ansible sait aussi le faire (chapitre 13), mais il ne suit pas ce qu'il a créé.
- Script PowerShell (ou Bash) : une action ponctuelle, sans état à maintenir.
- Ansible, ou un script PowerShell bien écrit. Ansible a l'avantage de l'idempotence : relancé, il ne recrée pas les comptes existants, et la liste versionnée garde la trace de qui a été créé (chapitre 11).
Tu avais trouvé ?