Ansible: Rôles
Prérequis
Avant de faire ces manipulations, assurez-vous d'avoir complété l'étude de cas LAMP.
Rôles
L'objectif est de structurer le playbook en utilisant des rôles pour améliorer encore la lisibilité et la maintenabilité. Les rôles permettent de regrouper des tâches, des variables, des fichiers et des templates liés à une fonctionnalité spécifique.
Une structure de répertoires typique pour un rôle ressemble à ceci :
roles/
└── apache/
├── tasks/
│ └── main.yml # Tâches principales (OBLIGATOIRE)
├── handlers/
│ └── main.yml # Handlers spécifiques au rôle
├── templates/
│ └── vhost.conf.j2 # Templates Jinja2
├── files/
│ └── index.html # Fichiers statiques
├── vars/
│ └── main.yml # Variables (priorité haute)
├── defaults/
│ └── main.yml # Variables par défaut (priorité basse)
├── meta/
│ └── main.yml # Métadonnées et dépendances
└── README.md # Documentation
Note: Seul le répertoire tasks avec le fichier main.yml est obligatoire pour qu'Ansible reconnaisse un rôle.
Commençons par créer un nouveau projet Ansible lamp_refactor et copiez-y le playbook principal lamp_stack.yml ainsi que le fichier d'inventaire inventory.yml et le fichier de configuration ansible.cfg.
Créez également un répertoire roles à la racine de ce projet, qui contiendra nos rôles (vide pour l'instant). La structure des fichiers devrait ressembler à ceci :
lamp-refactor/
├── lamp_stack.yml # Playbook principal
├── roles/ # Répertoire des rôles (vide pour l'instant)
├── inventory.yml
└── ansible.cfg
1. Créer la structure de base du rôle Apache
Dans ces manipulations, nous allons créer un rôle pour Apache. Commencez par créer le répertoire roles/apache et les sous-répertoires nécessaires, à l'intérieur de votre projet Ansible lamp_refactor que vous avez commencé avec les import/include.
cd ~/lamp_refactor
mkdir -p roles/apache/{tasks,handlers,defaults,templates,vars}
2. Déplacer les tâches Apache dans le rôle
Dans les manipulations précédentes, nous avions écrit une suite de tâches pour l'installation et la configuration d'Apache. Nous allons maintenant déplacer ces tâches dans le fichier roles/apache/tasks/main.yml.
---
# Rôle Apache - Configuration complète d'Apache2
- name: Installer Apache
ansible.builtin.apt:
name: apache2
state: present
update_cache: true
cache_valid_time: 3600
- name: Activer les modules Apache nécessaires
ansible.builtin.apache2_module:
name: "{{ item }}"
state: present
loop: "{{ apache_modules }}"
notify: Redémarrer Apache
- name: Créer le répertoire de l'application
ansible.builtin.file:
path: "{{ apache_document_root }}"
state: directory
owner: www-data
group: www-data
mode: '0755'
- name: Configurer le VirtualHost
ansible.builtin.copy:
dest: "/etc/apache2/sites-available/{{ apache_site_name }}.conf"
content: |
<VirtualHost *:80>
ServerName {{ ansible_fqdn }}
DocumentRoot {{ apache_document_root }}
<Directory {{ apache_document_root }}>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/{{ apache_site_name }}_error.log
CustomLog ${APACHE_LOG_DIR}/{{ apache_site_name }}_access.log combined
</VirtualHost>
owner: root
group: root
mode: '0644'
notify: Redémarrer Apache
- name: Activer le site
ansible.builtin.command:
cmd: "a2ensite {{ apache_site_name }}.conf"
creates: "/etc/apache2/sites-enabled/{{ apache_site_name }}.conf"
notify: Redémarrer Apache
- name: Désactiver le site par défaut
ansible.builtin.file:
path: /etc/apache2/sites-enabled/000-default.conf
state: absent
when: apache_disable_default_site
notify: Redémarrer Apache
- name: S'assurer qu'Apache est démarré et activé
ansible.builtin.service:
name: apache2
state: started
enabled: true
3. Définir les variables par défaut
Créez un fichier roles/apache/defaults/main.yml pour définir les variables par défaut utilisées dans le rôle. Rappelons-nous que l'utilité d'un rôle est de le rendre réutilisable, donc nous allons définir des variables par défaut qui sont logiques mais qui peuvent être surchargées par l'utilisateur du rôle si nécessaire.
Rappel: Les variables définies dans defaults/main.yml ont la priorité la plus basse, ce qui veut dire qu'elles peuvent être écrasées si elles sont définies ailleurs. Vous pouvez aller revoir les priorités des variables dans les notes de cours théorique de la semaine 11.
---
# Variables par défaut du rôle Apache
# Ces valeurs peuvent être surchargées par l'utilisateur du rôle
apache_document_root: "/var/www/html"
apache_site_name: "monapp"
apache_disable_default_site: true
apache_modules:
- rewrite
- ssl
4. Déplacer les handlers
Dans le rôle Apache, créez un fichier roles/apache/handlers/main.yml pour y déplacer les handlers liés à Apache.
---
- name: Redémarrer Apache
ansible.builtin.service:
name: apache2
state: restarted
5. Modifier le playbook principal pour utiliser le rôle Apache
Enfin, modifiez le playbook principal lamp_stack.yml pour utiliser le rôle Apache que nous venons de créer.
---
- name: Déploiement stack LAMP avec rôles
hosts: webservers
become: true
vars:
# Variables pour Apache (surcharge les defaults)
apache_document_root: "/var/www/monapp"
apache_site_name: "monapp"
# Variables MySQL
mysql_root_password: "ChangezMoiEnProd123!"
app_db_name: "monapp"
app_db_user: "appuser"
app_db_password: "AppPassword456!"
roles:
- apache
tasks:
# [...gardez vos tâches MariaDB et PHP pour l'instant...]
Testez votre playbook pour vous assurer que tout fonctionne correctement après le refactoring avec les rôles:
ansible-playbook lamp_stack.yml
Testez la commande suivante pour faire la liste de vos rôles et tâches:
ansible-playbook lamp_stack.yml --list-tasks
6. Expérimentation: priorité des variables
Rappelons-nous que nous avons créé des variables par défaut dans le rôle Apache dans le fichier roles/apache/defaults/main.yml.
ansible@ansible-controller:~/lamp_refactor$ cat roles/apache/defaults/main.yml
---
# Variables par défaut du rôle Apache
# Ces valeurs peuvent être surchargées par l'utilisateur du rôle
apache_document_root: "/var/www/html"
apache_site_name: "monapp"
apache_disable_default_site: true
apache_modules:
- rewrite
- ssl
Nous allons maintenant expérimenter la priorité des variables en définissant certaines de ces variables dans différents endroits et en observant lesquelles sont effectivement utilisées lors de l'exécution du playbook.
Créez le fichier roles/apache/vars/main.yml pour définir des variables avec une priorité plus élevée.
---
# Variables avec priorité HAUTE
apache_modules:
- rewrite
- ssl
- headers
Modifiez le playbook principal lamp_stack.yml pour définir certaines variables au niveau du playbook.
vars:
apache_modules:
- rewrite
Testez votre playbook à nouveau pour voir quelles variables sont utilisées.
ansible-playbook lamp_stack.yml
Vous observerez que les modules installés sont ceux définis dans le fichier roles/apache/vars/main.yml, car ces variables ont la priorité la plus élevée.
Pour nettoyer, vous pouvez supprimer votre fichier roles/apache/vars/main.yml et les définitions de variables dans le playbook principal. Cela fera en sorte que seules les variables par défaut du rôle soient utilisées.
7. Au tour de MariaDB et PHP
Nous allons maintenant créer un rôle similaire pour MariaDB et PHP en suivant les mêmes étapes que pour Apache. Les étapes à haut niveau seront indiquées ici, mais vous pouvez vous référer aux étapes détaillées pour Apache si nécessaire.
1. Créer la structure de base des rôles MariaDB et PHP
mkdir -p roles/mariadb/{tasks,defaults}
mkdir -p roles/php/{tasks,defaults}
2. Déplacer les tâches du playbook principal dans les rôles
Créez le fichier roles/mariadb/tasks/main.yml et déplacez-y les tâches MariaDB.
Les tâches que vous devez déplacer sont: Installer MariaDB et les dépendances Python, S'assurer que MariaDB est démarré et activé, Définir le mot de passe root MySQL, Créer le fichier .my.cnf pour root, Supprimer les utilisateurs anonymes, Supprimer la base de données test, Créer la base de données de l'application, et Créer l'utilisateur de l'application. Vous devez également supprimer ces tâches du playbook principal lamp_stack.yml.
Faites de même pour PHP en créant le fichier roles/php/tasks/main.yml et en y déplaçant les tâches PHP: Installer PHP et les extensions, Configurer PHP pour la production.
3. Définir les variables par défaut
Créez le fichier roles/mariadb/defaults/main.yml pour définir les variables par défaut utilisées dans le rôle MariaDB.
---
mysql_root_password: "ChangeMe123!"
mariadb_database: "myapp"
mariadb_user: "appuser"
mariadb_password: "AppPassword456!"
mariadb_encoding: "utf8mb4"
mariadb_collation: "utf8mb4_unicode_ci"
Ensuite, créez le fichier roles/php/defaults/main.yml pour définir les variables par défaut utilisées dans le rôle PHP.
---
php_version: "8.3"
php_packages:
- php
- php-mysql
- php-cli
- php-curl
- php-gd
- php-mbstring
- php-xml
- libapache2-mod-php
# Configuration PHP
php_display_errors: "Off"
php_expose_php: "Off"
php_upload_max_filesize: "64M"
php_post_max_size: "64M"
php_max_execution_time: "300"
php_timezone: "America/Montreal"
4. Ajouter les rôles au playbook principal
Modifiez le playbook principal lamp_stack.yml pour inclure les rôles MariaDB et PHP.
Redéfinnez également les varibales suivnates pour MariaDB à l'intérieur de playbook:
# Variables MariaDB
mysql_root_password: "ChangezMoiEnProd123!"
mariadb_database: "monapp"
mariadb_user: "appuser"
mariadb_password: "AppPassword456!"
Les variables pour PHP peuvent être retirées du playbook principal car elles sont déjà définies dans le rôle PHP.
Testez votre playbook final pour vous assurer que tout fonctionne correctement avec les rôles:
ansible-playbook lamp_stack.yml
8. Réutiliser le playbook
L'avantage d'utiliser des rôles est qu'ils peuvent être réutilisés dans différents projets. Créez un nouveau playbook wordpress.yml pour déployer une application WordPress en utilisant les rôles Apache, MariaDB et PHP que vous avez créés.
---
- name: Déployer WordPress
hosts: webservers
become: true
vars:
# Configuration personnalisée pour WordPress
apache_document_root: "/var/www/wordpress"
apache_site_name: "wordpress"
mariadb_database: "wordpress"
mariadb_user: "wpuser"
mariadb_password: "WpPassword789!"
app_db_name: "wordpress"
app_db_user: "wordpress"
app_db_password: "WordpressPass123!"
roles:
- apache
- mariadb
- php
Testez le playbook WordPress pour vous assurer que tout fonctionne correctement:
ansible-playbook wordpress.yml
9. Exercice autonome: Création d'un rôle firewall
Créez un rôle firewall pour configurer le pare-feu UFW (Uncomplicated Firewall) sur vos serveurs web. Le rôle doit inclure les tâches suivantes:
- Installer UFW
- Autoriser le trafic SSH
- Autoriser le trafic HTTP et HTTPS