Les rôles Ansible permettent d'organiser des tâches, handlers, fichiers, templates, variables, etc. selon une hiérarchie de fichiers bien définie.
L'organisation de ces contenus en rôles favorise leur réutilisation et leur partage avec d'autres utilisateurs.
Plaçons-nous par exemple dans la perspective d'utiliser des playbooks pour déployer des applications web développées en PHP.
On pourrait être tenté d'écrire des playbooks décrivant toute la procédure d'installation :
Écrire la procédure entière au sein d'un playbook pour chaque application donnerait lieu à beaucoup de répétition.
En effet, seule l'application installée, et quelques paramètres de configuration du serveur web, changeraient d'un playbook à l'autre.
Les includes et imports permettent de séparer du contenu et de le réutiliser, mais les rôles imposent une structure cohérente et favorisent l'encapsulation d'une fonctionnalité spécifique par rôle.
En bref, les avantages de l'utlisation des rôles sont :
L'exemple complet est à retrouver sur ce dépôt.
Si on souhaite déployer WordPress sur une stack LEMP avec Ansible, on peut organiser un playbook avec cette hiérarchie de répertoires et fichiers :
playbook-directory/
│
├── roles/
│ ├── nginx/
│ │ ├── tasks/
│ │ │ └── main.yml # Tâches pour installer et configurer Nginx
│ │ ├── templates/
│ │ │ └── nginx-wordpress.conf.j2 # Template Nginx pour WordPress
│ │ └── handlers/
│ │ └── main.yml # Handlers pour redémarrer Nginx
│ ├── php/
│ │ ├── tasks/
│ │ │ └── main.yml # Tâches pour installer PHP et ses extensions
│ │ ├── handlers/
│ │ │ └── main.yml # Handlers pour redémarrer PHP-FPM
│ │ └── templates/
│ │ └── php.ini.j2 # Template pour la configuration PHP
│ ├── mysql/
│ │ └── tasks/
│ │ └── main.yml # Tâches pour installer MySQL/MariaDB et configurer la base de données
│ ├── wordpress/
│ │ ├── tasks/
│ │ │ └── main.yml # Tâches pour installer WordPress et WP-CLI, configurer wp-config.php
│ │ └── templates/
│ │ │ └── wp-config-sample.php.j2 # Template pour wp-config.php
│ └── common/
│ └── tasks/
│ └── main.yml # Tâches communes comme la mise à jour des paquets
│
├── hosts.ini # Fichier d'inventaire
└── site.yml # Playbook principal
site.ymlC'est le playbook qui va permettre de déployer la stack et l'application, en utilisant des rôles.
---
- name: Déployer la stack LEMP + WordPress sur Debian 12
hosts: all
become: yes
roles:
- common
- nginx
- php
- mysql
- wordpress
Les tâches associées aux rôles référencés ici, et stockées sous roles/<nom_role>/tasks/main.yml, vont être exécutées dans l'ordre.
roles/common/tasks/main.ymlCe fichier contient des tâches génériques, telles que la mise à jour du cache apt, et l'installation de paquets qui seront utiles pour la suite, sans être spécifiquement liés à un certain rôle.
---
- name: Mettre à jour le cache apt
ansible.builtin.apt:
update_cache: yes
# Installer curl - pour télécharger WordPress et wp-cli
- name: Installer curl
ansible.builtin.apt:
name: curl
state: present
roles/nginx/tasks/main.ymlDans l'ordre, on va ici :
---
- name: Installer Nginx
ansible.builtin.apt:
name: nginx
state: present
- name: Démarrer le service Nginx
ansible.builtin.service:
name: nginx
state: started
enabled: yes # S'assurer que le service MySQL démarre au boot
- name: Créer la config Nginx pour PHP + WordPress
ansible.builtin.template:
src: templates/nginx-wordpress.conf.j2
dest: /etc/nginx/sites-available/nginx-wordpress.conf
owner: root
group: root
mode: 0644
- name: Supprimer le lien symbolique `default` de sites-enabled
ansible.builtin.file:
path: /etc/nginx/sites-enabled/default
state: absent
- name: Créer un lien symbolique de sites-available/nginx-wordpress.conf vers sites-enabled
ansible.builtin.file:
src: /etc/nginx/sites-available/nginx-wordpress.conf
dest: /etc/nginx/sites-enabled/nginx-wordpress.conf
state: link
notify: restart nginx
L'action de redémarrer Nginx n'apparaît pas ici directement, mais sous la forme de la dernière ligne notify: restart nginx.
Elle fait référence à un handler défini dans un fichier placé également à un endroit standard…
roles/nginx/hamdlers/main.ymlC'est ce fichier qui contient le handler référencé dans le fichier précédent. Voici son contenu :
---
- name: restart nginx
ansible.builtin.service:
name: nginx
state: restarted
enabled: yes # S'assurer que le service Nginx démarre au boot