Générer automatiquement la structure standard d'un rôle Ansible (defaults, handlers, tasks, templates, README) avec un playbook réutilisable.
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.
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
Avoir suivi le tuto Ansible — Introduction : un dossier ansible/ avec ansible.cfg et un inventaire fonctionnel.
create_rolePlutô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}
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
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).
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é).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.
# 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
Le rôle est créé et prêt à être rempli :
roles/test01/tasks/main.yml et ajoutez vos tâches.defaults/main.yml.README.md (utile pour vous dans 6 mois !).---
- name: Déployer test01
hosts: all
become: true
roles:
- test01
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 :