Skip to content

Role Best Practices

Ansible roles are the cornerstone of modular automation, but their effectiveness hinges on disciplined practices. This section outlines strategies for versioning, dependency management, and role reuse to ensure roles are maintainable, collaborative, and adaptable across environments.


Versioning Strategies

Versioning roles ensures compatibility and traceability. Use semantic versioning (e.g., 1.0.0, 2.1.1) and tag releases in your version control system (e.g., Git). For roles hosted on Ansible Galaxy, align versions with your release cycle.

Example: Versioning in Git

git tag v1.0.0
git push origin v1.0.0

When declaring dependencies, specify version constraints to avoid breaking changes:

dependencies:
  - name: "example_role"
    version: ">=1.0.0, <2.0.0"


Dependency Management

Explicitly declare dependencies in meta/main.yml to ensure roles are installed correctly. Use Ansible Galaxy to manage external roles, and leverage version constraints to control compatibility.

Example: Declaring Dependencies

dependencies:
  - name: "nginx"
    version: "1.4.0"
  - name: "postgresql"
    version: ">=1.0.0, <2.0.0"

For roles hosted on Galaxy, use the ansible-galaxy CLI to install dependencies:

ansible-galaxy install -r requirements.yml


Role Reuse and Modularity

Design roles to be self-contained and configurable. Separate tasks, handlers, variables, and templates into dedicated directories. Use parameters (via vars/main.yml or defaults/main.yml) to allow customization.

Example: Role Structure

my_role/
├── tasks/
│   └── main.yml
├── handlers/
│   └── main.yml
├── vars/
│   └── main.yml
├── defaults/
│   └── main.yml
└── meta/
    └── main.yml

Document usage and parameters in a README.md file. Share roles via Ansible Galaxy to enable reuse across teams.


Key takeaways

  • Version roles using semantic versioning and tag releases for clarity.
  • Declare dependencies explicitly in meta/main.yml and use version constraints to avoid conflicts.
  • Structure roles modularly with separate directories for tasks, handlers, and variables.
  • Document parameters and usage to enable seamless reuse across environments.
  • Leverage Ansible Galaxy for versioned role distribution and dependency management.