Aller au contenu
Infrastructure as Code medium

Consommer un rôle Ansible : roles, import_role, include_role, tasks_from

9 min de lecture

Logo Ansible

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.

  • Le pattern roles: classique au top du play.
  • import_role : statique, parsé au démarrage.
  • include_role : dynamique, supporte when:/loop:.
  • tasks_from: pour cibler un fichier autre que main.yml.
  • Quand préférer chacun selon le contexte.
BesoinPattern recommandé
Rôle exécuté toujours au début du playroles: 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 listeinclude_role + loop:
Cibler tasks/configure.yml au lieu de tasks/main.ymlimport_role ou include_role + tasks_from:
- name: Pattern roles classique
hosts: web1.lab
become: true
roles:
- role: webserver # ← équivalent à `import_role` au début du play

Comportement :

  • Le rôle est exécuté AVANT les tasks: du play.
  • Statique : parsé au démarrage du playbook.
  • Pas de when: direct au niveau roles: (peut être contourné avec un when: au niveau du rôle).
- 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'endroitimport_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 du import_role:, utiliser roles: ou include_role.

Cas d'usage : intégrer un rôle dans un séquencement précis (pre_tasks → import_role → post_tasks).

- 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 >= 9

Comportement :

  • Le rôle est inclus dynamiquement au runtime, au moment où la tâche est atteinte.
  • Supporte when: et loop: directement.
  • Pas visible dans --list-tasks (parsing au runtime).
  • Plus lent que import_role car parsing à chaque exécution.

Cas d'usage :

  • Conditionnel sur un fact (ansible_os_family).
  • Boucle sur une liste de configs.
  • Logique de branchement complexe.

Un rôle peut avoir plusieurs fichiers de tâches :

roles/webserver/tasks/
├── main.yml ← entrypoint par défaut
├── install.yml
├── configure.yml
└── secure.yml

Pour cibler configure.yml uniquement (sans rejouer install) :

- name: Reconfigurer nginx (sans réinstaller)
ansible.builtin.import_role:
name: webserver
tasks_from: configure.yml

Avantage : un rôle peut exposer plusieurs entrypoints logiques. L'utilisateur du rôle choisit quoi exécuter selon son besoin.

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: 8080

Les 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.

- include_role:
name: webserver
public: true # ← variables exposées au play parent

Par 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.

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:).

Fenêtre de terminal
cd ~/Projets/ansible-training/labs/roles/consommer-role/
cat playbook.yml # 3 patterns illustrés
pytest -v challenge/tests/ # 6 tests structure
SymptômeCauseFix
when: ignoré sur roles: ou import_roleParsing statique avant évaluationUtiliser include_role (dynamique)
Variable du rôle pas visible après son exécutionScope par défaut privéUtiliser public: true (avec parcimonie)
tasks_from: configure.yml planteFichier inexistant ou mal nomméVérifier roles/<role>/tasks/configure.yml
--list-tasks ne montre pas les tâches du rôleinclude_role (dynamique)Utiliser import_role pour visualisation
Lent au démarrage du playbookBeaucoup de import_role (parsing initial)Bascule vers include_role pour les rôles conditionnels
  • roles: = exécution avant tasks:. 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). Supporte when:/loop:.
  • tasks_from: cible un fichier de tâches autre que main.yml.
  • vars: sur le rôle = priorité haute, override les defaults/vars du rôle.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn