roles.md 6.9 KB

Les rôles Ansible

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 :

  • de la "stack" logicielle : LAMP (Linux, Apache, MySQL, PHP) ou LEMP (Nginx remplaçant Apache), avec de possibles variantes (utilisation de MariaDB au lieu de MySQL).
  • de l'application elle-même : dans le cas de PHP, on peut citer entre autres WordPress (plateforme de création de sites), MediaWiki (moteur de wiki utilisé par Wikipédia), PostfixAdmin (interface web de gestion de Postfix), phpMyAdmin.

É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 :

  • La réutilisabilité et la modularité : chaque rôle peut encapsuler toutes les tâches, les fichiers, les templates, et les handlers nécessaires pour une fonction spécifique (comme configurer un serveur web Nginx ou déployer une application WordPress).
  • L'organisation et la maintenance : les rôles suivent une structure de répertoire standardisée, ce qui rend le code Ansible plus organisé et plus facile à appréhender.
  • Le partage et la collaboration : les rôles peuvent être facilement partagés entre différents projets via des plateformes comme Ansible Galaxy.
  • La gestion des dépendances et des variables : les rôles permettent de gérer facilement les dépendances entre les rôles ainsi que les variables par défaut spécifiques à chaque rôle, ce qui offre une grande flexibilité pour la personnalisation et la configuration.

Exemple

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

Contenu de site.yml

C'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.

Contenu de roles/common/tasks/main.yml

Ce 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

Contenu de roles/nginx/tasks/main.yml

Dans l'ordre, on va ici :

  • installer Nginx,
  • le démarrer,
  • créer une configuration Nginx pour PHP - et plus spécifiquement WordPress, bien qu'elle soit utilisable avec des variations mineures pour d'autres applications PHP ; cette configuration est créé à partir d'un template
  • supprimer le lien symbolique de la configuration par défaut, prévue pour servir uniquement des fichiers statiques (HTML, CSS, etc.),
  • créer le lien symbolique permettant d'activer notre configuration,
  • enfin, redémarrer Nginx
---
- 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…

Contenu de roles/nginx/hamdlers/main.yml

C'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