
Un rôle peut dépendre d’autres rôles via meta/main.yml. Avant que tasks/main.yml du rôle s’exécute, les dépendances tournent en cascade. Pattern utile pour : firewall_setup avant webserver, selinux_setup avant httpd. Cette page démontre le pattern, l’ordre exact de chargement, et les anti-patterns à éviter.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déclarer des dépendances dans
meta/main.yml. - L’ordre exact de chargement (dependencies → tasks → handlers).
- Passer des variables aux dépendances.
allow_duplicatespour ré-exécuter un rôle avec des params différents.- Anti-patterns : profondeur excessive, dépendances circulaires.
Le fichier meta/main.yml
Section intitulée « Le fichier meta/main.yml »---galaxy_info: ...
dependencies: - role: selinux_setup vars: selinux_state: enforcing
- role: firewall_setup vars: firewall_zones: - publicOrdre d’exécution :
selinux_setup(1ère dépendance)firewall_setup(2ème dépendance)- Puis
webserver/tasks/main.yml
Les dépendances tournent avant le rôle qui les déclare.
Cascade des dépendances
Section intitulée « Cascade des dépendances »playbook.yml appelle webserver ├── webserver/meta/main.yml dependencies: │ ├── selinux_setup │ │ └── selinux_setup/tasks/main.yml │ └── firewall_setup │ └── firewall_setup/tasks/main.yml └── webserver/tasks/main.ymlSi selinux_setup lui-même déclare des dépendances, elles tournent avant lui — récursion en profondeur.
Passer des variables aux dépendances
Section intitulée « Passer des variables aux dépendances »dependencies: - role: firewall_setup vars: firewall_zones: - public - dmz firewall_open_services: - http - httpsLes variables passées au niveau de la dépendance ont priorité élevée — équivalent au vars: sur un roles: classique. Surchargent les defaults/ du rôle dépendant.
Conditionner une dépendance
Section intitulée « Conditionner une dépendance »Pas possible directement dans dependencies: — pas de when: au niveau meta.
Workaround : conditionner dans le rôle dépendant lui-même :
- name: Configurer firewalld ansible.builtin.systemd_service: name: firewalld state: started when: firewall_enabled | default(true)Ou utiliser include_role avec when: au lieu de dependencies si c’est conditionnel.
allow_duplicates: true — ré-exécuter avec params différents
Section intitulée « allow_duplicates: true — ré-exécuter avec params différents »Par défaut, un rôle n’est exécuté qu’UNE FOIS dans un play, même s’il est listé plusieurs fois (déduplication automatique). Pour forcer la ré-exécution :
allow_duplicates: truePermet :
roles: - role: database vars: { db_name: prod, db_port: 5432 } - role: database vars: { db_name: staging, db_port: 5433 } # ← exécuté car allow_duplicates: trueSans allow_duplicates: true, le second appel serait ignoré.
Anti-patterns à éviter
Section intitulée « Anti-patterns à éviter »Anti-pattern 1 — Profondeur excessive
Section intitulée « Anti-pattern 1 — Profondeur excessive »webapp → webserver → tls_config → ca_setup → root_ca_distrib5 niveaux de profondeur. Debug = horreur. Préférer :
# playbook.yml — orchestrateur- hosts: all roles: - root_ca_distrib - ca_setup - tls_config - webserver - webappÀ plat. Plus lisible.
Anti-pattern 2 — Dépendances circulaires
Section intitulée « Anti-pattern 2 — Dépendances circulaires »A dependencies: [B]B dependencies: [C]C dependencies: [A]Ansible refuse — erreur recursive role dependency. À détecter via ansible-galaxy install -r requirements.yml qui valide le graphe.
Anti-pattern 3 — Tout dans dependencies
Section intitulée « Anti-pattern 3 — Tout dans dependencies »Mettre toutes les briques de la stack en dependencies du rôle principal :
dependencies: - role: nginx - role: php-fpm - role: postgresql - role: redis - role: certbotMauvais : le rôle webapp devient inutilisable seul (toutes les deps sont obligatoires). Préférer un playbook qui orchestre.
Le pattern import_role: ou include_role: au lieu de dependencies:
Section intitulée « Le pattern import_role: ou include_role: au lieu de dependencies: »Souvent plus propre d’appeler les rôles depuis le playbook plutôt que via dependencies: :
- hosts: webservers tasks: - name: Setup SELinux ansible.builtin.import_role: name: selinux_setup
- name: Setup firewall ansible.builtin.import_role: name: firewall_setup
- name: Deploy webserver ansible.builtin.import_role: name: webserverAvantages :
- Visibilité : le playbook montre l’ordre clairement.
- Conditionnel possible avec
include_role+when:. - Modulaire :
webserverpeut être utilisé seul (sans déclencher selinux).
dependencies: reste valable pour des dépendances structurelles (ex : un rôle nginx-tls dépend nécessairement de nginx-base).
Pratiquer dans le lab
Section intitulée « Pratiquer dans le lab »Cette page a un lab d’accompagnement : labs/roles/dependencies/ dans
stephrobert/ansible-training.
Le lab pose un rôle webserver avec 2 dépendances (selinux_setup + firewall_setup). Les rôles dépendants sont créés. 5 tests structure validés.
cd ~/Projets/ansible-training/labs/roles/dependencies/
cat roles/webserver/meta/main.yml # déclare les depsls roles/ # webserver + selinux_setup + firewall_setuppytest -v challenge/tests/ # 5 testsPièges courants
Section intitulée « Pièges courants »| Symptôme | Cause | Fix |
|---|---|---|
recursive role dependency | Cycle dans le graphe | Refactorer pour casser le cycle |
| Dépendance ignorée silencieusement | Déjà jouée dans le même play (déduplication) | allow_duplicates: true si volontaire |
| Variables des deps en collision | Préfixage absent | Préfixer <role>_* dans chaque rôle |
| Profondeur > 2 niveaux | Architecture mal pensée | Bouger vers playbook orchestrateur |
when: sur dep ignoré | Pas supporté au niveau meta | Conditionner dans le rôle dépendant |
À retenir
Section intitulée « À retenir »meta/main.yml dependencies:chaîne les rôles avanttasks/main.yml.- Ordre : dependencies (récursif) → tasks → handlers.
vars:sur dep = priorité haute, surcharge defaults.allow_duplicates: trueforce la ré-exécution avec params différents.- Max 2 niveaux de profondeur — sinon préférer un playbook orchestrateur.
import_role/include_roledans le playbook = alternative plus visible.