AnsibleDevOpsAutomatisation

Ansible roles : structurer ses playbooks pour la réutilisabilité

3 septembre 2026 · Sphinx-Digital

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.