V07 - Vagrant et KVM : le labo du TP déploiement

Objectif

Utiliser Vagrant avec KVM (plugin vagrant-libvirt) pour créer, démarrer, éteindre et remettre à zéro les 2 VM Debian du TP déploiement, puis refaire la démo du script en quelques commandes.


1. Le labo en un coup d’œil

flowchart LR
  PC["💻 Mon PC (Pop!_OS)<br/>~/labo-tp-deploiement<br/>Vagrantfile + deploiement.sh"]
  PC -- "vagrant up / halt / snapshot" --> LV["libvirt / KVM<br/>(visible dans virt-manager)"]
  LV --> WEB["tp-web<br/>192.168.56.10"]
  LV --> BDD["tp-bdd<br/>192.168.56.11"]
  PC -- "ssh vagrant@IP (le script)" --> WEB
  PC -- "ssh vagrant@IP (le script)" --> BDD
VMIP fixeRôles du TPRAMUtilisateur
tp-web192.168.56.10web + wordpress (+ firewall)1 Govagrant (sudo sans mot de passe)
tp-bdd192.168.56.11bdd (+ firewall)1 Govagrant (sudo sans mot de passe)

Chaque VM a 2 cartes réseau :

CarteRéseau libvirtPlageSert à
eth0vagrant-libvirt (créé par Vagrant, NAT)192.168.121.0/24internet (apt, wget) et vagrant ssh
eth1tp-deploiement (isolé)192.168.56.0/24nos IP fixes, utilisées par le script
MotSens
Vagrantoutil qui crée des VM à partir d’un fichier texte, le Vagrantfile
Boximage de VM toute prête, ici debian/bookworm64 (Debian 12 officielle)
Providerl’hyperviseur que Vagrant pilote : ici libvirt (= KVM), au lieu de VirtualBox
Provisioningce que Vagrant fait dans la VM après l’avoir créée. Ici : seulement copier notre clé SSH
Snapshotphoto d’une VM à un instant donné, pour y revenir plus tard

2. Installation (une seule fois, déjà faite sur mon PC)

Ubuntu 24.04 (et donc Pop!_OS 24.04) n'a plus Vagrant dans ses dépôts (changement de licence de HashiCorp en 2023). On l'installe depuis le dépôt officiel HashiCorp.

# 0. donner son mot de passe a sudo AVANT (sinon la question est cachee par wget, voir partie 7)
sudo -v
 
# 1. la cle qui prouve que les paquets viennent bien de HashiCorp
wget -qO - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
 
# 2. le depot HashiCorp pour Ubuntu 24.04 (noble)
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com noble main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
 
# 3. vagrant + libvirt-dev (necessaire pour compiler le plugin)
sudo apt update && sudo apt install -y vagrant libvirt-dev
 
# 4. le plugin KVM (SANS sudo : il s'installe dans ~/.vagrant.d)
vagrant plugin install vagrant-libvirt
 
# 5. verification
vagrant --version        # Vagrant 2.4.9
vagrant plugin list      # vagrant-libvirt (0.12.2, global)

Prérequis déjà en place sur le PC : KVM (/dev/kvm), libvirt, virt-manager, être dans le groupe libvirt, et une clé SSH ~/.ssh/id_ed25519 (sinon : ssh-keygen -t ed25519).

3. Le Vagrantfile du labo

Fichier : ~/labo-tp-deploiement/Vagrantfile. Copie dans le vault : scripts/virtualisation/Vagrantfile-tp-deploiement.

# notre cle ssh publique, copiee dans les VM pour faire "ssh vagrant@IP" sans mot de passe
CLE_PUBLIQUE = File.read(File.expand_path("~/.ssh/id_ed25519.pub")).strip
 
Vagrant.configure("2") do |config|
  config.vm.box = "debian/bookworm64"
 
  # pas de dossier partage /vagrant (inutile pour le TP)
  config.vm.synced_folder ".", "/vagrant", disabled: true
 
  config.vm.provider "libvirt" do |libvirt|
    # connexion systeme : les VM apparaissent dans virt-manager
    libvirt.uri = "qemu:///system"
    # nom des VM dans virt-manager : tp-web et tp-bdd (sans prefixe)
    libvirt.default_prefix = ""
    libvirt.memory = 1024
    libvirt.cpus = 1
  end
 
  # on ajoute notre cle dans /home/vagrant/.ssh/authorized_keys (si elle n'y est pas deja)
  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    grep -qF "#{CLE_PUBLIQUE}" ~/.ssh/authorized_keys || echo "#{CLE_PUBLIQUE}" >> ~/.ssh/authorized_keys
  SHELL
 
  # VM 1 : web + wordpress
  config.vm.define "tp-web" do |web|
    web.vm.hostname = "tp-web"
    web.vm.network "private_network", ip: "192.168.56.10",
      libvirt__network_name: "tp-deploiement", libvirt__forward_mode: "none"
  end
 
  # VM 2 : bdd
  config.vm.define "tp-bdd" do |bdd|
    bdd.vm.hostname = "tp-bdd"
    bdd.vm.network "private_network", ip: "192.168.56.11",
      libvirt__network_name: "tp-deploiement", libvirt__forward_mode: "none"
  end
