V04 - Vagrant : des labos reproductibles en une commande

Objectif

Décrire des VM dans un fichier texte (Vagrantfile) et les créer/détruire en une commande. C’est ce que le prof utilise pour distribuer le labo Squid, et c’est un bonus demandé au projet SquidGuard.


1. Principe

flowchart LR
  VF["📄 Vagrantfile<br/>(description des VM)"] --> V["vagrant up"]
  BOX[("📦 Box<br/>image de base<br/>ex. debian/bookworm64")] --> V
  V --> P["Fournisseur<br/>VirtualBox / libvirt"]
  P --> VM1["VM proxy"]
  P --> VM2["VM client"]
  V --> PROV["Provisionnement<br/>(script shell, Ansible)"]
  PROV --> VM1
  PROV --> VM2
MotSens
BoxImage de VM prête à l’emploi (catalogue : portal.cloud.hashicorp.com/vagrant)
ProviderL’hyperviseur utilisé : virtualbox (défaut) ou libvirt (plugin)
ProvisionerCe qui configure la VM après création (shell, ansible, file)
Synced folderLe dossier du projet est partagé dans la VM sous /vagrant

2. Installation

# Pop!_OS / Ubuntu : dépôt HashiCorp
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install vagrant
# Arch
sudo pacman -S vagrant
# Optionnel : utiliser KVM au lieu de VirtualBox
vagrant plugin install vagrant-libvirt

Vagrant est sous licence BSL (source disponible) depuis 2023 ; il reste gratuit pour cet usage.

3. Les commandes

CommandeEffet
vagrant init debian/bookworm64Crée un Vagrantfile minimal
vagrant upCrée et démarre toutes les VM du fichier
vagrant up proxySeulement la VM proxy
vagrant ssh proxySe connecter en SSH (sans mot de passe)
vagrant statusÉtat des VM
vagrant provisionRelancer le provisionnement
vagrant reload --provisionRedémarrer + reprovisionner (après modif du Vagrantfile)
vagrant haltÉteindre
vagrant destroy -fSupprimer les VM
vagrant box list / vagrant box updateGérer les box téléchargées
vagrant up --provider=libvirtUtiliser KVM

4. Vagrantfile du labo proxy (fourni)

Fichier : scripts/virtualisation/Vagrantfile - crée proxy (Squid + Apache + listes noires + page de blocage, 192.168.56.10) et client (configuré pour passer par le proxy, 192.168.56.11).

Vagrant.configure("2") do |config|
  config.vm.box = "debian/bookworm64"
 
  config.vm.define "proxy" do |proxy|
    proxy.vm.hostname = "squid-proxy"
    proxy.vm.network "private_network", ip: "192.168.56.10"
    proxy.vm.provider "virtualbox" do |vb|
      vb.memory = 1024
      vb.cpus = 1
    end
    proxy.vm.provision "shell", inline: <<-SHELL
      export DEBIAN_FRONTEND=noninteractive
      apt-get update -q
      apt-get install -y -q squid apache2 curl
      # ... (écriture de /etc/squid/squid.conf, des listes noires et de bloque.html)
      systemctl restart squid
    SHELL
  end
 
  config.vm.define "client" do |client|
    client.vm.hostname = "squid-client"
    client.vm.network "private_network", ip: "192.168.56.11"
    client.vm.provision "shell", inline: <<-SHELL
      apt-get update -q && apt-get install -y -q curl
      echo 'export http_proxy="http://192.168.56.10:3128"'  >  /etc/profile.d/proxy.sh
      echo 'export https_proxy="http://192.168.56.10:3128"' >> /etc/profile.d/proxy.sh
    SHELL
  end
end

Test :

cd scripts/virtualisation
vagrant up
vagrant ssh client -c "curl -sI http://example.com | head -1; curl -sI https://www.facebook.com | head -1"
# → HTTP/1.1 200 OK   puis   HTTP/1.1 403 Forbidden (bloqué par le proxy)

Les IP private_network de VirtualBox doivent être dans 192.168.56.0/21 par défaut (sinon ajouter la plage dans /etc/vbox/networks.conf).

Voir aussi