TP – Versionner et appliquer la configuration de deux serveurs
BTS SIO SISR 2e année – Bloc 2 – S08 – binôme : un tape, l'autre lit ; on échange les rôles à chaque partie
Note
But. Tu versionnes une configuration avec Git, tu décris l'état voulu de deux serveurs web avec Ansible, tu l'appliques, tu constates l'idempotence, puis tu provoques et détectes une dérive.
Durée : 2 h 40 (parties A à E), plus le bilan. Prérequis : cours S08 lu ; S06 ; trois VM Debian.
Note
Comment ce TP fonctionne. Avant de manipuler, tu écris ce que tu anticipes, puis tu testes et tu notes ce que tu constates. Un bilan de compétences clôt la séance.
Binôme : ____________ / ____________
Le laboratoire
| Machine | Rôle | Adresse |
|---|---|---|
| CTRL | Contrôleur Ansible | 192.168.10.10/24 |
| web1 | Serveur cible | 192.168.10.11/24 |
| web2 | Serveur cible | 192.168.10.12/24 |
Les trois VM sont sur le même réseau interne (modèle de S06) ; une carte NAT temporaire sert à installer les paquets. Le compte utilisateur existe sur chacune, avec sudo et SSH.
Partie A – Git : versionner avant d'automatiser (≈ 35 min)
Sur CTRL :
sudo apt update && sudo apt -y install git ansible
git config --global user.name "Prénom NOM"
git config --global user.email "prenom.nom@exemple.fr"
mkdir -p ~/infra/templates && cd ~/infra
git init
echo "# Configuration de l'infrastructure du TP S08" > README.md
git add README.md && git commit -m "Initialiser le dépôt"
1. Modifie le README.md (ajoute une ligne), puis observe :
2. Provoque une erreur et reviens en arrière :
echo "ligne fautive" >> README.md
git commit -am "Ajout par erreur"
git revert --no-edit HEAD
git log --oneline
cat README.md
J'anticipe. Après le git revert, la ligne fautive a-t-elle disparu de l'historique ? du fichier ? ______________________
Éléments de réponse
Elle a disparu du fichier, mais l'historique garde les deux commits (l'ajout et son annulation) : git revert crée un nouveau commit qui annule le précédent, ce qui préserve la traçabilité. Le journal montre trois ou quatre lignes, dont « Revert "Ajout par erreur" ».
Je comprends. Pourquoi ne jamais enregistrer un mot de passe dans le dépôt, même si on le supprime ensuite ? ______________________
Éléments de réponse
Git conserve l'historique : le mot de passe reste lisible dans les anciens commits. Il faut alors le changer (il est compromis), pas seulement le supprimer du fichier.
Partie B – Inventaire et premier contact (≈ 25 min)
1. Prépare l'accès SSH par clé depuis CTRL vers les cibles :
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id utilisateur@192.168.10.11
ssh-copy-id utilisateur@192.168.10.12
2. Crée dans ~/infra les fichiers ansible.cfg et inventaire.ini :
# ansible.cfg
[defaults]
inventory = inventaire.ini
host_key_checking = False
interpreter_python = auto_silent
# inventaire.ini
[web]
web1 ansible_host=192.168.10.11
web2 ansible_host=192.168.10.12
[web:vars]
ansible_user=utilisateur
3. Teste le contact et une commande :
Point de contrôle : ping répond "ping": "pong" pour web1 et web2.
Je comprends. Que représente [web:vars] ? ______________________
Éléments de réponse
Des variables communes à tout le groupe web : ici l'utilisateur de connexion SSH. Les définir une fois évite de les répéter pour chaque machine.
Partie C – Écrire et appliquer le playbook (≈ 50 min)
1. Crée templates/index.html.j2 :
<!DOCTYPE html>
<html lang="fr"><head><meta charset="utf-8"><title>{{ inventory_hostname }}</title></head>
<body><h1>Serveur {{ inventory_hostname }}</h1>
<p>Configuré par Ansible ({{ ansible_managed }}).</p></body></html>
2. Crée site.yml :
---
- name: Configurer les serveurs web
hosts: web
become: true
vars:
paquets: [apache2, curl]
tasks:
- name: Installer les paquets
ansible.builtin.apt:
name: "{{ paquets }}"
state: present
update_cache: true
cache_valid_time: 3600
- name: Déployer la page d'accueil
ansible.builtin.template:
src: index.html.j2
dest: /var/www/html/index.html
owner: root
group: root
mode: "0644"
notify: Recharger Apache
- name: Interdire la connexion SSH de root
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config.d/50-durcissement.conf
regexp: "^#?PermitRootLogin"
line: "PermitRootLogin no"
create: true
mode: "0644"
notify: Recharger SSH
- name: Apache démarré et activé
ansible.builtin.service:
name: apache2
state: started
enabled: true
handlers:
- name: Recharger Apache
ansible.builtin.service:
name: apache2
state: reloaded
- name: Recharger SSH
ansible.builtin.service:
name: ssh
state: reloaded
3. Vérifie la syntaxe, simule, puis applique (le mot de passe sudo est demandé avec -K) :
ansible-playbook site.yml --syntax-check
ansible-playbook site.yml --check -K
ansible-playbook site.yml -K
4. Relance la même commande :
| Exécution | ok |
changed |
|---|---|---|
| 1re application | ||
| 2e application |
J'anticipe. Que vaudra changed à la deuxième application ? Pourquoi ? ______________________
Éléments de réponse
changed=0 : les tâches décrivent un état (paquet présent, fichier conforme, service démarré) ; les deux machines étant déjà conformes, rien n'est modifié. C'est l'idempotence. À la première exécution, changed est supérieur à zéro (paquets installés, fichiers créés, service démarré).
5. Vérifie le résultat depuis CTRL :
Point de contrôle : chaque page affiche le nom de sa machine (web1, web2).
Je comprends. À quoi sert le notify ? Que se passe-t-il à la deuxième exécution ? ______________________
Éléments de réponse
notify déclenche un handler (ici recharger Apache ou SSH) uniquement si la tâche a changé quelque chose. À la deuxième exécution, rien ne change, donc aucun rechargement : on évite de perturber le service pour rien.
Partie D – Provoquer et détecter une dérive (≈ 30 min)
1. Sur web2, modifie la configuration à la main :
echo "<p>modifié à la main</p>" | sudo tee -a /var/www/html/index.html
sudo sed -i 's/PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config.d/50-durcissement.conf
2. Depuis CTRL, détecte la dérive sans rien modifier :
J'anticipe. Quelles tâches Ansible va-t-il signaler comme changed, et sur quelle machine ? ______________________
Éléments de réponse
Sur web2 uniquement : la page d'accueil (le contenu a changé) et la règle SSH (PermitRootLogin n'est plus à no). Les tâches de web1 restent ok. Avec --diff, Ansible montre les lignes en désaccord.
3. Corrige en réappliquant, puis vérifie :
Je comprends. Pourquoi est-il préférable de corriger via le playbook plutôt que de rééditer le fichier à la main sur web2 ? ______________________
Éléments de réponse
La correction à la main est non tracée et non reproductible ; elle recrée de la dérive. Le playbook dans Git garde qui a changé quoi et pourquoi, et reproduit le même résultat sur toutes les machines, y compris une machine neuve.
Partie E – Enregistrer le travail (≈ 20 min)
cd ~/infra
printf "*.retry\n" > .gitignore
git add ansible.cfg inventaire.ini site.yml templates .gitignore
git commit -m "Configurer les serveurs web (Apache, page d'accueil, SSH sans root)"
git log --oneline
Ajoute ensuite une tâche de ton choix (par exemple installer vim-tiny ou créer un utilisateur audit), applique, constate changed, relance, constate changed=0, puis commit avec un message qui explique pourquoi.
Pour aller plus loin
- Découpe le playbook en rôle (
ansible-galaxy init web). - Chiffre une variable secrète avec Ansible Vault.
- Teste
ansible-lintsi disponible.
Retour en entreprise (si ta situation le permet)
- Observer : les configurations des serveurs sont-elles versionnées ? Sinon, comment sait-on ce qui a été modifié ?
- Documenter : liste les trois configurations qui, selon toi, devraient être décrites en code.
Rendu
Compte rendu PDF, nommé RENDU-B2A2-S08-NOM.pdf, contenant : le git log --oneline, l'inventaire et le playbook, les récapitulatifs (PLAY RECAP) des deux applications, la sortie de --check --diff après la dérive, les réponses aux questions.
Bilan de la séance
Niveau : Non maîtrisé, Maîtrise partielle, Bonne maîtrise ou Excellente maîtrise, ou Non évalué.
| Compétence du référentiel | Ce que j'ai fait dans cette séance | Niveau |
|---|---|---|
| B2.2 – Installer, tester et déployer une solution d'infrastructure réseau | ||
| B2.3 – Exploiter, dépanner et superviser une solution d'infrastructure réseau |
Note
Les codes sont ceux du référentiel.
Je sais faire, sans aide :
- Versionner des fichiers avec Git et revenir en arrière ;
- Écrire un inventaire et un playbook simples ;
- Appliquer un playbook et constater l'idempotence ;
- Détecter une dérive avec
--check --diff; - Expliquer pourquoi le dépôt est la source de vérité.
Ce que je dois reprendre : ______________________
Ma question à poser à l'enseignant : ______________________