Aller au contenu principal

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.
astuce

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 :

  1. 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}
info

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.

  1. 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
  1. Créer un fichier de handlers (si nécessaire) dans /root/ansible/roles/nginx/handlers/main.yml.

  2. Voici comment utiliser le rôle dans un Playbook :

---
- hosts: all
roles:
- nginx
remarque

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


Que permettent de faire les rôles dans Ansible ?


Quel dossier d'un rôle contient la liste principale des tâches à exécuter ?


Où placez-vous les variables par défaut pour un rôle Ansible ?


Comment invoquez-vous un rôle dans un Playbook Ansible ?


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.

astuce

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 :

  1. 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}
  2. Créez un fichier /root/ansible/roles/mariadb/tasks/main.yml.

  3. Écrivez la tâche nécessaire dans /root/ansible/roles/mariadb/tasks/main.yml pour installer MariaDB :

    ---
    - name: Installation de MariaDB
    # TODO à compléter
  4. 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
  5. Créez le fichier /root/ansible/roles/mariadb/handlers/main.yml pour créer un handler (pour redémarrer MariaDB à la demande).

  6. Ajoutez le handler redemarrer mariadb dans /root/ansible/roles/mariadb/handlers/main.yml, et ajoutez les lignes qui permettent de redémarrer le service mariadb :

    ---
    - name: redemarrer mariadb
    # TODO à compléter
  7. Créez un Playbook /root/ansible/playbook-role-mariadb.yml qui utilise votre rôle mariadb (pour installer et configurer MariaDB sur vos conteneurs).

    ---
    - hosts: all
    become: yes
    roles:
    # TODO à compléter
  8. Exécutez le Playbook défini dans le fichier /root/ansible/playbook-role-mariadb.yml.

  9. 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

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

  1. 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}
  1. É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
attention

Ici nous utilisons le serveur Web Apache.

  1. Ajoutez un handler pour redémarrer Apache dans /root/ansible/roles/apache/handlers/main.yml.
---
- name: redemarrer apache
service:
name: apache2
state: restarted
  1. 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).
  2. Créez un Playbook /root/ansible/playbook-role-apache.yml qui utilise votre rôle apache pour configurer un serveur web sur vos conteneurs.

---
- hosts: all
roles:
- apache
  1. Exécutez le Playbook avec la commande suivante :
ansible-playbook -i /root/ansible/mon_inventaire.ini /root/ansible/playbook-role-apache.yml
  1. Vérifiez que Apache fonctionne correctement sur vos conteneurs en accédant à leur adresse IP via un navigateur ou en utilisant curl.