end
LigneCe qu’elle fait
File.read(...id_ed25519.pub)lit notre clé SSH publique sur le PC (la privée ne quitte jamais le PC)
config.vm.boxl’image de départ, téléchargée une seule fois (~300 Mo)
synced_folder ... disabled: truepas de dossier partagé /vagrant (avec libvirt il faudrait NFS + sudo)
libvirt.uri = "qemu:///system"VM « système » → visibles dans virt-manager (connexion QEMU/KVM)
default_prefix = ""noms courts tp-web / tp-bdd au lieu de labo-tp-deploiement_tp-web
provision "shell", privileged: falsescript lancé en tant que vagrant (pas root) : ajoute notre clé si elle n’y est pas déjà (grep -q ... ||)
config.vm.define "tp-web"une VM : nom, hostname, IP
private_network, ip:2e carte avec IP fixe, sur le réseau tp-deploiement
libvirt__forward_mode: "none"réseau isolé : les VM et le PC se voient, mais pas de sortie internet par là (internet passe par eth0)

Rien d'autre dans le provisioning

Pas d’apache, pas de mariadb, pas d’iptables : les VM doivent rester vides, c’est le script du TP qui installe tout.

4. Les commandes du quotidien

Toujours dans le dossier du labo

Vagrant cherche le Vagrantfile dans le dossier courant : commencer par cd ~/labo-tp-deploiement.

CommandeEffet
vagrant statusétat des 2 VM (running, shutoff, not created)
vagrant updémarre les 2 VM (les crée si elles n’existent pas)
vagrant up tp-webseulement tp-web
vagrant haltéteint proprement les 2 VM
vagrant ssh tp-webterminal sur tp-web (exit pour sortir)
vagrant ssh tp-bdd -c "hostname"lance une seule commande sur tp-bdd
vagrant snapshot listliste des snapshots
vagrant snapshot save tp-web nomcrée un snapshot de tp-web
vagrant snapshot restore propreremet les 2 VM au snapshot propre (elles restent éteintes)
vagrant snapshot restore tp-web propreseulement tp-web
vagrant destroy -fsupprime les VM (disques compris)
# exemple : verifier que tout repond
cd ~/labo-tp-deploiement
vagrant status
ping -c 2 192.168.56.10
ssh vagrant@192.168.56.10 "sudo whoami"     # doit afficher root sans rien demander

5. Remettre les VM à zéro (snapshot propre)

Le snapshot propre = les 2 VM juste après leur création : Debian neuve + notre clé SSH, rien d’installé.

cd ~/labo-tp-deploiement
vagrant snapshot restore propre    # disques remis a zero, VM eteintes
vagrant up                         # on les redemarre (~1 min)

Pourquoi le snapshot a été pris VM éteintes

Un snapshot pris VM allumées garde aussi la mémoire, donc l’heure. Restaurées des jours plus tard, les VM se croient dans le passé, et apt update refuse les listes de paquets « datées du futur ». Pris VM éteintes, il ne garde que le disque : au vagrant up, la VM démarre et reprend l’heure du PC. C’est pour ça qu’il faut un vagrant up après chaque restore.

Pour refaire le snapshot (seulement si on veut changer l’état « propre ») :

vagrant halt
vagrant snapshot delete tp-web propre && vagrant snapshot save tp-web propre
vagrant snapshot delete tp-bdd propre && vagrant snapshot save tp-bdd propre
vagrant up

6. Voir les VM dans virt-manager

  1. Ouvrir Gestionnaire de machines virtuelles (virt-manager).
  2. Connexion QEMU/KVM → tp-web et tp-bdd apparaissent (état En cours d’exécution ou Éteinte).
  3. Clic droit → Ouvrir : l’écran de la VM. Onglet ℹ️ : les 2 cartes réseau, la RAM, le disque.
virsh -c qemu:///system list --all       # les VM
virsh -c qemu:///system net-list --all   # les reseaux : vagrant-libvirt et tp-deploiement
virsh -c qemu:///system snapshot-list tp-web

