Maitriser Vagrant
Mise à jour :
Vagrant est un outil conçu pour simplifier la gestion des environnements de développement. Vous avez besoin de configurer une machine virtuelle en quelques minutes ou de créer un environnement reproductible pour toute une équipe ? Vagrant vous permet de le faire rapidement, sans vous perdre dans des configurations complexes. Son secret ? Un simple fichier de configuration, le Vagrantfile, qui automatise tout.
Petit Historique de Vagrant
Vagrant a été créé en 2010 par Mitchell Hashimoto, alors étudiant en informatique, dans le but de résoudre un problème que beaucoup de développeurs rencontrent : les fameux “ça marche pas !”. Il voulait un outil capable de rendre les environnements de développement reproductibles et uniformes, quel que soit l’ordinateur utilisé.
Initialement, Vagrant s’appuyait uniquement sur VirtualBox comme fournisseur de machines virtuelles. Ce choix a permis une adoption rapide grâce à la gratuité et à la popularité de VirtualBox. Peu de temps après, HashiCorp, la société derrière Vagrant, a été fondée pour poursuivre le développement et intégrer davantage de fournisseurs comme VMware, Docker, ou encore des services cloud tels qu’AWS.
Au fil des années, Vagrant a évolué pour inclure des fonctionnalités avancées comme le provisionnement avec des outils tels que Ansible, Chef, ou Puppet, permettant de configurer automatiquement les machines virtuelles après leur création. Aujourd’hui, Vagrant reste un incontournable pour les développeurs et les équipes DevOps, grâce à son approche orientée infrastructure as code.
Comment fonctionne Vagrant ?
À première vue, Vagrant semble magique : une seule commande, et vous avez une machine virtuelle fonctionnelle. Mais voyons ce qui se passe réellement sous le capot. Spoiler : ce n’est pas de la magie, mais une ingénieuse combinaison de concepts bien pensés. Voici les bases.
Le fonctionnement de Vagrant repose sur un fichier clé : le Vagrantfile. C’est un fichier de configuration écrit en Ruby (mais pas besoin de connaître ce langage pour l’utiliser). Il définit tout ce dont Vagrant a besoin pour créer et gérer votre environnement. Voici quelques exemples de ce qu’on y configure :
- La box : une image système de base, comme “ubuntu/bionic64”.
- Le fournisseur : l’outil qui gère la virtualisation, comme VirtualBox ou Docker.
- Le provisionnement : les scripts ou outils pour installer des logiciels, comme Ansible ou des scripts Shell.
Un exemple minimal de Vagrantfile pourrait ressembler à ceci :
Ici, Vagrant télécharge une box Ubuntu prête à l’emploi et initialise une machine virtuelle basée dessus.
Une box, c’est une image préconfigurée d’un système d’exploitation. Pensez-y comme un point de départ. Vous pouvez choisir parmi des centaines de boxes disponibles sur le Vagrant Cloud ↗ ou en créer une personnalisée.
Par exemple, pour lancer une box Ubuntu officielle :
Cela télécharge la box si elle n’existe pas localement, crée une machine virtuelle et la démarre.
Vagrant ne crée pas directement les machines virtuelles. Il s’appuie sur des fournisseurs (ou “providers”) comme :
- VirtualBox : parfait pour un usage local.
- Libvirt : pour des environnements KVM/QEMU.
- Docker : idéal pour des environnements légers et rapides.
- AWS ou Azure : pour des environnements cloud.
Le fournisseur est défini dans le Vagrantfile, mais vous pouvez aussi en changer via des commandes spécifiques.
Une fois la machine virtuelle en place, le provisionnement entre en jeu. C’est ici que vous automatisez l’installation des logiciels et des configurations nécessaires. Vagrant supporte plusieurs outils de provisionnement, comme :
-
Des scripts Shell (simples et efficaces) :
-
Des outils avancés comme Ansible, Chef, ou Puppet.
L’avantage ? Vous gagnez du temps et limitez les erreurs. Une seule configuration suffit pour que tout fonctionne chez tout le monde.
Pour interagir avec vos environnements, Vagrant propose une série de commandes simples mais puissantes :*
vagrant init
: initialise un projet Vagrant et crée un Vagrantfile.vagrant up
: démarre l’environnement.vagrant halt
: arrête la machine virtuelle.vagrant destroy
: supprime l’environnement.vagrant ssh
: se connecter à la machine virtuelle via SSH.
Quand utiliser Vagrant ?
Vagrant est l’outil idéal pour de nombreux cas de figure où des environnements reproductibles et faciles à gérer sont nécessaires. Voici les principales situations où il brille :
-
Créer des environnements de développement homogènes : Assurez que toute votre équipe travaille dans des conditions identiques, peu importe le système d’exploitation ou la configuration de chaque machine. Fini les “ça marche chez moi, pas chez toi”.
-
Tester dans des environnements variés : Besoin de tester une application sur plusieurs systèmes d’exploitation ou configurations ? Avec Vagrant, vous pouvez basculer entre Ubuntu, CentOS ou Windows sans effort, directement sur votre poste.
-
Automatiser les tests dans les pipelines CI/CD : Intégrez Vagrant dans vos pipelines d’intégration et de livraison continues. Il crée des environnements propres pour chaque build, garantissant des tests fiables avant déploiement.
-
Former et enseigner plus facilement : Fournissez des machines virtuelles préconfigurées aux étudiants ou stagiaires. Cela leur permet de se concentrer sur l’apprentissage, sans perdre de temps sur les installations ou configurations.
-
Partager des environnements avec l’équipe : Distribuez simplement un
Vagrantfile
pour que chaque développeur puisse reproduire exactement le même environnement. Un gros gain pour la collaboration en équipe. -
Prototyper et expérimenter sans risque : Testez de nouvelles technologies, configurations ou architectures en créant rapidement des environnements jetables, sans impacter votre système principal.
En résumé, utilisez Vagrant dès que vous avez besoin de flexibilité, d’homogénéité et d’automatisation dans la gestion de vos environnements. C’est un vrai couteau suisse pour les développeurs et les équipes DevOps.
Comment installer Vagrant ?
Vagrant fonctionne sur la plupart des systèmes d’exploitation dont Linux, MacOs et Windows.
Installation de Vagrant sur Linux
Je ne vais documenter que l’installation de Vagrant sur une distribution de la famille Debian (Ubuntu, kali, Pop OS) :
Installation de libvirt (KVM)
Libvirt
est une bibliothèque open-source et un
ensemble d’outils de gestion pour la virtualisation. Il fournit une interface de
programmation (API) pour gérer des outils de virtualisation, telles que KVM,
QEMU, Xen, VirtualBox et d’autres. Ma préférence va bien sûr à l’utilisation de
KVM et QEMU car plus rapide que les autres solutions pourtant plus populaires
comme VirtualBox ou vmWare Player.
Je préfère utiliser libvirt
avec QEMU et KVM,
sur un serveur de la famille Debian :
Si vous n’êtes pas un pro de la commande virsh
je vous conseille d’installer
cockpit.
Ensuite pour gérer vos vm cliquez sur ce lien http://localhost:9090 ↗. Pour vous connecter, entrez votre user / mdp. La gestion des machines virtuelles se retrouve dans la section du même nom.
Installation de Vagrant sur Windows
Pour installer Vagrant sur une machine Windows, commencez par télécharger
l’installeur Windows depuis le site web
officiel ↗.
Ensuite exécutez le et suivez les étapes d’installation. Une fois l’installation
terminée, ouvrez une fenêtre de terminal (par exemple, PowerShell ou CMD) pour
vérifier que tout fonctionne comme attendu et exécutez la commande vagrant --version
.
Installation de vagrant sur MacOS
Sur MacOS, j’ai rédigé un billet.
Premiers tours de roue
Pour vérifier que tout fonctionne, il suffit de lancer le provisionnement de votre première VM :
La première commande télécharge la box, vous pouvez en trouver en grand nombre sur ce site ↗, mais faites bien attention à utiliser des images sûres. Nous proposerons bientôt des images que nous construirons avec packer et contentant tout ce qu’il faut pour développer rapidement.
Pour éviter de définir à chaque fois votre hyperviseur, vous pouvez ajouter ceci
à votre .bashrc
:
La seconde commande, vagrant init centos\8
créé le fichier de configuration
Vagrantfile
par défaut avec le minimum syndical en utilisant une des box
ajouté avec la commande box add
.
vagrant up
lance le provisionnement en lui-même. Attention beaucoup de données
sont ajoutée à un dossier caché .vagrant
dans votre répertoire de travail !
vagrant ssh
permet de se connecter à votre VM.
Pour détruire une VM, il suffit de lancer la commande vagrant destroy
.
Le fichier de déclaration Vagrantfile
Ce fichier de déclaration Vagrantfile utilise un langage proche de ruby.
Quelques règles de syntaxe pour les fichiers Vagrantfile
- Les commentaires sur une seule ligne commencent avec un #
- Les commentaires sur plusieurs lignes sont encadrés par /* et */
- Les variables Vagrantfile sont assignées avec la syntaxe key = value (aucune
importance concernant les espaces). Les valeurs peuvent être des primitives
string
,number
ouboolean
ou encore unelist
ou unemap
. - Les chaînes de caractères sont encadrées par des “doubles-quotes”.
- Les valeurs booléennes peuvent être
true
oufalse
.
Premières lignes de Vagrantfile
Ici, on ne fait que configurer avec la version (“2”) de vagrant un objet
config
qui utilise une image ubuntu precise 32 bits
.
À partir de là, on peut configurer plus finement notre VM avec différentes sections :
config.vm
: pour paramétrer la machineconfig.ssh
: pour définir comment Vagrant accédera à votre machineconfig.vagrant
: pour modifier le comportement de Vagrant en lui-même.
En fait, on se limitera pour le moment à la partie paramétrage de la VM.
Paramétrage de la VM config.vm
Vous pouvez retrouver toute la documentation de cette partie sur le site de vagrant ↗. Je vais vous expliquer quelques-uns de ces paramètres :
Prenons cet exemple de fichier Vagrantfile
:
network
On configure ici la partie réseau. Dans notre exemple, on fixe l’adresse IP.
box
Je vous dis plus qu’on retrouve ici la box que l’on va utiliser. Ces box peuvent
être installé avec la commande vagrant box add
. Pour les lister vagrant box list
et vagrant box remove
pour les retirer.
provider
Attention ici bien indiquée l’hyperviseur utilisé. On ouvre une autre boucle pour configurer propre à chaque hyperviseur. La doc de celui de libvirt est ici ↗.
provision
Cette partie permet de définir ce qu’il se passe une fois que la machine est démarrée. Vous avez le choix d’utiliser langage dont les plus courants sont le shell, ansible et bien d’autre encore.
Dans notre exemple, on utilise Ansible avec comme paramètre le playbook et le niveau de verbosité utilisé. Le playbook doit se trouver à la racine ou si vous lui indiquez le chemin relatif dans un sous dossier.
Quelques tips
Avec la gestion des VM
Ne pas détruire la VM en cas d’erreur
Dans la phase de développement d’un playbook Ansible, il peut être utile de
conserver la VM et ce même en cas d’erreur à des fins de debug. Pour
cela, il suffit d’utiliser l’option --no-destroy-on-error
:
Vous pouvez relancer le playbook avec l’option ci-après.
Relancer le provisioning sur une VM déjà instanciée
Pour relancer le playbook sur une VM déjà démarrée, il suffit d’utiliser
l’option --provision
:
Ajouter votre VM dans votre fichier /etc/hosts
Vagrant dispose de pas mal de plugins dont un des plus intéressants est
hostsupdater
. Pour l’installer, il suffit de taper la commande suivante :
vagrant push
La commande vagrant push
permet d’invoquer une commande shell ou un script
arbitraire dans le cadre d’un push.
Par exemple, vous pouvez lancer des playbooks en prenant l’inventaire généré dans la partie provisioning :
Sur les vagrantfile
Boucle sur plusieurs machines
Lancer un playbook sur vos vms lors de leur création
Pour permettre d’utiliser plus facilement vos VMs, vous pouvez lancer un
playbook pour autoriser la connexion par mots de passe, copier votre propre clé
ssh
. Tout est envisageable.
Ensuite, il ne reste plus qu’à modifier votre config ssh dans le fichier ~/.ssh/config pour indiquer que pour se connecter aux VMs on utilise le user vagrant.
Une autre solution serait d’utiliser la conf Vagrant retourné par la commande ssh-config. Mais c’est moins générique. À vous de voir.
Suspendre et restorer des VM
Vagrant propose une fonctionnalité permettant de suspendre les VM provisionnées, afin par exemple de changer de projet ou vous pouvez démarrer de nouvelles VMS.
Il s’agit des commandes vagrant suspend
et vagrant resume
Un exemple de configuration plus complexe
Si vous voulez des exemples un peu plus complexes, je vous propose de vous rendre sur mes projets CKASandbox.
Plus d’infos
Site officiel vagrantup.com ↗ Documentation vagrantup.com/docs ↗