Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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éthodeCe qu'elle garantitSa limite
À la main, avec une procédureRien : tout dépend de l'attention de la personneLente, sujette aux oublis et à la dérive
Script Bash ou PowerShellLes mêmes commandes, dans le même ordreDécrit des actions ; ne sait pas toujours si elles sont déjà faites
AnsibleUn état décrit, vérifié et appliqué seulement là où il manqueDemande 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 :

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 :

yaml
# 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 :

StatutSens
okL'état voulu était déjà là : rien n'a été modifié
changedL'état n'était pas le bon : Ansible a fait la modification
failedLa tâche a échoué : Ansible s'arrête pour cet hôte
skippedLa tâche a été sautée, parce qu'une condition était fausse
unreachableAnsible n'a pas pu se connecter à l'hôte
1re exécution : serveur neuf2e exécution : juste aprèsInstaller chronychangedDéposer chrony.confchangedCréer le compte clambertchangedActiver le pare-feuchangedok=5 changed=4Installer chronyokDéposer chrony.confokCréer le compte clambertokActiver le pare-feuokok=5 changed=0Un playbook idempotent se relance sans risque : seul ce qui manque est modifié.
Un playbook idempotent : la première exécution modifie, la deuxième constate que tout est en place

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).
Nœud de contrôlebastion, Debian 13InventairePlaybooks et rôlesansible-core 2.22CollectionsServeurs Linuxsrv-journaux, srv-webSSH, port 22modules PythonServeurs Windowssrv-ad, srv-ad2, srv-fichiersWinRM HTTPS 5986 ou SSHmodules PowerShellSwitchs Ciscosw-etage1, sw-etage2SSH, network_climodule sur le contrôleurProxmox VEpve1 à pve3API HTTPS, port 8006module sur le contrôleurAucun agent installé sur les nœuds gérés
Un nœud de contrôle, des nœuds gérés sans agent, un moyen de connexion adapté à chaque famille de machines

Ce qui se passe quand Ansible exécute une tâche sur un serveur Linux :

  1. Ansible lit l'inventaire, résout les variables de l'hôte et prépare le module avec ses arguments.
  2. Il ouvre une connexion SSH avec le compte prévu (OpenSSH du système, avec tes clés et ton fichier ~/.ssh/config).
  3. 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).
  4. 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).
  5. 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éConnexionCe qu'il doit avoir
Linux, BSD, macOSSSH (port 22)Un serveur SSH et Python 3 (déjà présents sur Debian 13)
Windows Server, Windows 10 et 11WinRM (ports 5985, 5986) ou SSHPowerShell 5.1 (fourni), WinRM activé ou OpenSSH Server (chapitre 10)
Switchs, routeursSSH vers la ligne de commande (network_cli), ou une APISSH activé et un compte ; rien d'autre, les modules tournent sur le nœud de contrôle (chapitre 12)
Hyperviseur, cloud, applicationAPI HTTPSUn compte ou un jeton d'API (chapitre 13)

Le vocabulaire d'Ansible

TermeDéfinitionExemple chez Sorbier
Nœud de contrôleLa machine où Ansible est installéLe bastion, 192.168.10.210
Nœud géréUne machine configurée par Ansiblesrv-web, srv-ad, sw-etage1
InventaireLa liste des nœuds gérés, en groupes, avec leurs variablesinventaire/hosts.yml
ModuleLe programme qui réalise une action idempotenteansible.builtin.apt, ansible.windows.win_feature
Tâche (task)Un appel de module avec ses arguments, et un nom« Installer Apache »
PlayUn ensemble de tâches appliqué à un groupe d'hôtes« Configurer les serveurs web »
PlaybookUn fichier YAML qui contient un ou plusieurs playssite.yml
HandlerUne tâche lancée seulement si une autre l'a notifiée« Recharger Apache »
FactUne information collectée sur l'hôteDistribution, adresses IP, mémoire
RôleUn dossier qui range tâches, variables, fichiers et handlers pour les réutilisersocle, web
CollectionUn paquet de modules, de plugins et de rôles, distribué par Ansible Galaxycommunity.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.

OutilCe qu'il faitAgent sur les machinesLangageOù tu le croises
Scripts Bash et PowerShellEnchaîner des commandesNonBash, PowerShellPartout, pour les tâches ponctuelles (cours Scripts)
AnsibleConfigurer des machines existantes, orchestrer des déploiementsNon (SSH, WinRM, API)YAML et Jinja2PME, administrations, équipes réseau, laboratoires SISR
PuppetMaintenir une configuration en continuOui (l'agent tire sa configuration)DSL PuppetGrands parcs, entreprises historiques
ChefMaintenir une configuration en continuOuiRubyGrands parcs
SaltConfigurer et exécuter à grande échelleOui en général (minion), mode SSH possibleYAML et Jinja2Grands parcs
Terraform, OpenTofuCréer l'infrastructure : VM, réseaux, ressources cloudNon (API)HCLCloud, hyperviseurs (chapitre 14)
GPOAppliquer des réglages aux postes et serveurs Windows du domaineClient intégré à WindowsInterface graphiqueParcs 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.

  1. echo "nameserver 192.168.10.177" >> /etc/resolv.conf
  2. La tâche Ansible ansible.builtin.apt avec name: apache2 et state: present.
  3. useradd clambert
  4. systemctl restart apache2
  5. La tâche Ansible ansible.builtin.lineinfile avec path: /etc/hosts et line: "192.168.10.180 srv-journaux".
  6. mkdir -p /srv/sauvegardes
Voir la réponseMasquer la réponse de l'exercice 1
  1. Non : >> ajoute la ligne à chaque exécution ; après trois passages, elle est là trois fois.
  2. Oui : le module vérifie si le paquet est installé et ne fait rien s'il l'est.
  3. Non : la deuxième exécution échoue, car le compte existe déjà (useradd: user 'clambert' already exists).
  4. 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.
  5. Oui : lineinfile cherche la ligne et ne l'ajoute que si elle manque.
  6. Oui : avec -p, mkdir ne 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.

  1. ansible.windows
  2. Le fichier site.yml, qui contient deux plays
  3. Le bastion Debian 13 depuis lequel tu lances ansible-playbook
  4. ansible.builtin.user
  5. Le fichier qui dit que srv-web fait partie du groupe serveurs_web et a l'adresse 192.168.10.225
  6. srv-fichiers
  7. La partie de site.yml qui applique le rôle web au groupe serveurs_web
Voir la réponseMasquer la réponse de l'exercice 2
  1. Collection (la collection Windows de l'espace ansible).
  2. Playbook.
  3. Nœud de contrôle.
  4. Module (le module user de la collection builtin).
  5. Inventaire.
  6. Nœud géré.
  7. 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.

  1. Imposer un fond d'écran et verrouiller la session après 10 minutes sur tous les postes Windows du domaine.
  2. 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.
  3. Créer trois VM sur le cluster Proxmox VE à partir d'une description versionnée, et les supprimer à la fin du projet.
  4. Renommer une seule fois 40 fichiers d'un dossier selon une règle.
  5. 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
  1. GPO : c'est un réglage de postes du domaine, appliqué et réappliqué en continu par Windows lui-même.
  2. Ansible : un état décrit une fois, appliqué à tous, relançable pour corriger la dérive.
  3. 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éé.
  4. Script PowerShell (ou Bash) : une action ponctuelle, sans état à maintenir.
  5. 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é ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Installer Ansible et préparer les serveursRevoir le sommaire du cours