The Problem
Your Ansible role has dependencies defined in meta/main.yml, but they fail:
ERROR! the role 'dependency_role' was not found in roles/ or specified pathsOr circular dependency errors:
ERROR! Circular dependency detected: myrole -> common -> myroleOr dependencies run in wrong order:
# Expected: common -> database -> app
# Actual: app runs before databaseWhy This Happens
meta dependencies errors stem from:
Role not found - Dependency role not in roles path or Galaxy.
Circular dependencies - Role A depends on B, B depends on A.
Missing Galaxy roles - Dependencies not installed via ansible-galaxy.
Path configuration - Roles path doesn't include dependency location.
Dependency syntax errors - Invalid YAML in meta/main.yml.
Understanding Meta Dependencies
Role dependencies are defined in meta/main.yml:
# roles/myrole/meta/main.yml
dependencies:
- role: common
- role: database
vars:
db_name: myappDependencies run BEFORE the role, in order listed.
Diagnosing the Issue
Check role structure:
ls -la roles/myrole/meta/
cat roles/myrole/meta/main.ymlCheck dependency role exists:
ls -la roles/common/
ansible-galaxy listRun with verbose output:
ansible-playbook playbook.yml -vvValidate meta syntax:
ansible-galaxy role info myroleThe Fix
Fix 1: Ensure Dependency Role Exists
The dependency role must be accessible:
```bash # Check roles directory ls roles/
# Install missing dependency ansible-galaxy install geerlingguy.common ```
Configure roles path:
# ansible.cfg
[defaults]
roles_path = ./roles:~/.ansible/roles:/usr/share/ansible/rolesFix 2: Fix Circular Dependencies
Circular dependencies cause infinite loops:
```yaml # roles/app/meta/main.yml dependencies: - role: common
# roles/common/meta/main.yml dependencies: - role: app # Circular! app -> common -> app ```
Solution: Remove circular reference:
# roles/common/meta/main.yml
# Don't depend on app, let app depend on common
dependencies: []Or use include_role instead:
# In roles/app/tasks/main.yml
- include_role:
name: common
# No circular dependency in metaFix 3: Specify Full Role Name
Use complete role names:
# meta/main.yml
dependencies:
- role: geerlingguy.apache # Full Galaxy name
- role: geerlingguy.mysqlFor local roles:
dependencies:
- role: ../common # Relative path
- role: company.database # Galaxy formatFix 4: Pass Variables to Dependencies
Configure dependencies with variables:
dependencies:
- role: database
vars:
db_type: postgresql
db_name: "{{ app_db_name }}"
when: use_database | default(true)Variables must be defined before role runs:
# playbook.yml
- hosts: webservers
vars:
app_db_name: myapp_db
roles:
- myrole # Dependencies get app_db_nameFix 5: Handle Dependency Order
Dependencies run in listed order:
# meta/main.yml
dependencies:
- role: base # Runs first
- role: common # Runs second
- role: database # Runs third
# Then myrole tasks runFor reordering, adjust the list:
dependencies:
# Explicit order
- role: prerequisites
- role: common
- role: databaseFix 6: Conditional Dependencies
Apply conditions to dependencies:
```yaml dependencies: - role: mysql when: db_type == 'mysql'
- role: postgresql
- when: db_type == 'postgresql'
`
The condition is evaluated BEFORE the role runs.
Fix 7: Install from Galaxy
Create requirements.yml:
```yaml # requirements.yml - src: geerlingguy.apache version: 3.1.0
- src: geerlingguy.mysql
- version: 2.9.0
- src: git+https://github.com/example/custom-role.git
- name: custom-role
- version: v1.0.0
`
Install dependencies:
ansible-galaxy install -r requirements.ymlFix 8: Meta Main.yml Syntax
Correct meta syntax:
```yaml # roles/myrole/meta/main.yml galaxy_info: author: yourname description: Role description license: MIT min_ansible_version: 2.9 platforms: - name: Ubuntu versions: - 20.04
dependencies: # List format - role: common
# Dictionary format with options - role: database vars: db_port: 5432 when: use_database ```
Fix 9: Duplicate Dependencies
Same role dependency multiple times:
# This runs common once
dependencies:
- role: common
- role: common # Skipped, already ranTo run twice with different vars:
```yaml # Use include_role in tasks instead - include_role: name: common vars_from: config1.yml
- include_role:
- name: common
- vars_from: config2.yml
`
Fix 10: Allow Duplicate Dependencies
Configure Ansible to allow duplicates:
# ansible.cfg
[defaults]
allow_duplicates = TrueThen dependencies can run multiple times:
dependencies:
- role: common
vars:
mode: production
- role: common
vars:
mode: stagingVerifying the Fix
Test dependency order:
```yaml # roles/test/meta/main.yml dependencies: - role: dep1 - role: dep2
# roles/dep1/tasks/main.yml - debug: msg: "dep1 running"
# roles/dep2/tasks/main.yml - debug: msg: "dep2 running"
# roles/test/tasks/main.yml - debug: msg: "test role running" ```
Playbook:
- hosts: localhost
roles:
- testRun:
ansible-playbook playbook.yml -vExpected order:
``
TASK [dep1 : debug] ***********************************************************
TASK [dep2 : debug] ***********************************************************
TASK [test : debug] ***********************************************************
Check installed roles:
ansible-galaxy listPrevention
Validate meta before running:
ansible-galaxy info myrole
yamllint roles/myrole/meta/main.ymlDocument dependencies clearly:
```yaml # meta/main.yml dependencies: # Required: common provides base configuration - role: common
# Optional: database for data persistence - role: database when: use_database | default(true) ```
Use requirements.yml:
# Always include requirements.yml with role
- src: geerlingguy.common
version: 1.0.0