
Ansible offre 3 façons de consommer un rôle dans un playbook : roles: classique (statique, exécuté avant tasks:), import_role (statique, parsé au démarrage du playbook), include_role (dynamique, parsé au runtime — supporte when: et loop:). Cette page explique quand utiliser chacun et démontre tasks_from: pour cibler un fichier spécifique du rôle.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Le pattern
roles:classique au top du play. import_role: statique, parsé au démarrage.include_role: dynamique, supportewhen:/loop:.tasks_from:pour cibler un fichier autre quemain.yml.- Quand préférer chacun selon le contexte.
Tableau de décision
Section intitulée « Tableau de décision »| Besoin | Pattern recommandé |
|---|---|
| Rôle exécuté toujours au début du play | roles: classique |
| Rôle exécuté au milieu des tasks (avant/après autres tasks) | import_role |
Rôle exécuté conditionnellement (when:) | include_role |
| Rôle exécuté en boucle sur une liste | include_role + loop: |
Cibler tasks/configure.yml au lieu de tasks/main.yml | import_role ou include_role + tasks_from: |
1. Pattern roles: classique
Section intitulée « 1. Pattern roles: classique »- name: Pattern roles classique hosts: web1.lab become: true
roles: - role: webserver # ← équivalent à `import_role` au début du playComportement :
- Le rôle est exécuté AVANT les
tasks:du play. - Statique : parsé au démarrage du playbook.
- Pas de
when:direct au niveauroles:(peut être contourné avec unwhen:au niveau du rôle).
2. Pattern import_role
Section intitulée « 2. Pattern import_role »- name: Pattern import_role hosts: web1.lab become: true
tasks: - name: Message avant le rôle ansible.builtin.debug: msg: "Avant l'import du rôle webserver"
- name: Importer le rôle webserver ansible.builtin.import_role: name: webserver
- name: Message après le rôle ansible.builtin.debug: msg: "Après l'import du rôle webserver"Comportement :
- Le rôle s’exécute à l’endroit où
import_role:est appelé (au milieu des tasks). - Statique : parsé au démarrage du playbook (les tâches du rôle sont visibles dans
--list-tasks). - Pas de
when:au niveau duimport_role:— utiliserroles:ouinclude_role.
Cas d’usage : intégrer un rôle dans un séquencement précis (pre_tasks → import_role → post_tasks).
3. Pattern include_role
Section intitulée « 3. Pattern include_role »- name: Pattern include_role hosts: db1.lab become: true
tasks: - name: Inclure le rôle UNIQUEMENT sur RHEL 9+ ansible.builtin.include_role: name: webserver tasks_from: main.yml # ← peut cibler un autre fichier vars: webserver_listen_port: 9090 when: ansible_distribution_major_version | int >= 9Comportement :
- Le rôle est inclus dynamiquement au runtime — au moment où la tâche est atteinte.
- Supporte
when:etloop:directement. - Pas visible dans
--list-tasks(parsing au runtime). - Plus lent que
import_rolecar parsing à chaque exécution.
Cas d’usage :
- Conditionnel sur un fact (
ansible_os_family). - Boucle sur une liste de configs.
- Logique de branchement complexe.
tasks_from: — cibler un fichier non-main
Section intitulée « tasks_from: — cibler un fichier non-main »Un rôle peut avoir plusieurs fichiers de tâches :
roles/webserver/tasks/├── main.yml ← entrypoint par défaut├── install.yml├── configure.yml└── secure.ymlPour cibler configure.yml uniquement (sans rejouer install) :
- name: Reconfigurer nginx (sans réinstaller) ansible.builtin.import_role: name: webserver tasks_from: configure.ymlAvantage : un rôle peut exposer plusieurs entrypoints logiques. L’utilisateur du rôle choisit quoi exécuter selon son besoin.
Passer des variables à un rôle
Section intitulée « Passer des variables à un rôle »Au niveau du rôle (toutes les méthodes)
Section intitulée « Au niveau du rôle (toutes les méthodes) »roles: - role: webserver vars: webserver_listen_port: 8080 webserver_worker_processes: 4- import_role: name: webserver vars: webserver_listen_port: 8080- include_role: name: webserver vars: webserver_listen_port: 8080Les vars: au niveau du rôle ont une priorité élevée (équivalent à --extra-vars). Surchargent defaults/main.yml et vars/main.yml des autres niveaux.
private parameter (ansible-core 2.17+)
Section intitulée « private parameter (ansible-core 2.17+) »- include_role: name: webserver public: true # ← variables exposées au play parentPar défaut, les variables d’un rôle sont privées au rôle. Avec public: true, elles fuitent dans le play appelant. À utiliser avec parcimonie — peut polluer le namespace.
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/roles/consommer-role/ dans
stephrobert/ansible-training.
Le lab fournit un playbook.yml qui démontre les 3 patterns dans un seul fichier (3 plays consécutifs). 6 tests structure validés (roles:, import_role, include_role, conditional when:).
cd ~/Projets/ansible-training/labs/roles/consommer-role/
cat playbook.yml # 3 patterns illustréspytest -v challenge/tests/ # 6 tests structurePièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
when: ignoré sur roles: ou import_role | Parsing statique avant évaluation | Utiliser include_role (dynamique) |
| Variable du rôle pas visible après son exécution | Scope par défaut privé | Utiliser public: true (avec parcimonie) |
tasks_from: configure.yml plante | Fichier inexistant ou mal nommé | Vérifier roles/<role>/tasks/configure.yml |
--list-tasks ne montre pas les tâches du rôle | include_role (dynamique) | Utiliser import_role pour visualisation |
| Lent au démarrage du playbook | Beaucoup de import_role (parsing initial) | Bascule vers include_role pour les rôles conditionnels |
À retenir
Section intitulée « À retenir »roles:= exécution avanttasks:. Statique. Le plus simple.import_role= exécution au milieu des tasks. Statique (parsing initial).include_role= exécution au milieu des tasks. Dynamique (parsing runtime). Supportewhen:/loop:.tasks_from:cible un fichier de tâches autre quemain.yml.vars:sur le rôle = priorité haute, override les defaults/vars du rôle.