TP 6 : Transformer le playbook Apache en rôle réutilisable

Objectif

Générer la structure standard d’un rôle avec ansible-galaxy init, y migrer les tâches, le handler et le template déjà vus, puis valider que le comportement reste identique une fois le playbook réduit à un simple appel de rôle.

Environnement disponible

Vous disposez de :

  • 1 serveur de contrôle avec Ansible installé
  • 1 client Debian : nrd-web1

Informations de connexion

  • Utilisateur : root
  • Mot de passe : formation

⚠️ Les conteneurs de ce lab repartent de zéro à chaque session (aucune configuration précédente n’est conservée, y compris vos éventuelles clés SSH). Les premières étapes ci-dessous refont donc systématiquement tout le bootstrap.

Ce que vous allez réaliser

  1. Générer une clé SSH et la déployer sur le client
  2. Localiser l’IP du client et créer l’inventaire
  3. Générer la structure du rôle apache avec ansible-galaxy init
  4. Migrer les tâches dans tasks/main.yml
  5. Migrer le handler dans handlers/main.yml
  6. Migrer le template dans templates/
  7. Définir apache_port et server_domain en defaults
  8. Écrire un playbook minimaliste qui appelle le rôle
  9. Vérifier que le comportement (installation + idempotence) reste identique
  10. Surcharger server_domain sans toucher au rôle

Conseils

  • Dans un rôle, les chemins vers templates/ sont implicites : src: nordika.conf.j2, sans le préfixe templates/.
  • Testez d’abord avec les valeurs par défaut, puis surchargez server_domain pour confirmer que la personnalisation fonctionne sans toucher au rôle.

🧪 Lab · membre

🧪 Démarrer — 30 min
Voir la solutionMasquer la solution

Générer une clé SSH et la déployer sur le client

ssh-keygen -t ed25519 -C "ansible@control-serveur"

ssh root@nrd-web1
# Dans le dossier .ssh, ouvrir le fichier authorized_keys
nano .ssh/authorized_keys
# Coller la clé publique, sauvegarder, quitter

Localiser l’IP du client et créer le dossier de travail

ping nrd-web1
apt update
apt install ansible
mkdir ansible && cd ansible
nano inventaire.yaml
# inventaire.yaml
all:
  hosts:
    nrd-web1:
      ansible_host: <IP>

Vérifiez le contact radio avant d’aller plus loin :

ansible all -i inventaire.yaml -m ping

Générer la structure du rôle

mkdir roles && cd roles
ansible-galaxy init apache
cd ..

Écrire les tâches du rôle

nano roles/apache/tasks/main.yml
# roles/apache/tasks/main.yml
---
- name: Installer Apache
  ansible.builtin.apt:
    name: apache2
    state: present
    update_cache: yes

- name: Déployer le VirtualHost depuis le template
  ansible.builtin.template:
    src: nordika.conf.j2
    dest: /etc/apache2/sites-available/nordika.conf
  notify: Redémarrer Apache

- name: Activer le site
  ansible.builtin.command: a2ensite nordika.conf
  args:
    creates: /etc/apache2/sites-enabled/nordika.conf
  notify: Redémarrer Apache

Écrire le handler

nano roles/apache/handlers/main.yml
# roles/apache/handlers/main.yml
---
- name: Redémarrer Apache
  ansible.builtin.service:
    name: apache2
    state: restarted

Créer le template

nano roles/apache/templates/nordika.conf.j2
# roles/apache/templates/nordika.conf.j2
<VirtualHost *:{{ apache_port }}>
    ServerName {{ server_domain }}
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/{{ server_domain }}-error.log
    CustomLog ${APACHE_LOG_DIR}/{{ server_domain }}-access.log combined
</VirtualHost>

Définir les valeurs par défaut

nano roles/apache/defaults/main.yml
# roles/apache/defaults/main.yml
---
apache_port: 80
server_domain: "nordika.local"

Écrire le playbook minimaliste

nano playbook_apache_role.yaml
# playbook_apache_role.yaml
---
- name: Déployer l'infrastructure web de Nordika
  hosts: nrd-web1
  become: yes
  roles:
    - apache

Exécuter avec les valeurs par défaut

ansible-playbook playbook_apache_role.yaml -i inventaire.yaml -v

Rejouer pour confirmer l’idempotence

ansible-playbook playbook_apache_role.yaml -i inventaire.yaml -v

changed=0 partout : le rôle se comporte exactement comme prévu.

Surcharger server_domain sans toucher au rôle

# playbook_apache_role.yaml (modifié)
---
- name: Déployer l'infrastructure web de Nordika
  hosts: nrd-web1
  become: yes
  roles:
    - role: apache
      vars:
        server_domain: "test-role.nordika.local"
ansible-playbook playbook_apache_role.yaml -i inventaire.yaml -v

Le template se régénère avec le nouveau domaine (changed sur la tâche template + redémarrage via le handler), sans qu’une seule ligne du rôle apache ait été modifiée.