Ansible et organization des roles
Dans Ansible, les rôles permettent d’organiser proprement la configuration d’un système en blocs réutilisables (au lieu d’un long playbook monolithique, on découpe la logique en rôles spécialisés). Chaque rôle suit une structure standard composée de plusieurs dossiers ayant chacun un rôle bien défini.
TL;DR
- tasks = actions
- defaults = variables
- templates = fichiers générés
- handlers = redémarrages
- roles = organization (tasks)
Tableau récapitulatif
| Élément | Rôle | Contenu typique | Exemple |
|---|---|---|---|
roles/ |
Contient tous les rôles du projet | Sous-dossiers de rôles | roles/mail/, roles/time/ |
<nom_du_role>/ |
Représente une fonctionnalité ou un service | Configuration complète d’un composant | mail, network, security |
tasks/ |
Contient les actions exécutées | Installation, configuration, gestion de services | Installer Postfix, modifier un fichier |
tasks/main.yml |
Point d’entrée du rôle | Inclusion des autres tâches | include_tasks: postfix.yml |
defaults/ |
Variables par défaut du rôle | Paramètres personnalisables | postfix_relayhost, chrony_config_location |
handlers/ |
Actions déclenchées sur notification | Restart ou reload de services | Redémarrer chronyd ou postfix |
templates/ |
Fichiers Jinja2 dynamiques | Fichiers de configuration générés | chrony.conf.j2, httpd.conf.j2 |
notify |
Déclenche un handler après modification | Appel d’un redémarrage conditionnel | notify: restart_chrony |
include_tasks |
Charge un fichier de tâches | Découpage logique du rôle | include_tasks: rhel9.yml |
include_vars |
Charge des variables depuis un fichier | Variables spécifiques à un OS | include_vars: rhel9.yml |
Résumé rapide
| Dossier | Question à se poser |
|---|---|
tasks/ |
Que dois-je faire ? |
defaults/ |
Quelles valeurs utiliser ? |
templates/ |
Quel fichier générer ? |
handlers/ |
Que redémarrer après un changement ? |
roles/ |
Quelle fonctionnalité gérer ? |
Le dossier roles/
Le dossier roles/ est la racine de tous les rôles d’un projet Ansible. Chaque sous-dossier représente un rôle indépendant.
roles/ |
Le nom du rôle
Un rôle (ex : mail, time, network) représente une fonctionnalité ou un service.
Il contient toute la logique nécessaire pour installer, configurer et maintenir ce service.
Exemples
mail→ gestion du serveur mail (Postfix, Sendmail…)network→ configuration réseautime→ synchronisation NTP/Chronysecurity→ configuration de sécuritépackages→ installation de paquets communs
Le dossier tasks/
C’est le cœur du rôle.
Il contient les actions exécutées sur les machines.
tasks/ |
Rôle
- Installer des packages
- Modifier des fichiers
- Démarrer ou arrêter des services
- Exécuter des commandes
- Appeler d’autres fichiers de tâches
Exemple
- name: Install Apache |
Le fichier main.yml dans tasks/
C’est le point d’entrée du rôle.
Ansible l’exécute automatiquement lorsqu’un rôle est appelé.
Il sert souvent à organiser les sous-tâches :
- name: Configure Apache |
Le dossier defaults/
Ce dossier contient les variables par défaut du rôle.
defaults/ |
Rôle
- Centraliser les variables
- Éviter les valeurs en dur dans les tâches
- Faciliter les personnalisations
Exemple
apache_port: 80 |
Puis dans une tâche :
- name: Open firewall port |
Le dossier handlers/
Les handlers sont des tâches qui ne s’exécutent que lorsqu’elles sont appelées via notify.
handlers/ |
Rôle
- Redémarrer un service
- Recharger une configuration
- Exécuter une action uniquement lorsqu’un changement est détecté
Exemple
- name: Restart Apache |
Appel depuis une tâche :
- name: Deploy configuration |
Le dossier templates/
Les templates sont des fichiers Jinja2 permettant de générer des fichiers de configuration dynamiques.
templates/ |
Rôle
- Générer des fichiers de configuration
- Injecter des variables Ansible
- Adapter automatiquement les configurations
Exemple
Fichier :
templates/httpd.conf.j2 |
Contenu :
Listen {{ apache_port }} |
Déploiement :
- name: Deploy Apache configuration |
Fonctionnement global
Lorsqu’un rôle est exécuté :
- Les variables sont chargées depuis
defaults/ - Les tâches sont exécutées depuis
tasks/ - Les templates sont déployés depuis
templates/ - Les handlers sont déclenchés si une tâche notifie un changement
Exemple de structure complète
roles/apache/ |
Bonnes pratiques
Utiliser les rôles pour séparer les responsabilités
✔ Un rôle time pour la synchronisation horaire✔ Un rôle mail pour Postfix✔ Un rôle network pour la configuration réseau
X Éviter un rôle common contenant tout et n’importe quoi
Mettre les variables dans defaults
✔ Dans default/
postfix_relayhost: mail.example.org |
X Dans les tâches.
line: relayhost = [mail.example.org] |
Utiliser les handlers pour les redémarrages
✔ Dans les handlers
notify: |
X à chaque exécution du playbook.
state: restarted |
Prévoir les différences entre OS
Cette approche facilite les évolutions futures tout en conservant une structure claire.
Exemple :
roles/time/ |
Documentation
Ansible