Pourquoi automatiser l'infrastructure IT ?
Dans un monde où les infrastructures informatiques deviennent de plus en plus complexes, l'automatisation n'est plus un luxe mais une nécessité absolue. Imaginez devoir configurer manuellement 50, 100 ou même 1000 serveurs : installer les mêmes paquets, appliquer les mêmes configurations de sécurité, déployer les mêmes applications. Non seulement cette approche manuelle est chronophage, mais elle est aussi source d'erreurs humaines qui peuvent avoir des conséquences désastreuses en production.
C'est précisément dans ce contexte qu'Ansible s'impose comme l'un des outils d'automatisation les plus populaires et les plus accessibles du marché. Développé initialement par Michael DeHaan en 2012, puis racheté par Red Hat en 2015, Ansible est aujourd'hui utilisé par des milliers d'entreprises à travers le monde, des startups aux grandes multinationales.
Architecture en un coup d'œil

Dans cet article, nous allons explorer en profondeur ce qu'est Ansible, comment il fonctionne, et pourquoi il devrait faire partie de votre boîte à outils DevOps.
Qu'est-ce qu'Ansible exactement ?
Ansible est un outil d'automatisation IT open source qui permet de gérer la configuration des systèmes, le déploiement d'applications et l'orchestration de tâches complexes. Il se distingue par sa simplicité d'utilisation et son approche agentless (sans agent), ce qui signifie qu'il ne nécessite aucune installation de logiciel supplémentaire sur les machines cibles.
Concrètement, Ansible vous permet de :
- Configurer des serveurs de manière automatisée et reproductible
- Déployer des applications sur un ou plusieurs serveurs simultanément
- Orchestrer des workflows complexes impliquant plusieurs systèmes
- Gérer la conformité de votre infrastructure selon des standards définis
- Provisionner des ressources cloud sur AWS, Azure, GCP et bien d'autres
Ansible utilise YAML (Yet Another Markup Language) comme langage de description, ce qui le rend extrêmement lisible même pour des personnes qui ne sont pas développeurs. Contrairement à des outils comme Puppet ou Chef qui utilisent des langages spécifiques (DSL), un playbook Ansible peut être compris par quiconque sait lire de l'anglais structuré.
L'architecture agentless : le point fort d'Ansible
L'un des avantages majeurs d'Ansible par rapport à ses concurrents réside dans son architecture agentless. Mais qu'est-ce que cela signifie concrètement ?
Pas d'agent sur les machines cibles
Contrairement à des outils comme Puppet, Chef ou SaltStack (en mode agent), Ansible n'exige aucune installation de logiciel client sur les machines que vous souhaitez gérer. Il se connecte simplement via SSH (pour les systèmes Linux/Unix) ou WinRM (pour les systèmes Windows) pour exécuter ses tâches.
Cette approche présente plusieurs avantages considérables :
- Simplicité de déploiement : pas besoin d'installer et de maintenir un agent sur chaque machine
- Sécurité renforcée : moins de surface d'attaque puisqu'il n'y a pas de service supplémentaire en écoute
- Maintenance réduite : pas de mises à jour d'agent à gérer, pas de certificats à renouveler
- Compatibilité large : fonctionne avec tout système accessible en SSH, y compris les équipements réseau
Le fonctionnement en mode push
Ansible fonctionne en mode push : c'est la machine de contrôle (votre poste de travail ou un serveur dédié) qui pousse les configurations vers les machines cibles. Ce modèle est plus intuitif que le mode pull utilisé par d'autres outils, où les agents viennent récupérer leur configuration auprès d'un serveur central.
En résumé, pour utiliser Ansible, il vous suffit d'avoir Python installé sur les machines cibles (ce qui est le cas par défaut sur la plupart des distributions Linux) et un accès SSH. C'est tout.
Les concepts fondamentaux d'Ansible
Pour bien comprendre Ansible, il est essentiel de maîtriser ses concepts clés. Voici les briques fondamentales de l'écosystème Ansible.
L'inventaire (Inventory)
L'inventaire est un fichier qui liste toutes les machines que vous souhaitez gérer avec Ansible. Il peut être au format INI ou YAML et permet de regrouper les hôtes par catégories logiques (serveurs web, bases de données, serveurs de staging, production, etc.).
# Exemple d'inventaire au format YAML
all:
children:
webservers:
hosts:
web1.codeclan.fr:
web2.codeclan.fr:
databases:
hosts:
db1.codeclan.fr:
ansible_port: 2222
db2.codeclan.fr:
loadbalancers:
hosts:
lb1.codeclan.fr:L'inventaire peut également être dynamique, généré automatiquement à partir de sources comme AWS EC2, Azure, Google Cloud ou même une base de données. Cette fonctionnalité est particulièrement utile dans les environnements cloud où les serveurs sont créés et détruits fréquemment.
Les Playbooks
Les playbooks sont le cœur d'Ansible. Ce sont des fichiers YAML qui décrivent l'état désiré de vos systèmes et les actions à effectuer pour y parvenir. Un playbook est composé d'un ou plusieurs plays, qui eux-mêmes contiennent des tasks (tâches).
Chaque tâche utilise un module Ansible pour effectuer une action spécifique : installer un paquet, copier un fichier, démarrer un service, créer un utilisateur, etc.
Les Modules
Les modules sont les unités de travail d'Ansible. Il en existe des milliers, couvrant un spectre très large de fonctionnalités :
- apt / yum / dnf : gestion des paquets
- copy / template : gestion des fichiers
- service / systemd : gestion des services
- user / group : gestion des utilisateurs
- docker_container : gestion des conteneurs Docker
- aws_ec2 / azure_rm : gestion des ressources cloud
- mysql_db / postgresql_db : gestion des bases de données
Vous pouvez également développer vos propres modules en Python si les modules existants ne couvrent pas vos besoins spécifiques.
Les Rôles (Roles)
Les rôles sont un moyen d'organiser et de réutiliser votre code Ansible. Un rôle encapsule un ensemble de tâches, de fichiers, de templates et de variables dans une structure de répertoires standardisée. Pensez aux rôles comme à des composants réutilisables que vous pouvez partager entre différents projets.
Par exemple, vous pourriez avoir un rôle nginx qui installe et configure Nginx, un rôle postgresql pour PostgreSQL, et un rôle firewall pour la configuration du pare-feu. Ces rôles peuvent ensuite être combinés dans différents playbooks selon vos besoins.
Les Facts
Les facts sont des informations collectées automatiquement par Ansible sur les machines cibles au début de chaque exécution. Ils incluent des données comme le système d'exploitation, l'adresse IP, la mémoire disponible, le nombre de processeurs, les partitions de disque, etc.
Ces facts peuvent être utilisés dans vos playbooks pour adapter le comportement en fonction des caractéristiques de chaque machine. Par exemple, vous pouvez installer un paquet avec apt sur Debian/Ubuntu et avec yum sur CentOS/RHEL en vous basant sur le fact ansible_os_family.
L'idempotence : un concept crucial
L'un des principes les plus importants d'Ansible est l'idempotence. Ce terme, emprunté aux mathématiques, signifie qu'une opération peut être appliquée plusieurs fois sans changer le résultat au-delà de la première application.
En pratique, cela veut dire que si vous exécutez un playbook Ansible deux fois de suite, la deuxième exécution ne modifiera rien si le système est déjà dans l'état désiré. Ansible vérifie d'abord l'état actuel du système avant d'effectuer une action. Si le paquet est déjà installé, il ne le réinstalle pas. Si le fichier de configuration est déjà correct, il ne le modifie pas.
Ce comportement est fondamental car il vous permet de :
- Exécuter vos playbooks en toute sécurité, même sur des systèmes déjà configurés
- Garantir la cohérence de votre infrastructure à tout moment
- Détecter les dérives de configuration en observant les changements lors d'une ré-exécution
- Utiliser Ansible en mode vérification (
--check) pour simuler sans modifier
L'idempotence est ce qui différencie un outil de gestion de configuration comme Ansible d'un simple script bash. Un script bash exécutera les mêmes commandes à chaque fois, potentiellement causant des erreurs ou des comportements inattendus. Ansible, lui, s'assure toujours que l'état final est celui que vous avez défini.
Ansible vs scripts Bash : pourquoi changer ?
Beaucoup d'administrateurs système utilisent encore des scripts Bash pour automatiser leurs tâches. Bien que les scripts Bash soient puissants et flexibles, Ansible offre des avantages significatifs pour la gestion d'infrastructure à grande échelle.
Les limites des scripts Bash
- Pas d'idempotence native : vous devez coder manuellement les vérifications
- Gestion d'erreurs complexe : le traitement des cas d'erreur rend les scripts volumineux
- Difficile à maintenir : les scripts deviennent rapidement illisibles quand ils grandissent
- Pas de parallélisme intégré : gérer plusieurs serveurs simultanément nécessite du code supplémentaire
- Pas de rapport d'exécution : difficile de savoir ce qui a changé et ce qui n'a pas changé
- Dépendant de la distribution : les commandes varient entre Debian, CentOS, etc.
Les avantages d'Ansible
- Idempotence intégrée : chaque module gère nativement la vérification d'état
- Lisibilité : le YAML est facile à lire et à comprendre
- Parallélisme : Ansible peut gérer des dizaines de serveurs simultanément
- Abstraction : un même playbook fonctionne sur différentes distributions
- Rapports détaillés : chaque exécution produit un résumé clair (ok, changed, failed)
- Écosystème riche : des milliers de modules et rôles prêts à l'emploi
- Communauté active : documentation abondante, forums, Ansible Galaxy
Cas d'usage concrets d'Ansible
Ansible brille dans de nombreux scénarios. Voici les cas d'utilisation les plus courants rencontrés en entreprise.
Configuration de serveurs (Configuration Management)
Le cas d'usage le plus classique d'Ansible est la gestion de configuration. Vous définissez l'état désiré de vos serveurs dans des playbooks, et Ansible s'assure que cet état est maintenu. Installation de paquets, configuration de services, gestion des utilisateurs, paramétrage du réseau, durcissement de la sécurité : tout peut être automatisé et versionné dans Git.
Déploiement d'applications
Ansible peut orchestrer le déploiement complet d'une application : récupération du code source, compilation, arrêt du service, mise à jour des fichiers, migration de base de données, redémarrage du service, vérification de santé. Le tout de manière séquentielle ou en rolling update pour garantir la disponibilité.
Orchestration multi-tiers
Pour les architectures complexes impliquant plusieurs couches (load balancers, serveurs web, serveurs d'application, bases de données), Ansible permet d'orchestrer les actions dans le bon ordre. Par exemple, retirer un serveur du load balancer, le mettre à jour, vérifier qu'il fonctionne, puis le remettre dans le pool.
Conformité et sécurité (Compliance)
Ansible peut vérifier et appliquer des politiques de sécurité sur l'ensemble de votre parc. Conformité CIS benchmarks, vérification des permissions de fichiers, audit des utilisateurs, application des correctifs de sécurité : Ansible peut automatiser toutes ces tâches de conformité et générer des rapports.
Provisionnement cloud
Grâce à ses modules cloud, Ansible peut créer et gérer des ressources sur AWS, Azure, Google Cloud, OpenStack et bien d'autres plateformes. Création d'instances, configuration de réseaux, gestion de groupes de sécurité, tout cela directement depuis vos playbooks.
YAML : le langage d'Ansible
Ansible utilise YAML comme format pour ses fichiers de configuration. YAML est un format de sérialisation de données conçu pour être lisible par les humains. Voici les bases de la syntaxe YAML que vous devez connaître pour travailler avec Ansible.
Les règles essentielles du YAML sont :
- L'indentation se fait avec des espaces (jamais des tabulations), généralement 2 espaces
- Les listes utilisent le tiret
- - Les dictionnaires utilisent le format
clé: valeur - Les chaînes de caractères n'ont généralement pas besoin de guillemets
- Les commentaires commencent par
#
# Ceci est un commentaire YAML
# Exemple de structure YAML pour Ansible
nom: "Mon Application"
version: 2.1
actif: true
serveurs:
- nom: web1
ip: 192.168.1.10
role: frontend
- nom: db1
ip: 192.168.1.20
role: backend
configuration:
port: 8080
debug: false
langages:
- python
- javascript
- goLa communauté et l'écosystème Ansible
Ansible bénéficie d'une communauté extrêmement active et d'un écosystème riche qui contribuent à sa popularité.
Red Hat et Ansible Automation Platform
Depuis le rachat par Red Hat en 2015, Ansible dispose d'un support entreprise via Ansible Automation Platform (anciennement Ansible Tower). Cette plateforme ajoute une interface web, un contrôle d'accès basé sur les rôles (RBAC), la planification des tâches, la gestion centralisée des inventaires et des credentials, ainsi que des tableaux de bord et des rapports.
Ansible Galaxy
Ansible Galaxy est le hub communautaire où les utilisateurs partagent des rôles et des collections. Vous y trouverez des milliers de rôles prêts à l'emploi pour installer et configurer pratiquement n'importe quel logiciel. Au lieu de réinventer la roue, vous pouvez utiliser un rôle existant et l'adapter à vos besoins.
Les Collections
Depuis Ansible 2.10, les collections sont le nouveau format de distribution pour les modules, plugins et rôles. Elles permettent un versionning indépendant et une distribution plus flexible via Ansible Galaxy ou des dépôts privés.
Votre premier playbook : Hello World
Il est temps de passer à la pratique avec un premier playbook simple. Ce playbook va vérifier la connectivité avec vos serveurs et afficher un message de bienvenue.
---
# hello_world.yml - Mon premier playbook Ansible
- name: Mon premier playbook Ansible
hosts: all
gather_facts: true
tasks:
- name: Afficher un message de bienvenue
ansible.builtin.debug:
msg: "Bonjour depuis {{ inventory_hostname }} ! Le système est {{ ansible_os_family }}."
- name: Vérifier que Python est installé
ansible.builtin.command: python3 --version
register: python_version
changed_when: false
- name: Afficher la version de Python
ansible.builtin.debug:
msg: "Python installé : {{ python_version.stdout }}"
- name: Créer un fichier de test
ansible.builtin.copy:
content: |
Bienvenue sur {{ inventory_hostname }}
Ce fichier a été créé par Ansible
Date de création : {{ ansible_date_time.iso8601 }}
Système : {{ ansible_distribution }} {{ ansible_distribution_version }}
dest: /tmp/ansible_hello.txt
mode: '0644'
- name: Vérifier que le fichier a été créé
ansible.builtin.stat:
path: /tmp/ansible_hello.txt
register: fichier_test
- name: Confirmer la création du fichier
ansible.builtin.debug:
msg: "Le fichier a bien été créé ! Taille : {{ fichier_test.stat.size }} octets"
when: fichier_test.stat.existsPour exécuter ce playbook, il vous suffit de lancer la commande suivante :
ansible-playbook -i inventaire.yml hello_world.ymlVous verrez alors Ansible se connecter à chaque machine de votre inventaire, collecter les facts, puis exécuter chaque tâche en affichant le résultat (ok, changed ou failed) en temps réel.
Un exemple plus concret : installer et configurer Nginx
Pour illustrer la puissance d'Ansible dans un scénario réel, voici un playbook qui installe et configure un serveur web Nginx.
---
# install_nginx.yml - Installation et configuration de Nginx
- name: Installer et configurer Nginx
hosts: webservers
become: true
gather_facts: true
vars:
nginx_port: 80
site_name: "mon-site.codeclan.fr"
document_root: "/var/www/{{ site_name }}"
tasks:
- name: Mettre à jour le cache des paquets
ansible.builtin.apt:
update_cache: true
cache_valid_time: 3600
when: ansible_os_family == "Debian"
- name: Installer Nginx
ansible.builtin.package:
name: nginx
state: present
- name: Créer le répertoire du site
ansible.builtin.file:
path: "{{ document_root }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Créer une page d'accueil
ansible.builtin.copy:
content: |
<html>
<head><title>{{ site_name }}</title></head>
<body>
<h1>Bienvenue sur {{ site_name }}</h1>
<p>Ce site est déployé automatiquement avec Ansible.</p>
</body>
</html>
dest: "{{ document_root }}/index.html"
owner: www-data
group: www-data
mode: '0644'
- name: Démarrer et activer Nginx
ansible.builtin.service:
name: nginx
state: started
enabled: true
- name: Vérifier que Nginx répond
ansible.builtin.uri:
url: "http://localhost:{{ nginx_port }}"
status_code: 200
register: result
retries: 3
delay: 5
until: result.status == 200Ce playbook illustre plusieurs concepts importants : l'utilisation de variables, les conditions basées sur les facts, l'idempotence des modules, et la vérification post-déploiement.
Conclusion : par où commencer ?
Ansible est un outil puissant mais accessible qui peut transformer radicalement votre façon de gérer l'infrastructure IT. Sa courbe d'apprentissage est relativement douce grâce à sa syntaxe YAML lisible et son approche agentless qui simplifie le déploiement initial.
Pour bien démarrer avec Ansible, nous vous recommandons de suivre ces étapes :
- Installer Ansible sur votre machine locale (nous verrons cela en détail dans notre prochain article)
- Définir un inventaire avec quelques machines de test (des VM locales ou des conteneurs suffisent)
- Pratiquer avec les commandes ad-hoc pour vous familiariser avec les modules
- Écrire vos premiers playbooks simples puis augmenter progressivement la complexité
- Explorer Ansible Galaxy pour découvrir les rôles de la communauté
- Versionner vos playbooks dans Git dès le début
L'automatisation avec Ansible est un investissement qui se rentabilise rapidement. Le temps passé à écrire des playbooks est largement compensé par le temps gagné sur les tâches répétitives, la réduction des erreurs humaines et la capacité à gérer un parc informatique de manière cohérente et reproductible.
Dans le prochain article de cette série, nous verrons en détail comment installer et configurer Ansible sur les différentes plateformes Linux et macOS. Restez connectés !