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
- Configurer l’accès SSH par clé sur les deux clients
- Créer l’inventaire avec les deux hôtes
- Écrire un playbook unique qui installe Apache (Debian) ou Nginx (AlmaLinux) selon
ansible_os_family - Démarrer le bon service selon l’OS
- Exécuter le playbook et observer les tâches
skippedselon la machine - Vérifier avec
ansible_factsque chaque machine a bien reçu le bon paquet
Conseils
- Le nom du paquet web change selon l’OS (
apache2sur Debian,nginxsur AlmaLinux —httpdexiste aussi sur AlmaLinux mais on utilisenginxici pour bien marquer visuellement la différence dans les logs). - Le module de gestion des paquets change aussi :
ansible.builtin.aptsur Debian,ansible.builtin.dnfsur AlmaLinux. - Une tâche non exécutée à cause d’un
whenfaux apparaît enskipped, pas en erreur — c’est normal et attendu ici.
🧪 Lab · membre
🧪 Démarrer — 30 minVoir 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é.