Ansible : installation et prise en main
Configurer un serveur Ă la main, puis le suivant, puis le suivant, en espĂ©rant avoir fait exactement les mĂȘmes commandes Ă chaque fois â c’est la dĂ©finition mĂȘme du travail qui finit par vous exploser au visage un vendredi soir. Ansible automatise ce travail de façon reproductible, sans rien installer sur les machines gĂ©rĂ©es. Ce tutoriel couvre l’installation, l’inventaire, les commandes ad-hoc, l’Ă©criture de playbooks et les roles.
Le principe : agentless, en SSH, idempotent
Contrairement Ă des outils comme Puppet ou Chef qui nĂ©cessitent d’installer un agent sur chaque machine gĂ©rĂ©e, Ansible fonctionne en mode agentless : il se connecte simplement en SSH (ou WinRM pour Windows) depuis un « nĆud de contrĂŽle » vers les machines cibles, exĂ©cute des modules Python temporaires, puis nettoie derriĂšre lui. Rien Ă installer ni Ă maintenir sur les serveurs gĂ©rĂ©s, Ă part un client SSH et Python â dĂ©jĂ prĂ©sents sur l’immense majoritĂ© des systĂšmes Linux.
DeuxiĂšme principe fondamental : l’idempotence. Un playbook Ansible bien Ă©crit peut ĂȘtre exĂ©cutĂ© cent fois de suite sans effet de bord : s’il constate qu’un paquet est dĂ©jĂ installĂ© ou qu’un fichier a dĂ©jĂ le bon contenu, il ne fait rien et le signale comme tel (« ok », pas « changed »). C’est ce qui permet de rejouer sereinement une configuration sans craindre de casser quelque chose qui fonctionne dĂ©jĂ .
Installation
Plusieurs mĂ©thodes officielles existent ; pipx est aujourd’hui la mĂ©thode recommandĂ©e par la documentation Ansible pour installer l’outil dans un environnement isolĂ©, sans polluer le Python systĂšme :
# Avec pipx (recommandé)
sudo apt install pipx # ou : python3 -m pip install --user pipx
pipx ensurepath
pipx install --include-deps ansible
# Alternative : gestionnaire de paquets de la distribution
sudo apt install ansible # Debian/Ubuntu
sudo dnf install ansible # Fedora/RHEL
# Vérification
ansible --version
Notez la distinction entre ansible-core (le moteur minimal) et le paquet ansible complet, qui embarque en plus une large collection de modules communautaires â le paquet complet est le plus simple pour dĂ©marrer.
PrĂ©parer l’accĂšs SSH
- GĂ©nĂ©rez une paire de clĂ©s SSH dĂ©diĂ©e si vous n’en avez pas dĂ©jĂ une :
ssh-keygen -t ed25519. - Copiez la clé publique sur chaque machine à gérer :
ssh-copy-id utilisateur@serveur. - VĂ©rifiez que vous pouvez vous connecter sans mot de passe avant d’aller plus loin â Ansible dĂ©pend entiĂšrement de cet accĂšs SSH fonctionnel.
L’inventaire : dĂ©clarer vos machines
L’inventaire liste les machines gĂ©rĂ©es, organisĂ©es en groupes. Format INI simple (inventory.ini) :
[web]
web01.example.local
web02.example.local
[db]
db01.example.local
[production:children]
web
db
Un format YAML Ă©quivalent est Ă©galement possible et souvent prĂ©fĂ©rĂ© dans les projets plus structurĂ©s. Pour des infrastructures dynamiques (cloud, conteneurs), Ansible propose des inventaires dynamiques qui interrogent une API (AWS, Proxmox, etc.) au lieu d’un fichier statique.
Commandes ad-hoc : tester avant d’automatiser
Avant d’Ă©crire un playbook complet, une commande ad-hoc permet de vĂ©rifier rapidement une action ponctuelle :
# Tester la connectivité
ansible all -i inventory.ini -m ping
# Exécuter une commande shell sur un groupe
ansible web -i inventory.ini -m command -a "uptime"
# Installer un paquet (nécessite les droits élevés)
ansible web -i inventory.ini -m apt -a "name=curl state=present" --become
Le module ping ne fait pas un ping rĂ©seau classique : il vĂ©rifie que Python est disponible sur la cible et que la connexion SSH + les identifiants fonctionnent â un premier test indispensable aprĂšs toute nouvelle installation.
Ăcrire un premier playbook
Un playbook est un fichier YAML qui dĂ©crit un Ă©tat dĂ©sirĂ©, exĂ©cutĂ© dans l’ordre, tĂąche par tĂąche :
---
- name: Installer et démarrer Nginx
hosts: web
become: true
tasks:
- name: Installer le paquet nginx
ansible.builtin.apt:
name: nginx
state: present
update_cache: true
- name: Démarrer et activer le service
ansible.builtin.service:
name: nginx
state: started
enabled: true
- name: Déployer la page d'accueil
ansible.builtin.template:
src: templates/index.html.j2
dest: /var/www/html/index.html
notify: Recharger Nginx
handlers:
- name: Recharger Nginx
ansible.builtin.service:
name: nginx
state: reloaded
ExĂ©cution : ansible-playbook -i inventory.ini site.yml. Relancez-le une seconde fois : les tĂąches dĂ©jĂ satisfaites remontent en ok plutĂŽt qu’en changed â c’est l’idempotence en action, la preuve que le playbook ne casse rien Ă la relance.
Le handler illustre un autre concept clé : une action déclenchée uniquement si une tùche précédente a réellement changé quelque chose (ici, recharger Nginx seulement si la page a été modifiée), plutÎt que de la relancer systématiquement à chaque exécution.
Organiser en roles
DĂšs qu’un playbook grossit, les roles permettent de dĂ©couper la configuration en blocs rĂ©utilisables (un role « nginx », un role « postgresql », un role « durcissement-securite »âŠ) :
ansible-galaxy init roles/nginx
Cette commande gĂ©nĂšre l’arborescence standard (tasks/, handlers/, templates/, defaults/, vars/âŠ) que vous remplissez ensuite, puis rĂ©fĂ©rencez depuis un playbook :
---
- name: Configurer les serveurs web
hosts: web
become: true
roles:
- nginx
Protéger les secrets avec ansible-vault
Un mot de passe de base de donnĂ©es ou une clĂ© API n’a rien Ă faire en clair dans un playbook versionnĂ© sur Git. ansible-vault chiffre le contenu sensible :
# Créer un fichier chiffré
ansible-vault create group_vars/db/vault.yml
# Ăditer un fichier existant
ansible-vault edit group_vars/db/vault.yml
# Exécuter un playbook qui référence des variables chiffrées
ansible-playbook site.yml --ask-vault-pass
Bonnes pratiques
- Versionnez vos playbooks dans Git, mais jamais le mot de passe vault en clair â utilisez un fichier de mot de passe hors dĂ©pĂŽt ou un gestionnaire de secrets externe.
- Testez d’abord en mode
--check(simulation Ă blanc) sur un environnement non critique avant d’exĂ©cuter un nouveau playbook en production. - Utilisez des tags (
--tags) pour n’exĂ©cuter qu’une partie ciblĂ©e d’un long playbook pendant le dĂ©veloppement, sans tout rejouer. - Documentez vos roles (README, valeurs par dĂ©faut commentĂ©es dans
defaults/main.yml) â un role sans documentation redevient une boĂźte noire dĂšs que quelqu’un d’autre (ou vous, six mois plus tard) doit le rĂ©utiliser.
Une fois cette base maĂźtrisĂ©e en ligne de commande, l’Ă©tape naturelle suivante pour une Ă©quipe est de piloter ces mĂȘmes playbooks depuis une interface web centralisĂ©e avec RBAC, planification et journalisation â c’est exactement le rĂŽle d’AWX, couvert dans le tutoriel suivant.