Vagrant

Posté le dim. 20 octobre 2019 dans Développement

Vagrant est un outil puissant pour les développeurs surtout lorsqu’on sait s’en servir.

Cet article a pour but de vous faire savoir pourquoi j’ai commencé à utiliser Vagrant et à faire un tour d’horizon sur les fonctionnalités qu’il propose.



Pourquoi l’utiliser ?

Le problème initial

Bien que je sois un très grand fan de GNU / Linux parfois j’utilise Windows. Cependant, je n’apprécie pas Windows en tant que système d’exploitation pour faire du développement et j’ai trouvé très vite lourd le fait de devoir passer d’un système d’exploitation à un autre à l’aide d’un amorçage double [1].

La solution

Vagrant permet de créer facilement une machine virtuelle sur VirtualBox et plein d’autre hyperviseur. Ce qui me permet de développer sur GNU / Linux, le tout en étant sur Windows.

De plus à l’aide d’un fichier qu’on appelle Vagrantfile on peut configurer facilement la machine virtuelle.

Comment l’utiliser ?

Première étape – Installations

GNU / Linux

Si vous êtes sur un système GNU / Linux utiliser votre gestionnaire de paquets en administrateur afin d’installer VirtualBox et Vagrant.

Windows

VirtualBox

Pour installer VirtualBox, il suffit d’aller sur le site officiel de VirtualBox à cette adresse : https://www.virtualbox.org/wiki/Downloads

Puis de choisir la bonne version pour votre système d’exploitation.

Ou vous utiliser chocolatey avec la commande suivante :

$ choco install virtualbox

Note

Au vu de se prémunir d’un problème d’encodage, lancer VirtualBox puis aller dans le menu fichiers, puis changer le dossier par défaut des machines vers un dossier sans espace ni accent à la racine de l’un de vos lecteurs.

Vagrant

Pour installer Vagrant, il suffit d’aller sur le site officiel de Vagrant à cette adresse : https://www.vagrantup.com/downloads.html

Puis de choisir la bonne version pour votre système d’exploitation.

Ou vous utiliser chocolatey avec la commande suivante :

$ choco install vagrant

Note

Au vu de se prémunir d’un problème d’encodage, rajouter la variable suivante dans votre environnement VAGRANT_HOME=<chemin vers un dossier sans espace ni accent à la racine de l’un de vos lecteurs>.

Seconde étape – Initialisation

Il faut choisir une Vagrant Boxes qui est un système d’exploitation pré-configuré il en existe plein. Dans notre exemple on choisira la boîte ubuntu/bionic64 qui est la dernière version LTF d’ubuntu [2].

Puis il suffit de taper la commande suivante dans le répertoire de votre choix :

$ vagrant init ubuntu/bionic64

Cette commande devra générer un fichier nommé Vagrantfile.

Troisième étape – Lancement

Une fois que vous avez votre Vagrantfile, vous pouvez taper la commande suivante dans le même répertoire afin de lancer la machine virtuelle :

$ vagrant up

La première fois ça prend toujours un peu plus de temps, car Vagrant télécharge la boîte.

Quatrième étape – Communication

Une fois que votre machine virtuelle c’est bien initialisé. Vous pouvez communiquer avec elle.

Par ssh

Vous pouvez lancer la commande suivante afin de communiquer en ssh avec la machine virtuelle :

$ vagrant ssh

Via le répertoire partagé

En allant listant le contenu du répertoire /vagrant de votre machine virtuelle vous pouvez constater qu’il y a les même fichiers que sur votre machine. Les machines créées par Vagrant, partage toujours le dossier où il y a le Vagrantfile de votre machine hôte.

Donc si vous créez un fichier dans ce répertoire il sera automatiquement partagé entre la machine hôte et virtuelle.

Cinquième étape – Configuration

Maintenant nous allons voir des fonctionnalités que propose Vagrant grâce au Vagrantfile. En effet avoir une belle machine virtuelle c’est bien mais configurée directement c’est mieux. Cela vous permet de rajouter à vos projets le fichier Vagrantfile qui permettra aux développeurs et à vous-même d’avoir un environnement de développement prêt même si vous changez d’ordinateur.

Avertissement!

Pour prendre au compte les modifications du Vagrantfile il faudra que vous redémarriez votre machine virtuelle à l’aide de la commande suivante :

Redirection de port

L’un des points pratique de Vagrant c’est qu’on peut facilement faire de la redirection de port.

C’est d’ailleurs l’une des premières chose que fait Vagrant après avoir allumé votre machine. Pour le vérifier vous pouvez taper cette ligne de votre terminale :

$ ssh vagrant@localhost -p 2222 -i .vagrant/machines/default/virtualbox/private_key

