Vagrant est un outil de construction et de gestion d’environnements de machines virtuelles dans un flux de travail unifié. Si vous avez déjà passé des heures à configurer un environnement de développement pour ensuite entendre « ça marche sur ma machine » de la part d’un collègue, Vagrant résout ce problème. Vous définissez l’intégralité de votre environnement dans un seul fichier — le Vagrantfile — et n’importe quel membre de votre équipe peut déployer une configuration identique en une seule commande.

Ce guide couvre l’installation de Vagrant, la configuration du Vagrantfile, les stratégies de provisionnement, la mise en réseau, les configurations multi-machine et les workflows de production permettant de maintenir des environnements de développement cohérents dans toute votre équipe.

Prérequis

  • Un processeur 64 bits avec la virtualisation matérielle activée (VT-x/AMD-V)
  • Au moins 8 Go de RAM (4 Go pour l’hôte, 4 Go pour les VMs)
  • VirtualBox installé (ou un autre provider supporté)
  • Une expérience de base en ligne de commande
  • Git installé (pour partager les Vagrantfiles)

Installer Vagrant et Créer sa Première VM

Installez Vagrant depuis la page de téléchargement officielle. Évitez les versions des gestionnaires de paquets — elles sont souvent obsolètes.

# Vérifier l'installation
vagrant --version

# Initialiser un nouveau projet avec Ubuntu 22.04
mkdir my-project && cd my-project
vagrant init ubuntu/jammy64

# Démarrer la VM
vagrant up

# Se connecter via SSH
vagrant ssh

Le premier vagrant up télécharge l’image box (un modèle de VM préconstruit) et crée une machine virtuelle. Les exécutions suivantes démarrent en quelques secondes car l’image est mise en cache localement.

Commandes Vagrant Essentielles

vagrant up          # Créer et démarrer la VM
vagrant ssh         # Se connecter à la VM via SSH
vagrant halt        # Arrêter proprement la VM
vagrant reload      # Redémarrer la VM (applique les modifications du Vagrantfile)
vagrant destroy     # Supprimer complètement la VM
vagrant status      # Vérifier l'état de la VM
vagrant provision   # Relancer les scripts de provisionnement
vagrant snapshot save <name>   # Sauvegarder l'état de la VM
vagrant snapshot restore <name> # Restaurer un état sauvegardé

Configuration Approfondie du Vagrantfile

Le Vagrantfile est du code Ruby qui définit la configuration de votre VM. Voici un exemple prêt pour la production :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"
  config.vm.hostname = "dev-server"

  # Configuration réseau
  config.vm.network "private_network", ip: "192.168.56.10"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "forwarded_port", guest: 3000, host: 3000

  # Dossier synchronisé (hôte -> invité)
  config.vm.synced_folder "./src", "/var/www/app",
    owner: "www-data", group: "www-data"

  # Paramètres spécifiques au provider
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
    vb.name = "dev-server"
    # Activer la virtualisation imbriquée
    vb.customize ["modifyvm", :id, "--nested-hw-virt", "on"]
  end

  # Provisionnement shell
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y nginx nodejs npm
    systemctl enable nginx
  SHELL
end

Options Réseau

Vagrant supporte trois modes réseau :

ModeCas d’usageAccès
Forwarded PortExposer des ports invité spécifiques vers l’hôtelocalhost:8080 → invité:80
Private NetworkCommunication VM-à-VM sur réseau hôte uniquement192.168.56.10 depuis l’hôte et les autres VMs
Public NetworkPont vers le réseau physiqueLa VM obtient une IP LAN, accessible par d’autres machines

Pour le développement, les réseaux privés sont le choix le plus sûr. Ils permettent la communication entre VMs sans exposer les services au réseau externe.

Stratégies de Provisionnement

Vagrant supporte plusieurs méthodes de provisionnement. Choisissez en fonction des outils de votre équipe :

Provisionnement Shell (Simple)

config.vm.provision "shell", path: "scripts/setup.sh"

Provisionnement Ansible (Recommandé pour les Équipes)

config.vm.provision "ansible" do |ansible|
  ansible.playbook = "provisioning/playbook.yml"
  ansible.inventory_path = "provisioning/inventory"
  ansible.become = true
end

Provisionnement Docker

config.vm.provision "docker" do |d|
  d.pull_images "nginx"
  d.pull_images "postgres:15"
  d.run "nginx", args: "-p 80:80"
end

Scénario concret : Vous avez une équipe de 8 développeurs travaillant sur une application web nécessitant PostgreSQL, Redis, Nginx et Node.js. Au lieu que chaque développeur installe ces outils manuellement (et se retrouve avec des versions différentes), vous créez un Vagrantfile avec un provisionnement Ansible. Un nouveau développeur clone le dépôt, exécute vagrant up, et dispose d’un environnement fonctionnel en 10 minutes. Lorsque vous mettez à niveau PostgreSQL de la version 14 à 15, vous mettez à jour le playbook, et tout le monde récupère le changement lors du prochain vagrant provision.

Environnements Multi-Machine

Vagrant excelle dans la simulation d’architectures de production en local. Définissez plusieurs VMs dans un seul Vagrantfile :

