Un role est une unité réutilisable qui regroupe tasks, variables, fichiers et templates autour d’une responsabilité (installer PostgreSQL, déployer un agent…), selon une arborescence de répertoires conventionnelle — Ansible charge automatiquement chaque sous-dossier sans configuration explicite.


Arborescence standard

roles/health-agent/
├── tasks/
│   └── main.yml        # liste de tasks exécutées quand le role est appelé
├── defaults/
│   └── main.yml        # variables par défaut, faible précédence (facilement surchargées)
├── vars/
│   └── main.yml        # variables du role, forte précédence
├── templates/
│   └── config.json.j2  # fichiers Jinja2, utilisés via le module `template`
├── files/
│   └── health-agent.py # fichiers statiques, copiés tels quels via `copy`
├── handlers/
│   └── main.yml         # tasks déclenchées par `notify`
└── meta/
    └── main.yml          # dépendances vers d'autres roles

Seul tasks/main.yml est obligatoire ; les autres dossiers sont chargés automatiquement s’ils existent.


Exemple réel — role health-agent

# roles/health-agent/tasks/main.yml
- name: Déployer la configuration du health agent
  ansible.builtin.template:
    src: config.json.j2         # cherché automatiquement dans templates/
    dest: /etc/health-agent/config.json
    owner: root
    group: root
    mode: "0644"
 
- name: Déployer le programme du health agent
  ansible.builtin.copy:
    src: health-agent.py        # cherché automatiquement dans files/
    dest: /usr/local/bin/health-agent.py
    mode: "0755"

Un role référence ses propres templates/ et files/ par leur nom seul (src: config.json.j2) — pas besoin de chemin complet, Ansible les résout à partir de la structure du role.


Appeler des roles depuis un playbook

- name: Construire l'image PostgreSQL avec health agent
  hosts: all
  become: true
  roles:
    - postgresql
    - health-agent

Les roles s’exécutent dans l’ordre déclaré : ici postgresql avant health-agent, car l’agent dépend du service PostgreSQL déjà présent.


En relation avec