Logiquement vous vous êtes connecté à votre machine virtuelle. En effet, Vagrant créer une redirection de port sur l’hôte local [3] au port 2222 vers le port 22 de la machine virtuel pour communiquer en ssh. Comme l’indiquer sur le schéma suivant :

Redirection de l’hôte local de votre machine

Vous pouvez rajouter rediriger d’autres ports de la machine virtuelle.

Imaginons que votre application utilise le port 8000 avec le protocole http et que vous souhaitez y accéder à l’adresse suivante : localhost:8000

Décommentez la ligne 31 de votre Vagrantfile :

config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

Cette ligne signifie que le port 80 de votre machine virtuelle va être redirigé sur le port 8080 de l’hôte local. Il suffit donc de changer l’argument guest et host par 8000.

Avertissement!

Votre application sur votre machine virtuelle ne doit pas écouter que l'hôte local. Il faut qu’elle écoute son adresse publique. La solution la plus simple est de changer l’adresse d’écoute par l’adresse 0.0.0.0 si ce n’est pas déjà fait.

Vous devriez avoir donc cette ligne :

config.vm.network "forwarded_port", guest: 8000, host: 8000, host_ip: "127.0.0.1"
Étendre la portée de votre machine virtuelle

Si vous voulez que les autres machines de votre réseau puissent accéder elle aussi aux services de votre machine virtuelle vous pouvez modifier la ligne 26 :

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

Dans ce cas, le port 8000 de votre machine virtuelle sera accessible via le port 8000 de votre ordinateur.

Sinon vous pouvez aussi faire en sorte que votre machine virtuelle fasse partie de votre réseau, pour cela décommentez la ligne 40.

config.vm.network "public_network"

Maintenant votre machine virtuelle est considérée comme un appareil qui serait connecté à votre réseau.

Installation des dépendances du projet

L’un des points pratique de Vagrant c’est que l’on peut exécuter des lignes de commande lors du premier démarrage de la machine.

En effet grâce à l’option config.vm.provision du Vagrantfile vous pouvez lancer des lignes de commande au démarrage de votre machine.

Par exemple vous pouvez rajouter les commandes suivantes pour installer NGINX :

config.vm.provision "shell", inline: <<-SHELL
  sudo apt-get update
  sudo apt-get install -y nginx
SHELL

Ces lignes de commande devront s’éxécuter après l’installation de la machine virtuelle. Si vous voulez les exécuter après, vous pouvez taper cette commande dans le terminal de votre ordinateur :

$ vagrant provision

Si vous avez un script shell déjà à votre disposition vous pouvez l’exécuter en remplaçant ce que nous avons fait plus tôt par :

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

Après l’installation de la machine virtuelle le fichier script.sh devra être exécuté.

[1]Un Amorçage double ou dual-boot permet à l’utilisateur d’installer plusieurs systèmes d’exploitation sur son ordinateur et d’en choisir un lors du démarrage.
[2]Une version LTS (Long Term Support, Support à long terme en français) d’Ubuntu garanti le support du système pendant 5 ans.
[3]L’hôte local ou localhost du machine est une adresse accessible uniquement par elle-même.

Aide-mémoire

Commandes

  • vagrant init <vagrant box> Crée le Vagrantfile avec la boîte que vous avez choisie.
  • vagrant up Installe et / ou démarre la machine virtuelle configurée par le Vagrantfile.
  • vagrant reload Redémarrer la machine virtuelle configurée par le Vagrantfile.
  • vagrant halt Éteint la machine virtuelle configurée par le Vagrantfile.
  • vagrant destroy Supprime la machine virtuelle configurée par le Vagrantfile et l'éteint si ce n’est pas déjà fait.
  • vagrant provision Éxecute le script post-installation de la machine virtuelle configurée par le Vagrantfile.
  • vagrant box update Met à jour la boîte spécifiée dans le fichier Vagrantfile.

Vagrantfile

  • config.vm.box = "ubuntu/bionic64" Le nom de la boîte à installer.
  • config.vm.box_check_update Si Vagrant doit vérifier si la boîte a des mises à jour disponible (true / false par défaut true).
  • config.vm.network "forwarded_port" Configure une redirection de port de la machine virtuelle, voir : Redirection de port.
  • config.vm.network "private_network" Crée un réseau privé entre la machine virtuelle et l’hôte.
  • config.vm.network "public_network" Permet à la machine virtuelle de rejoindre le réseau de l’hôte comme un appareil normal.
  • config.vm.synced_folder <chemin vers un dossier de l’hôte> <chemin vers un dossier de la machine virtuelle> Permet de rajouter un nouveau dossier à synchroniser entre la machine virtuelle et l’hôte.
  • config.vm.provision "shell", <inline | path> Script post-installation de la machine virtuelle soit un chemin fait un fichier script (sh) soit directement des instructions, voir : Installation des dépendances du projet.