The Problem

Your Ansible role has dependencies defined in meta/main.yml, but they fail:

bash
ERROR! the role 'dependency_role' was not found in roles/ or specified paths

Or circular dependency errors:

bash
ERROR! Circular dependency detected: myrole -> common -> myrole

Or dependencies run in wrong order:

bash
# Expected: common -> database -> app
# Actual: app runs before database

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

yaml
# roles/myrole/meta/main.yml
dependencies:
  - role: common
  - role: database
    vars:
      db_name: myapp

Dependencies run BEFORE the role, in order listed.

Diagnosing the Issue

Check role structure:

bash
ls -la roles/myrole/meta/
cat roles/myrole/meta/main.yml

Check dependency role exists:

bash
ls -la roles/common/
ansible-galaxy list

Run with verbose output:

bash
ansible-playbook playbook.yml -vv

Validate meta syntax:

bash
ansible-galaxy role info myrole

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

ini
# ansible.cfg
[defaults]
roles_path = ./roles:~/.ansible/roles:/usr/share/ansible/roles

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

yaml
# roles/common/meta/main.yml
# Don't depend on app, let app depend on common
dependencies: []

Or use include_role instead:

yaml
# In roles/app/tasks/main.yml
- include_role:
    name: common
# No circular dependency in meta

Fix 3: Specify Full Role Name

Use complete role names:

yaml
# meta/main.yml
dependencies:
  - role: geerlingguy.apache  # Full Galaxy name
  - role: geerlingguy.mysql

For local roles:

yaml
dependencies:
  - role: ../common  # Relative path
  - role: company.database  # Galaxy format

Fix 4: Pass Variables to Dependencies

Configure dependencies with variables:

yaml
dependencies:
  - role: database
    vars:
      db_type: postgresql
      db_name: "{{ app_db_name }}"
    when: use_database | default(true)

Variables must be defined before role runs:

yaml
# playbook.yml
- hosts: webservers
  vars:
    app_db_name: myapp_db
  roles:
    - myrole  # Dependencies get app_db_name

Fix 5: Handle Dependency Order

Dependencies run in listed order:

yaml
# meta/main.yml
dependencies:
  - role: base      # Runs first
  - role: common    # Runs second
  - role: database  # Runs third
# Then myrole tasks run

For reordering, adjust the list:

yaml
dependencies:
  # Explicit order
  - role: prerequisites
  - role: common
  - role: database

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

bash
ansible-galaxy install -r requirements.yml

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

yaml
# This runs common once
dependencies:
  - role: common
  - role: common  # Skipped, already ran

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

ini
# ansible.cfg
[defaults]
allow_duplicates = True

Then dependencies can run multiple times:

yaml
dependencies:
  - role: common
    vars:
      mode: production
  - role: common
    vars:
      mode: staging

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

yaml
- hosts: localhost
  roles:
    - test

Run:

bash
ansible-playbook playbook.yml -v

Expected order: `` TASK [dep1 : debug] *********************************************************** TASK [dep2 : debug] *********************************************************** TASK [test : debug] ***********************************************************

Check installed roles:

bash
ansible-galaxy list

Prevention

Validate meta before running:

bash
ansible-galaxy info myrole
yamllint roles/myrole/meta/main.yml

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

yaml
# Always include requirements.yml with role
- src: geerlingguy.common
  version: 1.0.0