Pas de connexion par mot de passe

Le compte vagrant des box Debian n’a pas de mot de passe (connexion par clé uniquement) : la console de virt-manager affiche l’écran, mais on ne peut pas s’y connecter. Plan B si le SSH est bloqué : le snapshot (partie 5).

7. Faire la démo du TP

Ordre complet (tuto détaillé : TP deploiement - tuto) :

cd ~/labo-tp-deploiement
vagrant status                              # 1. VM running ? sinon :
vagrant up
 
./deploiement.sh 192.168.56.11 bdd          # 2. Entree a la question (= vagrant)
./deploiement.sh 192.168.56.10 wordpress    # 3. installe aussi apache + php
./deploiement.sh 192.168.56.11 firewall     # 4. firewall TOUJOURS en dernier
./deploiement.sh 192.168.56.10 firewall
 
curl -sL http://192.168.56.10 | grep title  # 5. page d'installation de wordpress
 
vagrant snapshot restore propre             # 6. apres la demo : remise a zero
vagrant up

Démo automatique dans une fenêtre de terminal (remise à zéro, les 4 étapes, les vérifications, puis les 11 tests) : bash tests/demo_terminal.sh dans ~/labo-tp-deploiement (~10 min).

8. Recréer le labo de zéro (autre PC, ou après un destroy)

mkdir ~/labo-tp-deploiement && cd ~/labo-tp-deploiement
cp "$HOME/obsidian/truc non trier/scripts/virtualisation/Vagrantfile-tp-deploiement" Vagrantfile
# + copier deploiement.sh dans ce dossier, puis : chmod u+x deploiement.sh
 
vagrant up --provider=libvirt                           # cree les 2 VM (~3 min la 1re fois)
 
ssh-keygen -R 192.168.56.10; ssh-keygen -R 192.168.56.11   # oublie les anciennes empreintes
ssh-keyscan 192.168.56.10 192.168.56.11 >> ~/.ssh/known_hosts
 
vagrant halt                                            # snapshot VM eteintes
vagrant snapshot save tp-web propre
vagrant snapshot save tp-bdd propre
vagrant up

ssh-keyscan ajoute l’empreinte des VM dans known_hosts : ssh ne posera plus la question « Are you sure you want to continue connecting ».


Exercices corrigés

Exercice 1. Tu as cassé tp-bdd en testant, mais tp-web est bonne. Remets seulement tp-bdd à zéro.

Exercice 2. Après le rôle firewall, ssh vagrant@192.168.56.10 ne répond plus. Que fais-tu ?

Exercice 3. Après un vagrant destroy -f puis vagrant up, ssh affiche WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!. Pourquoi, et comment corriger ?

Exercice 4. Ton PC a redémarré et vagrant status affiche shutoff. Le script peut-il marcher ?

Erreurs fréquentes / dépannage

ProblèmeCauseSolution
le terminal semble figé sur wget ... | sudo gpg ...sudo attend le mot de passe, mais la question est cachée par l’affichage de wgettaper le mot de passe + Entrée (rien ne s’affiche, c’est normal), ou Ctrl+C puis sudo -v d’abord
apt update : NO_PUBKEY / dépôt HashiCorp « non signé », et vagrant pas installéle dépôt est ajouté mais pas la clé : apt update échoue, et le && empêche apt installrefaire l’étape 1 de la partie 2
vagrant: commande introuvableVagrant pas installépartie 2
vagrant up dit que le provider libvirt est introuvable, ou part sur VirtualBoxplugin vagrant-libvirt absent (vagrant plugin list est vide)vagrant plugin install vagrant-libvirt, puis vagrant up --provider=libvirt
No such file ... id_ed25519.pub au vagrant uppas de clé SSH sur le PCssh-keygen -t ed25519 (Entrée à toutes les questions)
ssh: ... No route to hostVM éteinte (redémarrage du PC, ou après un snapshot restore)vagrant up
REMOTE HOST IDENTIFICATION HAS CHANGEDVM recréée → nouvelles clésexercice 3
apt update : Release file ... is not valid yethorloge de la VM en retard (snapshot pris VM allumée)refaire les snapshots VM éteintes (partie 5) ; en dépannage : vagrant reload
erreur KVM / VirtualBox au démarrage des VMune VM VirtualBox tourne en même temps (les 2 hyperviseurs se disputent le processeur)éteindre les VM VirtualBox pendant le labo
[fog][WARNING] Unrecognized arguments: libvirt_ip_commandmessage interne du pluginsans importance, à ignorer
Machine already provisioned au vagrant upnormal : la clé a déjà été copiéerien à faire

Voir aussi