Un playbook Ansible monolithique de 500 lignes devient vite ingérable. Les roles sont le mécanisme d’encapsulation d’Ansible — ils rendent le code réutilisable, testable et partageable.
Structure d’un role
roles/nginx/
├── defaults/
│ └── main.yml # variables par défaut (surchargeable)
├── vars/
│ └── main.yml # variables internes (non surchargeable)
├── tasks/
│ ├── main.yml # point d'entrée des tasks
│ ├── install.yml # tasks d'installation
│ └── configure.yml # tasks de configuration
├── handlers/
│ └── main.yml # handlers (restart, reload)
├── templates/
│ └── nginx.conf.j2 # templates Jinja2
├── files/
│ └── logrotate.conf # fichiers statiques
├── meta/
│ └── main.yml # dépendances et métadonnées Galaxy
└── README.md
defaults vs vars : une distinction importante
# defaults/main.yml — surchargeable par l'inventaire ou le playbook
nginx_worker_processes: auto
nginx_worker_connections: 1024
nginx_server_name: "{{ ansible_fqdn }}"
nginx_listen_port: 80
# vars/main.yml — constantes internes, non surchargeable
nginx_config_dir: /etc/nginx
nginx_log_dir: /var/log/nginx
nginx_user: "www-data"
tasks/main.yml : organiser avec include
# tasks/main.yml
---
- name: Include installation tasks
ansible.builtin.include_tasks: install.yml
tags: [nginx, install]
- name: Include configuration tasks
ansible.builtin.include_tasks: configure.yml
tags: [nginx, configure]
# tasks/install.yml
---
- name: Install nginx
ansible.builtin.package:
name: nginx
state: present
notify: Restart nginx
- name: Ensure nginx service is enabled
ansible.builtin.service:
name: nginx
enabled: true
Handlers : déclencher des actions conditionnelles
# handlers/main.yml
---
- name: Restart nginx
ansible.builtin.service:
name: nginx
state: restarted
listen: "restart nginx"
- name: Reload nginx
ansible.builtin.service:
name: nginx
state: reloaded
listen: "reload nginx"
Les handlers ne s’exécutent qu’une seule fois en fin de play, même si notifiés plusieurs fois.
Templates Jinja2 : configuration dynamique
# templates/nginx.conf.j2
worker_processes {{ nginx_worker_processes }};
worker_rlimit_nofile {{ nginx_worker_connections * 2 }};
events {
worker_connections {{ nginx_worker_connections }};
}
http {
server_tokens off;
{% for vhost in nginx_vhosts %}
server {
listen {{ nginx_listen_port }};
server_name {{ vhost.name }};
root {{ vhost.root }};
{% if vhost.ssl | default(false) %}
listen 443 ssl;
ssl_certificate {{ vhost.ssl_cert }};
{% endif %}
}
{% endfor %}
}
meta/main.yml : dépendances entre roles
# meta/main.yml
galaxy_info:
role_name: nginx
author: sphinx-digital
description: Install and configure nginx
license: MIT
min_ansible_version: "2.14"
platforms:
- name: Ubuntu
versions: ["22.04", "24.04"]
- name: Debian
versions: ["11", "12"]
dependencies:
- role: common # installe les prérequis système
- role: firewall # configure le pare-feu avant nginx
Notre formation Ansible couvre la création de roles réutilisables avec des ateliers sur des environnements réels.