Les rôles
Un playbook de 300 lignes qui gère nginx, PostgreSQL, et un déploiement applicatif est ingérable. Les rôles permettent de décomposer cette complexité : chaque rôle encapsule une responsabilité unique, avec ses tâches, ses templates, ses variables et ses handlers. C'est l'unité de réutilisabilité d'Ansible.
Structure d'un rôle
roles/
└── nginx/
├── defaults/
│ └── main.yml # variables par défaut, facilement surchargées
├── vars/
│ └── main.yml # variables internes, haute priorité
├── tasks/
│ └── main.yml # liste de tâches principale
├── handlers/
│ └── main.yml # handlers du rôle
├── templates/
│ └── nginx.conf.j2
├── files/
│ └── dhparam.pem # fichiers statiques
├── meta/
│ └── main.yml # dépendances, métadonnées Galaxy
└── README.mdSeul tasks/main.yml est réellement obligatoire. Les autres répertoires sont créés selon les besoins.
Créer un rôle
ansible-galaxy role init roles/nginxCette commande crée la structure complète avec des fichiers vides.
defaults vs vars : comprendre la priorité
C'est la distinction la plus importante dans un rôle :
defaults/main.yml: priorité basse. Ce sont les valeurs par défaut que l'utilisateur du rôle peut et est censé surcharger viagroup_vars,host_vars, ou les vars du playbook. Mettre ici tout ce qui peut varier selon l'environnement.vars/main.yml: priorité haute. Ces variables sont internes au rôle et ne doivent pas être surchargées de l'extérieur. Réservé aux constantes internes (chemins de fichiers système, noms de binaires).
# defaults/main.yml
nginx_user: www-data
nginx_worker_processes: "{{ ansible_processor_vcpus }}"
nginx_keepalive_timeout: 65
nginx_server_tokens: "off"Utiliser un rôle dans un playbook
---
- name: Configurer les serveurs web
hosts: web
become: true
roles:
- role: nginx
vars:
nginx_keepalive_timeout: 30
- role: certbotLes rôles sont exécutés dans l'ordre. Les variables passées via vars: dans la déclaration du rôle ont une priorité plus haute que les group_vars, mais plus basse que les extra_vars.
Depuis Ansible 2.4, on peut aussi inclure un rôle dans les tâches :
tasks:
- name: Inclure le rôle nginx
ansible.builtin.include_role:
name: nginx
vars:
nginx_keepalive_timeout: 30include_role permet d'inclure un rôle de façon conditionnelle ou dans une boucle, ce que la section roles: ne permet pas.
Dépendances
# meta/main.yml
dependencies:
- role: common
- role: ssl
vars:
ssl_domain: "{{ app_domain }}"Les dépendances sont résolues et exécutées avant le rôle lui-même. Elles sont dédupliquées : si deux rôles dépendent de common, celui-ci ne s'exécute qu'une seule fois.
Découper tasks/main.yml
Pour un rôle complexe, le fichier tasks/main.yml peut importer des sous-fichiers :
# tasks/main.yml
- name: Installation
ansible.builtin.import_tasks: install.yml
- name: Configuration
ansible.builtin.import_tasks: configure.yml
- name: TLS
ansible.builtin.import_tasks: tls.yml
when: nginx_tls_enabled | default(false)import_tasks est statique (évalué avant l'exécution, les when s'appliquent à toutes les tâches incluses). include_tasks est dynamique (évalué à l'exécution, permet les variables dans le nom de fichier).