Role Structure and Organization
Role Structure and Organization
Role Directory Structure
Basic Layout
roles/
example_role/
defaults/ # Default variables
main.yml
files/ # Static files
handlers/ # Handler definitions
main.yml
meta/ # Role metadata
main.yml
tasks/ # Task definitions
main.yml
templates/ # Jinja2 templates
vars/ # Role variables
main.yml
Component Descriptions
- defaults/: Lowest precedence variables
- files/: Static files to copy
- handlers/: Event handlers
- meta/: Role dependencies and info
- tasks/: Core role actions
- templates/: Dynamic files
- vars/: Role-specific variables
Role Components
Tasks Directory
# tasks/main.yml
---
- name: Install required packages
apt:
name: ""
state: present
loop: ""
- name: Include web server configuration
include_tasks: webserver.yml
when: configure_webserver | bool
Defaults Directory
# defaults/main.yml
---
app_port: 8080
app_user: webapp
required_packages:
- nginx
- python3
configure_webserver: true
Handlers Directory
# handlers/main.yml
---
- name: restart nginx
service:
name: nginx
state: restarted
- name: reload configuration
service:
name: nginx
state: reloaded
Meta Directory
# meta/main.yml
---
dependencies:
- role: common
vars:
some_parameter: 3
- role: security
version: 1.0.0
galaxy_info:
author: your_name
description: Your role description
license: MIT
min_ansible_version: 2.9
Role Variables
Variable Precedence
- Role defaults (lowest)
- Inventory variables
- Host facts
- Play variables
- Role and include variables
- Block variables
- Task variables
- Extra variables (highest)
Variable Organization
# vars/main.yml
---
app_config:
port: ""
user: ""
log_level: info
max_connections: 1000
security_options:
ssl_enabled: true
ssl_protocols: TLSv1.2 TLSv1.3
Best Practices
Directory Organization
- Keep related files together
- Use meaningful file names
- Maintain consistent structure
- Document file purposes
File Naming
- Use descriptive names
- Follow consistent patterns
- Keep names simple
- Use lowercase
Code Structure
- Modular design
- Single responsibility
- Clear dependencies
- Proper documentation
Practical Exercise
Creating a Basic Role
- Initialize role structure
ansible-galaxy init my_role
- Define basic tasks
- Set default variables
- Create handlers
Role Testing
- Create test playbook
- Define test inventory
- Run role tests
- Verify results
Key Takeaways
- Organized structure is crucial
- Each directory has a purpose
- Variables have precedence
- Documentation is important