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 :
| Mode | Cas d’usage | Accès |
|---|---|---|
| Forwarded Port | Exposer des ports invité spécifiques vers l’hôte | localhost:8080 → invité:80 |
| Private Network | Communication VM-à-VM sur réseau hôte uniquement | 192.168.56.10 depuis l’hôte et les autres VMs |
| Public Network | Pont vers le réseau physique | La 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é | Vagrant | Docker | Multipass | Nix/devenv |
|---|---|---|---|---|
| Isolation | VM complète (OS entier) | Conteneur (noyau partagé) | VM légère | Au niveau processus |
| Temps de démarrage | 30-120 secondes | 1-5 secondes | 10-30 secondes | Instantané |
| Utilisation des ressources | Élevée (OS complet par VM) | Faible (noyau partagé) | Moyenne | Minimale |
| Multi-OS | Oui (n’importe quel OS sur n’importe quel hôte) | Conteneurs Linux uniquement* | Ubuntu uniquement | Linux/macOS |
| Provisionnement | Shell, Ansible, Chef, Puppet | Dockerfile | Cloud-init | Expressions Nix |
| Simulation réseau | Excellente (multi-machine) | Bonne (réseaux Docker) | Basique | N/A |
| Parité avec la production | Élevée | Très élevée | Moyenne | Faible |
| Courbe d’apprentissage | Faible | Moyenne | Faible | É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 typersyncavecvagrant 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. Utilisezauto_correct: truesur 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=1et 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 avecsudo sed -i '' '/# VAGRANT/d' /etc/exports.
Résolution de Problèmes
| Problème | Cause | Solution |
|---|---|---|
vagrant up bloque sur “Waiting for machine to boot” | VT-x/AMD-V désactivé dans le BIOS | Activer la virtualisation dans les paramètres du BIOS |
| Délai d’expiration de la connexion SSH | Mauvaise configuration réseau | Vérifier les paramètres config.vm.network, essayer vagrant reload |
| Le dossier synchronisé ne se met pas à jour | Guest Additions VirtualBox obsolètes | Installer 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ée | Vérifier le nom de la box sur Vagrant Cloud |
| Le provisionnement échoue en cours d’exécution | Erreur de script ou dépendance manquante | Corriger 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