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 tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn