Rôles Ansible
L'architecture modulaire pour l'automatisation
Notions théoriques
Les rôles Ansible sont une façon de charger automatiquement certaines tâches et handlers.
L'utilisation de rôles :
- facilite la réutilisation du code,
- rend les Playbooks plus lisibles et plus faciles à maintenir
- et facilite le partage de Playbooks entre les équipes.
Un rôle Ansible est un ensemble de dossiers.
Liste des dossiers d'un rôle Ansible :
tasks
: Contient la liste principale des tâches à exécuter par le rôle.handlers
: Contient les handlers, qui peuvent être invoqués par les tâches dans ce rôle ou même hors de ce rôle.defaults
: Variables par défaut pour le rôle.vars
: Autres variables pour le rôle.files
: Contient les fichiers qui peuvent être déployés par ce rôle.templates
: Contient les templates qui peuvent être déployés par ce rôle.meta
: Définit certaines métadonnées pour le rôle. Par exemple, les dépendances de rôle.
Exemple
Pour créer un rôle simple afin d'installer et démarrer un serveur Web Nginx sur une machine Debian, il suffit de réaliser les actions suivantes :
- Créer la structure de répertoires pour le rôle
nginx
dans le répertoire/root/ansible/roles
:
mkdir -p /root/ansible/roles/nginx/{tasks,handlers,defaults,vars,files,templates,meta}
Ceci est un exemple, pour expliquer le fonctionnement des rôles dans Ansible.
Il n'est pas nécessaire de réaliser cet exemple.
Le TP sera l'occasion de mettre en pratique ces connaissances.
- Créer le fichier de tâches principales
/root/ansible/roles/nginx/tasks/main.yml
:
---
- name: Installation de Nginx
apt:
name: nginx
state: present
- name: Demarrage du service Nginx
service:
name: nginx
state: started
enabled: yes
-
Créer un fichier de handlers (si nécessaire) dans
/root/ansible/roles/nginx/handlers/main.yml
. -
Voici comment utiliser le rôle dans un Playbook :
---
- hosts: all
roles:
- nginx
Dans cette exemple, nous installons le serveur Web Nginx et dans le TP nous installerons le serveur Web Apache.
Test de mémorisation/compréhension
TP - Créer et utiliser un rôle Ansible
Votre mission consiste à créer un rôle Ansible pour déployer un serveur MariaDB personnalisé et sécuriser l'installation en utilisant des commandes shell.
La commande mysql_secure_installation
permet de réaliser cette tâche de sécurisation,
mais elle nécessite d'installer des modules Ansible supplémentaires.
Nous allons remplacer l'utilisation de mysql_secure_installation
par une série de commandes qui seront exécutées l'une après l'autre :
- Supprimer les utilisateurs anonymes
- Désactiver la connexion
root
à distance - Supprimer la base de données
test
- Supprimer l'utilisateur
root@localhost
;
Voici les étapes à suivre :
-
Créez la structure de répertoires pour le rôle
mariadb
:mkdir -p /root/ansible/roles/mariadb/{tasks,handlers,defaults,vars,files,templates,meta}
-
Créez un fichier
/root/ansible/roles/mariadb/tasks/main.yml
. -
Écrivez la tâche nécessaire dans
/root/ansible/roles/mariadb/tasks/main.yml
pour installer MariaDB :---
- name: Installation de MariaDB
# TODO à compléter -
Ajoutez la tâche
Securisation de l'installation MariaDB
dans/root/ansible/roles/mariadb/tasks/main.yml
pour sécuriser l'installation en utilisant des commandes shell :---
- name: Installation de MariaDB
# TODO à compléter
- name: Securisation de l'installation MariaDB
become: yes
block:
- name: Supprimer les utilisateurs anonymes
mysql_user:
user: ''
host_all: yes
state: absent
- name: Désactiver la connexion root à distance
mysql_user:
user: root
host: '%'
state: absent
- name: Supprimer la base de données test
mysql_db:
name: test
state: absent
- name: Supprimer l'utilisateur root@localhost;
shell: |
mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
mysql -e "FLUSH PRIVILEGES;"
ignore_errors: yes -
Créez le fichier
/root/ansible/roles/mariadb/handlers/main.yml
pour créer un handler (pour redémarrer MariaDB à la demande). -
Ajoutez le handler
redemarrer mariadb
dans/root/ansible/roles/mariadb/handlers/main.yml
, et ajoutez les lignes qui permettent de redémarrer le servicemariadb
:---
- name: redemarrer mariadb
# TODO à compléter -
Créez un Playbook
/root/ansible/playbook-role-mariadb.yml
qui utilise votre rôlemariadb
(pour installer et configurer MariaDB sur vos conteneurs).---
- hosts: all
become: yes
roles:
# TODO à compléter -
Exécutez le Playbook défini dans le fichier
/root/ansible/playbook-role-mariadb.yml
. -
Vérifiez que MariaDB fonctionne correctement sur vos conteneurs.
Vous pouvez le faire en vous connectant à MariaDB, à partir du contrôleur Ansible, avec la commande
mysql -h adresse-ip-du-serveur -u root -p
et en entrant le mot de passe que vous avez défini.
Une solution
Vous devez être connecté pour voir le contenu.
Bonus
Si vous souhaitez disposer d'une installation automatique et personnalisée du serveur Web Apache pour vos serveurs, vous pouvez créer un rôle Ansible pour cela.
Un rôle Ansible pour installer Apache
Voici comment vous pourriez structurer votre rôle Apache et le Playbook associé :
- Créez la structure de répertoires pour le rôle
apache
:
mkdir -p /root/ansible/roles/apache/{tasks,handlers,defaults,vars,files,templates,meta}
- Écrivez les tâches nécessaires dans
/root/ansible/roles/apache/tasks/main.yml
pour installer Apache et copier le fichier de configuration.
---
- name: Installation d'Apache
apt:
name: apache2
state: present
- name: Copie de la configuration Apache personnalisée
copy:
src: apache.conf
dest: /etc/apache2/apache2.conf
notify:
- redémarrer apache
Ici nous utilisons le serveur Web Apache.
- Ajoutez un handler pour redémarrer Apache dans
/root/ansible/roles/apache/handlers/main.yml
.
---
- name: redemarrer apache
service:
name: apache2
state: restarted
-
Placez un fichier de configuration personnalisée dans
/root/ansible/roles/apache/files
:Voici un exemple très basique de fichier de configuration
apache.conf
à placer dans le dossier/root/ansible/roles/apache/files
:<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Custom log file locations
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Other directives here
</VirtualHost>
# Security Configurations Example
ServerTokens Prod
ServerSignature Off
# Disable Directory Browsing
Options -Indexes
# Other security and performance configurations...Ce fichier de configuration :
- définit un hôte virtuel qui écoute sur le port 80
- définit également l'emplacement du
DocumentRoot
(le répertoire où les fichiers du site Web sont stockés) et des configurations pour les journaux d'erreurs et d'accès. - inclut des directives pour améliorer la sécurité :
- masquer la version d'Apache (
ServerTokens Prod
) - désactiver la signature du serveur (
ServerSignature Off
).
-
Créez un Playbook
/root/ansible/playbook-role-apache.yml
qui utilise votre rôleapache
pour configurer un serveur Web sur vos conteneurs.
---
- hosts: all
roles:
- apache
- Exécutez le Playbook avec la commande suivante :
ansible-playbook -i /root/ansible/mon_inventaire.ini /root/ansible/playbook-role-apache.yml
- Vérifiez que Apache fonctionne correctement sur vos conteneurs en accédant à leur adresse IP via un navigateur ou en utilisant
curl
.