Ansible : Tout ce que vous devez savoir pour commencer

Ansible est l’un des outils d’automatisation les plus populaires dans le monde de l’IT et du DevOps. Sa simplicité, sa puissance et son approche sans agent en font un choix privilégié pour automatiser la configuration des serveurs, le déploiement d’applications et l’orchestration de tâches complexes. Que vous soyez débutant ou que vous cherchiez à approfondir vos connaissances, cet article vous guidera à travers la structure, le vocabulaire et l’environnement d’Ansible pour vous permettre de maîtriser cet outil essentiel.

1. Qu’est-ce qu’Ansible ?

Ansible est un outil d’automatisation open-source qui permet de gérer des infrastructures informatiques de manière simple et efficace. Il est utilisé pour :

  • Automatiser la configuration des serveurs (Configuration Management).
  • Déployer des applications (Application Deployment).
  • Orchestrer des tâches complexes (Orchestration).
  • Automatiser les workflows IT (IT Automation).

Ansible se distingue par son approche sans agent : il utilise SSH pour communiquer avec les serveurs, ce qui le rend léger et facile à déployer.

2. La Structure d’Ansible

Pour comprendre Ansible, il est essentiel de maîtriser sa structure. Voici les composants clés :

2.1 Inventaire (Inventory)

L’inventaire est un fichier qui liste les hôtes (serveurs) sur lesquels Ansible va agir. Il peut être écrit en format INI ou YAML. Les hôtes peuvent être organisés en groupes pour une gestion plus facile.

Exemple d’inventaire en format INI :

[webservers]
server1.example.com
server2.example.com

[dbservers]
db1.example.com
db2.example.com

Exemple d’inventaire en format YAML :

all:
  hosts:
    server1.example.com:
    server2.example.com:
  children:
    webservers:
      hosts:
        server1.example.com:
        server2.example.com:
    dbservers:
      hosts:
        db1.example.com:
        db2.example.com:

2.2 Playbooks

Les playbooks sont au cœur d’Ansible. Ce sont des fichiers YAML qui décrivent les tâches à exécuter sur les hôtes. Un playbook contient une ou plusieurs plays, chaque play ciblant un groupe d’hôtes et définissant des tasks (tâches).

Exemple de playbook simple :

- hosts: webservers
  tasks:
    - name: Ensure Apache is installed
      apt:
        name: apache2
        state: present

    - name: Ensure Apache is running
      service:
        name: apache2
        state: started

2.3 Modules

Les modules sont les unités de travail dans Ansible. Chaque module effectue une action spécifique, comme installer un paquet, démarrer un service ou copier un fichier. Ansible dispose de centaines de modules intégrés, et vous pouvez également écrire vos propres modules.

Exemples de modules courants :

  • apt : Gère les paquets sur les systèmes Debian/Ubuntu.
  • yum : Gère les paquets sur les systèmes Red Hat/CentOS.
  • copy : Copie des fichiers sur les hôtes distants.
  • service : Gère les services (démarrage, arrêt, etc.).

2.4 Rôles (Roles)

Les rôles permettent d’organiser les playbooks de manière modulaire. Un rôle peut inclure des tâches, des variables, des fichiers, des templates et des handlers. Cela facilite la réutilisation du code et rend les playbooks plus lisibles.

Structure typique d’un rôle :

roles/
  common/
    tasks/
    handlers/
    files/
    templates/
    vars/
    defaults/
    meta/

2.5 Templates

Ansible utilise le moteur de templates Jinja2 pour générer des fichiers de configuration dynamiques. Les templates permettent d’insérer des variables et des conditions dans les fichiers de configuration.

Exemple de template Jinja2 :

server {
    listen 80;
    server_name {{ server_name }};
    root {{ document_root }};
}

2.6 Variables

Les variables permettent de rendre les playbooks plus flexibles. Elles peuvent être définies dans plusieurs endroits : dans les playbooks, les rôles, l’inventaire ou des fichiers de variables séparés.

Exemple de définition de variables :

- hosts: webservers
vars:
http_port: 80
max_clients: 200
tasks:
- name: Ensure Apache is configured
template:
src: templates/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf

3. Le Vocabulaire d’Ansible

Voici quelques termes clés à connaître pour bien comprendre Ansible :

  • Task : Une action spécifique à exécuter, comme installer un paquet ou copier un fichier.
  • Play : Un ensemble de tâches appliquées à un groupe d’hôtes.
  • Handler : Une tâche qui ne s’exécute que si elle est notifiée par une autre tâche (par exemple, redémarrer un service après une mise à jour).
  • Facts : Des informations collectées sur les hôtes (comme l’OS, l’adresse IP, etc.) qui peuvent être utilisées dans les playbooks.
  • Ad-Hoc Commands : Des commandes rapides exécutées directement depuis la ligne de commande sans passer par un playbook.
  • Idempotence : Un concept clé d’Ansible. Une tâche est idempotente si elle peut être exécutée plusieurs fois sans changer le système après la première exécution.

