TP 4 : Playbook conditionnel multi-OS

Objectif

Écrire un playbook capable d’installer et de démarrer un serveur web sur deux familles d’OS différentes, en utilisant when et les facts pour adapter automatiquement les tâches — sans écrire deux playbooks séparés.

Environnement disponible

Vous disposez de :

  • 1 serveur de contrôle avec Ansible installé
  • 2 clients :
    • nrd-web1 (Debian 13)
    • nrd-alma1 (AlmaLinux 9)

Informations de connexion

  • Utilisateur : root
  • Mot de passe : formation

Ce que vous allez réaliser

  1. Configurer l’accès SSH par clé sur les deux clients
  2. Créer l’inventaire avec les deux hôtes
  3. Écrire un playbook unique qui installe Apache (Debian) ou Nginx (AlmaLinux) selon ansible_os_family
  4. Démarrer le bon service selon l’OS
  5. Exécuter le playbook et observer les tâches skipped selon la machine
  6. Vérifier avec ansible_facts que chaque machine a bien reçu le bon paquet

Conseils

  • Le nom du paquet web change selon l’OS (apache2 sur Debian, nginx sur AlmaLinux — httpd existe aussi sur AlmaLinux mais on utilise nginx ici pour bien marquer visuellement la différence dans les logs).
  • Le module de gestion des paquets change aussi : ansible.builtin.apt sur Debian, ansible.builtin.dnf sur AlmaLinux.
  • Une tâche non exécutée à cause d’un when faux apparaît en skipped, pas en erreur — c’est normal et attendu ici.

🧪 Lab · membre

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

Générer une clé SSH (si ce n’est pas déjà fait) et la déployer sur les deux clients

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

ssh root@nrd-web1
nano .ssh/authorized_keys
# Coller la clé publique

ssh root@nrd-alma1
nano .ssh/authorized_keys
# Coller la même clé publique

Créer l’inventaire

mkdir ansible && cd ansible
nano inventaire.yaml
# inventaire.yaml
all:
  hosts:
    nrd-web1:
      ansible_host: <IP>
    nrd-alma1:
      ansible_host: <IP>

Écrire le playbook conditionnel

nano playbook_web_multios.yaml
# playbook_web_multios.yaml
---
- name: Déployer un serveur web selon la famille d'OS
  hosts: all
  become: yes

  tasks:
    - name: Afficher la famille d'OS détectée
      ansible.builtin.debug:
        msg: "{{ ansible_hostname }} est un système {{ ansible_os_family }}"

    - name: Installer Apache (Debian/Ubuntu)
      ansible.builtin.apt:
        name: apache2
        state: present
        update_cache: yes
      when: ansible_os_family == "Debian"

    - name: Démarrer Apache (Debian/Ubuntu)
      ansible.builtin.service:
        name: apache2
        state: started
        enabled: yes
      when: ansible_os_family == "Debian"

    - name: Installer Nginx (RedHat/AlmaLinux)
      ansible.builtin.dnf:
        name: nginx
        state: present
      when: ansible_os_family == "RedHat"

    - name: Démarrer Nginx (RedHat/AlmaLinux)
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes
      when: ansible_os_family == "RedHat"

Exécuter le playbook

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

Observez le résultat : sur nrd-web1, les tâches Apache s’exécutent (changed) et les tâches Nginx sont skipped. Sur nrd-alma1, c’est l’inverse.

Vérifier les facts détectés sur chaque machine

ansible all -i inventaire.yaml -m ansible.builtin.setup -a "filter=ansible_os_family"

Vous devriez voir "Debian" pour nrd-web1 et "RedHat" pour nrd-alma1 — c’est exactement cette valeur qui a piloté le when dans le playbook.

Relancer le playbook une seconde fois pour confirmer l’idempotence

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

changed=0 sur les deux machines : chacune garde son propre serveur web, déjà installé et démarré.