Problem without roles
One playbook that installs Nginx, Docker, Node.js, users, and monitoring becomes huge and hard to reuse.
With roles you split into modular pieces:
roles/
├── nginx/
├── docker/
├── users/
└── monitoring/
Playbook → Roles → Tasks → Managed nodes
Create a role
cd ~/ansible-project
ansible-galaxy role init roles/nginxGenerated layout:
roles/nginx/
├── tasks/main.yml
├── handlers/main.yml
├── templates/
├── files/
├── vars/main.yml
├── defaults/main.yml
└── meta/main.yml
| Path | Purpose |
|---|---|
tasks/ | Main work |
handlers/ | Restarts / reloads |
templates/ | Jinja2 files |
defaults/ | Overridable defaults (low precedence) |
vars/ | Role vars (higher precedence) |
Role tasks
# roles/nginx/tasks/main.yml
---
- name: Install nginx
apt:
name: nginx
state: present
update_cache: true
- name: Deploy homepage
template:
src: index.html.j2
dest: /var/www/html/index.html
notify: Restart nginx
- name: Ensure nginx running
service:
name: nginx
state: started
enabled: trueDefaults + template
# roles/nginx/defaults/main.yml
app_name: DevOps Application{# roles/nginx/templates/index.html.j2 #}
<h1>{{ app_name }}</h1>Handlers in the role
# roles/nginx/handlers/main.yml
---
- name: Restart nginx
service:
name: nginx
state: restartedCall the role from a playbook
---
- name: Web servers
hosts: web
become: true
roles:
- nginxansible-playbook site.ymlAnsible Galaxy
Galaxy is a public hub for ready-made roles (like npm for Node).
ansible-galaxy install geerlingguy.docker
ansible-galaxy list---
- hosts: all
become: true
roles:
- geerlingguy.dockerrequirements.yml
---
roles:
- name: geerlingguy.docker
- name: geerlingguy.nginxansible-galaxy install -r requirements.ymlRole vs playbook
| Playbook | Role |
|---|---|
| Orchestrates what runs where | Reusable unit of automation |
| Can include many roles | Focused on one concern (nginx, docker, …) |
Mini project — Nginx website role
Build roles/nginx with:
- install + start Nginx
- Jinja2 homepage from
defaults - handler restart on template change
Then run it from a thin site.yml.
Interview: roles are structured, reusable Ansible components. Galaxy is the public repository for sharing and installing them.