Linux

Ansible — Créer un rôle personnalisé

Générer automatiquement la structure standard d'un rôle Ansible (defaults, handlers, tasks, templates, README) avec un playbook réutilisable.

← Retour aux tutoriels Linux
📚 C'est quoi un rôle, concrètement ?

Imaginez un rôle comme une « boîte » prête à l'emploi : « install-apache », « install-mysql », « configurer-firewall »… Chaque boîte contient les tâches, les variables et les templates nécessaires pour faire une chose bien.

Ensuite, dans vos playbooks, vous combinez ces boîtes : « sur le groupe web, applique le rôle apache + le rôle firewall ». C'est réutilisable, lisible et facile à versionner dans Git.

ⓘ Structure standard d'un rôle

Tous les dossiers ci-dessous sont optionnels (créez seulement ceux dont vous avez besoin) :

roles/mon_role/
├── defaults/main.yml    ← variables par défaut (priorité faible, surchargeables)
├── handlers/main.yml    ← actions déclenchées par "notify" (ex: restart)
├── tasks/main.yml       ← les tâches principales (c'est le cœur du rôle)
├── templates/           ← fichiers de config dynamiques en Jinja2 (*.j2)
├── files/               ← fichiers statiques à copier tels quels
├── vars/main.yml        ← variables (priorité haute)
├── meta/main.yml        ← dépendances avec d'autres rôles
└── README.md            ← documentation du rôle
⚠ Prérequis

Avoir suivi le tuto Ansible — Introduction : un dossier ansible/ avec ansible.cfg et un inventaire fonctionnel.

📚 Documentation officielle

Comprendre le rôle « factory » create_role

Plutôt que de créer chaque rôle à la main, on construit un rôle spécial qui en génère d'autres. L'objectif : standardiser la création de rôles avec vos propres conventions (dossiers optionnels, README pré-rempli…) et rester maître du résultat.

Le rôle générateur tient dans deux fichiers :

roles/create_role/
├── defaults/main.yml    ← quels dossiers créer + où créer le rôle
└── tasks/main.yml       ← la logique de création (dossiers + fichiers)

On crée le squelette de ce rôle générateur :

mkdir -p roles/create_role/{tasks,defaults}

Variables par défaut (defaults/main.yml)

Fichier roles/create_role/defaults/main.yml — il définit le nom du futur rôle, l'emplacement de création et quels dossiers générer. Les booléens permettent d'activer ou désactiver chaque dossier selon les besoins.

---
new_role_name: ""
roles_path: "/etc/ansible/roles"

role_create_defaults: true
role_create_handlers: true
role_create_tasks: true
role_create_templates: true
💡 Astuce

new_role_name est vide par défaut : on le fournira au lancement (via le playbook ou l'option -e). roles_path pointe ici vers le chemin standard /etc/ansible/roles — adaptez-le à votre projet si vos rôles sont ailleurs (ex. ./roles).

Tâches du rôle factory (tasks/main.yml)

Fichier roles/create_role/tasks/main.yml. Pour chaque dossier : si la variable correspondante est true, on crée le dossier puis un fichier main.yml vide dedans. Le README est généré pré-rempli.

---
- name: Create defaults folder
  ansible.builtin.file:
    path: "{{ roles_path }}/{{ new_role_name }}/defaults"
    state: directory
  when: role_create_defaults

- name: Create handlers folder
  ansible.builtin.file:
    path: "{{ roles_path }}/{{ new_role_name }}/handlers"
    state: directory
  when: role_create_handlers

- name: Create tasks folder
  ansible.builtin.file:
    path: "{{ roles_path }}/{{ new_role_name }}/tasks"
    state: directory
  when: role_create_tasks

- name: Create templates folder
  ansible.builtin.file:
    path: "{{ roles_path }}/{{ new_role_name }}/templates"
    state: directory
  when: role_create_templates

- name: Create main.yml in defaults
  ansible.builtin.copy:
    dest: "{{ roles_path }}/{{ new_role_name }}/defaults/main.yml"
    content: |
      ---
  when: role_create_defaults

- name: Create main.yml in handlers
  ansible.builtin.copy:
    dest: "{{ roles_path }}/{{ new_role_name }}/handlers/main.yml"
    content: |
      ---
  when: role_create_handlers

- name: Create main.yml in tasks
  ansible.builtin.copy:
    dest: "{{ roles_path }}/{{ new_role_name }}/tasks/main.yml"
    content: |
      ---
  when: role_create_tasks

- name: Create README
  ansible.builtin.copy:
    dest: "{{ roles_path }}/{{ new_role_name }}/README.md"
    content: |
      # Role: {{ new_role_name }}

      ## Role Description

      ## Role Vars

Décryptage :

  • when: — la tâche n'est exécutée que si la condition est vraie.
  • ansible.builtin.file avec state: directory — crée (ou s'assure que existe) un dossier.
  • ansible.builtin.copy avec content: — crée un fichier avec le contenu indiqué à la volée (sans template séparé).

Écrire le playbook d'appel

Fichier playbooks/new_role.yml — il invoque le rôle factory en lui donnant le nom du rôle à créer :

---
- name: Create new Role structure
  hosts: localhost
  roles:
    - create_role
  vars:
    new_role_name: "test01"
    role_create_defaults: true
    role_create_handlers: true
    role_create_tasks: true
    role_create_templates: true

Point important : hosts: localhost — le rôle tourne sur votre propre machine de contrôle, pas sur un serveur distant. Logique : on crée des fichiers en local.

Générer un nouveau rôle

# Le nom est défini dans le playbook
ansible-playbook playbooks/new_role.yml

# Ou surcharger le nom à la volée avec -e ("extra vars")
ansible-playbook playbooks/new_role.yml -e "new_role_name=backup"

Résultat — l'arborescence générée dans roles/ :

roles/test01/
├── README.md
├── defaults/main.yml
├── handlers/main.yml
├── tasks/main.yml
└── templates/

Le README.md est déjà pré-rempli avec le nom du rôle :

# Role: test01

## Role Description

## Role Vars

Utiliser votre nouveau rôle

Le rôle est créé et prêt à être rempli :

  1. Éditez roles/test01/tasks/main.yml et ajoutez vos tâches.
  2. Définissez les variables par défaut dans defaults/main.yml.
  3. Complétez le README.md (utile pour vous dans 6 mois !).
  4. Invoquez le rôle depuis un playbook :
    ---
    - name: Déployer test01
      hosts: all
      become: true
      roles:
        - test01
✓ Félicitations !

Vous savez maintenant créer vos rôles Ansible avec votre propre rôle « factory » create_role, en gardant la maîtrise totale de la structure générée et de vos conventions d'équipe.

Pour aller plus loin :

  • Ajoutez d'autres dossiers au générateur (vars/, meta/, files/) en suivant le même modèle de tâches.
  • Utilisez vos rôles dans de vrais déploiements : Apache, Nginx, MySQL.