4. L’Environnement Ansible

Pour commencer avec Ansible, vous avez besoin de :

4.1 Un Nœud de Contrôle

C’est la machine sur laquelle Ansible est installé. Elle peut être un ordinateur local ou un serveur. Ansible ne nécessite pas d’installation sur les nœuds gérés, ce qui simplifie la configuration.

4.2 Des Nœuds Gérés

Ce sont les serveurs ou machines que vous souhaitez configurer ou gérer. Ansible utilise SSH pour communiquer avec eux.

4.3 SSH

Ansible utilise SSH pour se connecter aux nœuds gérés. Assurez-vous que le nœud de contrôle peut se connecter aux nœuds gérés via SSH sans mot de passe (en utilisant des clés SSH).

4.4 Python

Ansible nécessite Python sur les nœuds gérés pour exécuter les modules. La plupart des distributions Linux incluent Python par défaut.

5. Fichiers de Configuration d’Ansible

Ansible utilise plusieurs fichiers de configuration pour définir son comportement. Voici les principaux fichiers et leur emplacement :

5.1 Fichier de Configuration Principal (ansible.cfg)

Ce fichier contient les paramètres de configuration d’Ansible. Il peut être situé à plusieurs endroits, et Ansible utilise le premier fichier trouvé dans l’ordre suivant :

  1. Répertoire courant : ./ansible.cfg
  2. Répertoire utilisateur : ~/.ansible.cfg
  3. Répertoire système : /etc/ansible/ansible.cfg

Exemple de contenu d’un fichier ansible.cfg :

[defaults]
inventory = ./inventory.ini
remote_user = ansible_user
private_key_file = /path/to/private/key

5.2 Fichier d’Inventaire (inventory.ini ou inventory.yml)

Ce fichier liste les hôtes et les groupes d’hôtes. Par défaut, Ansible cherche ce fichier dans le répertoire courant ou dans le chemin spécifié dans ansible.cfg.

5.3 Fichiers de Variables

Les variables peuvent être définies dans plusieurs fichiers, notamment :

  • Dans les playbooks : Directement dans les fichiers YAML.
  • Dans les rôles : Sous roles/role_name/vars/ ou roles/role_name/defaults/.
  • Dans des fichiers séparés : Par exemple, group_vars/ et host_vars/ pour définir des variables par groupe ou par hôte.

5.4 Fichiers de Rôles

Les rôles sont organisés dans des répertoires spécifiques, généralement sous roles/. Chaque rôle a sa propre structure de fichiers, comme tasks/handlers/vars/, etc.

6. Premiers Pas avec Ansible

6.1 Installation d’Ansible

Sur un système basé sur Debian/Ubuntu :

sudo apt update
sudo apt install ansible

Sur un système basé sur Red Hat/CentOS :

sudo yum install ansible

6.2 Configurer l’Inventaire

Créez un fichier inventory.ini et ajoutez vos hôtes :

[webservers]
server1.example.com
server2.example.com

[dbservers]
db1.example.com

6.3 Tester la Connexion

Utilisez la commande suivante pour vérifier que Ansible peut communiquer avec vos hôtes :

ansible all -i inventory.ini -m ping

6.4 Écrire un Playbook Simple

Créez un fichier playbook.yml :

- hosts: webservers
  tasks:
    - name: Ensure Apache is installed
      apt:
        name: apache2
        state: present

Exécutez le playbook :

ansible-playbook -i inventory.ini playbook.yml

7. Bonnes Pratiques

  • Utilisez des rôles pour organiser vos playbooks et faciliter la réutilisation du code.
  • Gardez vos playbooks sous contrôle de version avec Git.
  • Utilisez des variables pour rendre vos playbooks plus flexibles.
  • Testez vos playbooks dans un environnement de staging avant de les déployer en production.
  • Documentez vos playbooks pour faciliter leur maintenance.

8. Ressources pour Aller Plus Loin

  • Documentation Officielle d’Ansible : https://docs.ansible.com
  • Ansible Galaxy : Une plateforme pour partager et découvrir des rôles Ansible. https://galaxy.ansible.com
  • Livres : Ansible for DevOps de Jeff Geerling est une excellente ressource pour approfondir vos connaissances.