Vagrant.configure("2") do |config|
  # Serveur web
  config.vm.define "web" do |web|
    web.vm.box = "ubuntu/jammy64"
    web.vm.hostname = "web-server"
    web.vm.network "private_network", ip: "192.168.56.10"
    web.vm.provider "virtualbox" do |vb|
      vb.memory = "1024"
    end
    web.vm.provision "shell", inline: <<-SHELL
      apt-get update && apt-get install -y nginx
    SHELL
  end

  # Serveur de base de données
  config.vm.define "db" do |db|
    db.vm.box = "ubuntu/jammy64"
    db.vm.hostname = "db-server"
    db.vm.network "private_network", ip: "192.168.56.11"
    db.vm.provider "virtualbox" do |vb|
      vb.memory = "2048"
    end
    db.vm.provision "shell", inline: <<-SHELL
      apt-get update && apt-get install -y postgresql
    SHELL
  end

  # Serveur de cache
  config.vm.define "cache" do |cache|
    cache.vm.box = "ubuntu/jammy64"
    cache.vm.hostname = "cache-server"
    cache.vm.network "private_network", ip: "192.168.56.12"
    cache.vm.provision "shell", inline: <<-SHELL
      apt-get update && apt-get install -y redis-server
      sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' /etc/redis/redis.conf
      systemctl restart redis
    SHELL
  end
end

Démarrez des machines spécifiques ou toutes à la fois :

vagrant up web      # Démarrer uniquement le serveur web
vagrant up          # Démarrer toutes les machines
vagrant ssh db      # Se connecter au serveur de base de données

Comparaison Vagrant et Alternatives

FonctionnalitéVagrantDockerMultipassNix/devenv
IsolationVM complète (OS entier)Conteneur (noyau partagé)VM légèreAu niveau processus
Temps de démarrage30-120 secondes1-5 secondes10-30 secondesInstantané
Utilisation des ressourcesÉlevée (OS complet par VM)Faible (noyau partagé)MoyenneMinimale
Multi-OSOui (n’importe quel OS sur n’importe quel hôte)Conteneurs Linux uniquement*Ubuntu uniquementLinux/macOS
ProvisionnementShell, Ansible, Chef, PuppetDockerfileCloud-initExpressions Nix
Simulation réseauExcellente (multi-machine)Bonne (réseaux Docker)BasiqueN/A
Parité avec la productionÉlevéeTrès élevéeMoyenneFaible
Courbe d’apprentissageFaibleMoyenneFaibleÉlevée

*Docker Desktop exécute une VM Linux sur macOS/Windows, donc les conteneurs restent sous Linux.

Quand choisir Vagrant : Tests sur OS complet, architectures multi-machine, développement cross-platform Windows/Linux, ou lorsque votre production repose sur des VMs plutôt que des conteneurs.

Pièges et Cas Particuliers

  • Performance des dossiers synchronisés sur macOS/Windows : Les dossiers partagés VirtualBox sont notoirement lents pour les grandes bases de code. Utilisez NFS (type: "nfs") sur macOS/Linux ou SMB sur Windows. Pour de meilleures performances, utilisez le type rsync avec vagrant rsync-auto.

  • Épinglage de la version de la box : Épinglez toujours la version de votre box dans le Vagrantfile (config.vm.box_version = "20231215.0.0"). Les boxes non épinglées se mettent à jour automatiquement et peuvent casser les scripts de provisionnement.

  • Allocation de mémoire : VirtualBox réserve la mémoire au démarrage, pas à la demande. Si vous allouez 4 Go à une VM qui reste à 512 Mo au repos, vous perdez quand même 4 Go côté hôte. Dimensionnez les VMs de façon conservatrice.

  • Conflits de ports : Si le port 8080 est déjà utilisé sur l’hôte, vagrant up échoue. Utilisez auto_correct: true sur les ports redirigés pour laisser Vagrant choisir automatiquement un port disponible.

  • Vagrant et WSL2 : L’utilisation de Vagrant dans WSL2 nécessite une configuration supplémentaire. Définissez VAGRANT_WSL_ENABLE_WINDOWS_ACCESS=1 et assurez-vous que VirtualBox est installé sur Windows, pas dans WSL.

  • Exports NFS obsolètes : Sur macOS, un vagrant destroy échoué peut laisser des exports NFS obsolètes dans /etc/exports. Nettoyez-les avec sudo sed -i '' '/# VAGRANT/d' /etc/exports.

Résolution de Problèmes

ProblèmeCauseSolution
vagrant up bloque sur “Waiting for machine to boot”VT-x/AMD-V désactivé dans le BIOSActiver la virtualisation dans les paramètres du BIOS
Délai d’expiration de la connexion SSHMauvaise configuration réseauVérifier les paramètres config.vm.network, essayer vagrant reload
Le dossier synchronisé ne se met pas à jourGuest Additions VirtualBox obsolètesInstaller le plugin vagrant-vbguest : vagrant plugin install vagrant-vbguest
”The box could not be found”Faute de frappe dans le nom de la box ou box privéeVérifier le nom de la box sur Vagrant Cloud
Le provisionnement échoue en cours d’exécutionErreur de script ou dépendance manquanteCorriger le script, puis exécuter vagrant provision (les scripts idempotents aident)

Résumé

  • Vagrant crée des environnements de développement reproductibles définis dans un seul Vagrantfile, éliminant les problèmes de “ça marche sur ma machine”
  • Le provisionnement avec des scripts shell, Ansible ou Docker automatise toute l’installation des logiciels dans les VMs
  • Les configurations multi-machine simulent des architectures de production en local avec des serveurs web, base de données et cache séparés
  • Les réseaux privés permettent une communication sûre entre VMs sans exposer les services à l’extérieur
  • Épinglez les versions de box et utilisez des dossiers synchronisés NFS pour éviter les deux frustrations les plus courantes avec Vagrant
  • Choisissez Vagrant plutôt que Docker lorsque vous avez besoin d’une isolation complète du système d’exploitation, de tests multi-OS ou d’une parité avec une production basée sur des VMs

Articles Connexes