Vagrant est un outil qui permet de créer, configurer, se connecter et arrêter des machines virtuelles. Il s’appuie sur des fournisseurs de machines virtuelles et supportent les plus communs (VirtualBox, VMWare, Hyper-v…).

Fichier de configuration Vagrantfile

Vagrant utilise un fichier de configuration nommé Vagranfile dans lequel on décrit ce que l’on souhaite voir créer et configurer.

Les premières lignes de ce fichier indiquent à votre système que la syntaxe utilisée est du Ruby.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Ensuite on indique quelle est la version de Vagrant qui sera utilisée.

Vagrant.configure("2") do |config|

Image (ou « box »)

La première information de configuration est l’image ou Box , à partir de laquelle votre future machine virtuelle sera créée.

Il existe un catalogue d’images, plutôt bien fourni: Vagrant Boxes .

config.vm.box = "generic/debian9"

Fournisseur (ou « provider »)

Ensuite on définit quel fournisseur ou Provider on souhaite utiliser et qu’elles sont les options qu’on souhaite lui passer. Dans l’exemple ci-dessous, on indique utiliser VirtalBox, vouloir donner le nom hugo-box à la machine virtuelle et lui attribuer 2048Mo de mémoire.

config.vm.provider "virtualbox" do |vb|
  vb.name = "hugo-box"
  vb.memory = "2048"
end

Personnalisation de la machine virtuelle

Il est possible de configurer énormément d’éléments et de personnaliser cette machine virtuelle selon vos besoins.

Nom du serveur

Pour configurer son hostname :

config.vm.define 'hugo-box' do |node|
  node.vm.hostname = 'hugo-box'
end

Synchronisation de dossier

Pour configurer la synchronisation d’un dossier de votre station de travail (dans l’exemple /home/moi/mon_appli/) avec un dossier de la machine virtuelle (dans l’exemple /home/vagrant/mon_appli/), et ainsi travailler depuis la machine virtuelle sur des fichiers de votre station de travail :

config.vm.synced_folder "/home/moi/mon_appli/", "/home/vagrant/mon_appli/"

Redirection de port (ou « port forwarding »)

Si vous souhaitez pouvoir accéder à une ressource de la machine virtuelle depuis votre poste de travail, il vous faudra mettre en place de la redirection de port (ou port forwarding).

Si votre page web est accessible sur le port tcp/1313 de votre machine virtuelle, vous pouvez y accéder depuis votre station de travail (sur le même port) en ajoutant la configuration ci-dessous à Vagrant :

config.vm.network "forwarded_port", guest: 1313, host: 1313

Provisionnement (ou « provisioning »)

Si l’image qui sert de base pour la machine virtuelle a besoin d’être complétée ou personnalisée, vous pouvez demander à Vagrant de réaliser des actions suite au démarrage de la machiner virtuelle. C’est ce qui est appelé « Provisioning » chez Vagrant. Et il accepte beaucoup de « Provisioners » : Shell, Ansile, Chef, Pupper…

Shell

Pour demander à Vagrant d’exécuter une commande shell simple :

config.vm.provision "shell", inline: "who", privileged: false

ou plus complexe et définit en tant que variable $script :

config.vm.provision "shell", inline: $script, privileged: false

Ce script pourra être défini en haut de votre fichier Vagrantfile (en dehors des paramètres Vagrant) :

$script = <<-SCRIPT
git config --global user.email "je@suis.moi"
git config --global user.name "Je-Suis Moi"
SCRIPT

Vous pouvez également demander d’exécuter un fichier présent sur votre station de travail :

config.vm.provision "shell", path: script.sh, privileged: false

Ansible

Si vous avez besoin de réaliser une personnalisation plus importante de la machine virtuelle, vous pouvez utiliser un outil de déploiement comme Ansible. Je ne vais pas renter ici dans le détail de l’utilisation de Ansible, cela fera l’objet d’un autre article.

Voici comment indiquer à Vagrant d’exécuter un scénario Ansible au lancement de la machine virtuelle.

  config.vm.provision "ansible" do |ansible|
    ansible.become = true
    ansible.playbook = "./vagrant_provision.yml"
  end

Création et lancement de la machine virtuelle

Les éléments indispensables à la création et au lancement d’une machine virtuelle sont le choix d’une image et d’un fournisseur.

Vous pouvez lancer sa création et configuration avec la commande ci-dessous, à lancer lorsque que vous êtes situés dans le même répertoire que votre le Vagrantfile.

$ vagrant up

Par défaut, vous pouvez vous y connecter en ssh via la commande ci-dessous :

$ vagrant ssh

Vous serez alors connecté avec en tant qu’utilisateur vagrant, configuré par défaut sur toutes les machines virtuelles. Cet utilisateur dispose d’une authentification basée sur une paire de clés. C’est cette paire de clés qui vous permets de vous connecter sur la machine virtuelle sans avoir à entrer un mot de passe.

Vous pouvez empêcher l’utilisation en ajoutant la ligne ci-dessous à votre fichier Vagrantfile.

config.ssh.insert_key = false

Arrêter et supprimer une machine virtuelle

Vous pouvez arrêter et supprimer toutes les ressources d’une machine virtuelle avec la commande ci-dessous (--force permet de ne pas la demande de confirmation), à lancer lorsque que vous êtes situés dans le même répertoire que votre le Vagrantfile.

$ vagrant destroy  --force

Conclusion

Vagrant est un outil puissant et simple à utiliser. Je l’utilise à chaque fois que je dois mettre en place un d’environnement de développement . Cela me permet de ne pas avoir à jongler avec des frameworks, librairies et autres outils (et tout ça dans des version différentes) sur ma station de travail.

Vous trouverez en exemple les fichiers Vagrantfile et vagrant_provision.yaml, que j’utilise pour lancer et tester ce blog sur ma station de travail, dans son dépôt GitLab .