Facilitez vos développements avec Vagrant

Thomas Fortin
13/12/2017

Préambule

Vous travaillez en équipe ?

Vous vous êtes sûrement déjà confronté à un problème de versions et de compatibilités entre les postes des différents membres de l’équipe, lors de l’arrivée d’une nouvelle personne par exemple..

Vous travaillez en solo ?

En tant que développeur polyvalent et/ou curieux, vous avez certainement une machine avec tout un tas de logiciels installés pour tous vos types de projets (Apache, Nginx, Node.js, etc)..

En équipe ou en solo..

Lors de la mise en production, il vous est peut-être déjà arrivé de tomber sur des erreurs inattendues dues à des configurations différentes entre votre machine et le serveur de production..

Vagrant est là !

Sachez que pour remédier à tous ces problèmes, une solution existe : Vagrant.
Vagrant est un logiciel qui, couplé à VMWare ou VirtualBox, va vous permettre de virtualiser vos environnements de développements et ainsi minimiser les problèmes lors de vos développements..
Finis les problèmes de compatibilité, les PC bourrés de logiciels pour tous vos environnements de dev différents (avec parfois plusieurs versions nécessaires selon les projets, comme PHP5 ou PHP7), les différences de configurations durant la mise en production, etc..

Ce qu’il faut savoir..

Étape 1 : Pré-requis

Afin de pouvoir mettre en place l’environnement pour utiliser Vagrant, vous aurez seulement besoin d’un logiciel de virtualisation de machines. Pour cet exemple, nous allons utiliser VirtualBox. Les versions compatibles avec Vagrant sont les versions 4.0.x à 4.2.x. Vous trouverez la version compatible avec votre système d’exploitation sur le site de VirtualBox, à cette page.

Étape 2 : Initialisation d’une box

Pour initialiser une box c’est très simple, soit vous créez votre box vous-même sur VirtualBox ou VMWare (ce qui n’est pas l’objet de cet article, mais vous trouverez tout ce dont vous avez besoin sur ce tutoriel). Autrement, vous pouvez trouver des boxes de base “prêtes à l’emploi” sur internet, notamment sur le site App VagrantUp, qui seront largement suffisantes dans notre cas.

Étape 3 : Utilisation générale d’une box

Dans l’utilisation quotidienne des boxes, il y aura des commandes récurrentes dont vous aurez besoin pour vos différentes manipulations. Pour utiliser ces commandes vous n’avez qu’à vous placer dans un terminal au même niveau d’arborescence que votre Vagrantfile.
En voici une liste non-exhaustive :

(Pour chaque commande, si vous n’avez qu’une box à cet endroit, le <nomdela_box> est facultatif)

Initialisation d’une box

vagrant init <adressedelabox> <versiondelabox (optionnel)>

Démarrage d’une box

vagrant up <nomdela_box>

Arrêt d’une machine en fonctionnement

vagrant halt <nomdela_box>

Listing des boxes

vagrant box list

Redémarrage d’une box (équivaut à un vagrant halt puis un vagrant up)

vagrant reload <nomdela_box>

Connexion en SSH à une box

vagrant ssh <nomdela_box>

Suppression d’une box

vagrant destroy <nomdela_box>

Vous avez désormais à peu près toutes les commandes nécessaires pour manager votre machine virtuelle avec Vagrant.

Exemple de mise en place

Afin de comprendre plus en profondeur l’utilisation de Vagrant, rien de mieux qu’un exemple concret.. Ici, nous allons installer une machine “pré-construite” tournant sous Debian 8.9.0, pour y développer une application nécessitant PHP5 et Nginx 1.6.
Ce type de machine se trouve très simplement, comme par exemple sur le site officiel de Vagrant à cette adresse.
Maintenant, nous pouvons initialiser notre machine :

vagrant init debian/jessie64 --box-version 8.9.0

Une fois cette commande faite, vous remarquerez qu’un fichier Vagrantfile a été créé à l’endroit où vous vous trouvez dans l’arborescence, avec une configuration minimale pour la lancer.
Par défaut, Vagrant utilise rsync pour synchroniser vos fichiers en local avec les fichiers de votre VM. Nous, nous allons utiliser bootcamp pour ce partage de fichier, pour cela, il faut installer un plugin avec la commande suivante :

vagrant plugin install vagrant-vbguest

Une fois ce plugin installé, vous devez modifier votre Vagrantfile afin d’indiquer où sont vos fichiers en local, et où ils doivent être synchronisés sur la machine, comme suit (à ajouter dans le bloc “Vagrant.configure”) :

# Disables the basic syncedfolderconfig.vm.syncedfolder “.”, “/vagrant”, disabled: true# Enables our syncedfolderconfig.vm.syncedfolder “../tuto/”, “/home/tuto/”, type: “virtualbox”

Dans mon cas, mon architecture est la suivante :

||_ tuto  | projet/  | Vagrantfile

À partir de ce moment, vous pouvez déjà lancer votre machine à l’aide d’un vagrant up, puis vous y connecter avec un vagrant ssh.

Grâce aux manipulations précédentes, vous pouvez constater que lorsque vous modifiez des fichiers dans votre VM, les fichiers correspondant sur votre machine physique, sont automatiquement mis à jour également !

Dans notre cas nous voulons aller plus loin, afin d’avoir tout un environnement pré-installé, passons donc au Provisionning.

Création du Shell de Provisionning

Comme mentionné précédemment, nous voulons faire tourner sur notre machine un environnement comportant : Nginx et PHP5.
Occupons nous d’installer tout ça grâce à un script Shell. Dans ce script, nous allons nous contenter d’installer tous ces utilitaires.. Il est également possible d’aller plus loin en créant un fichier Nginx pré-fait avec sa mise en place en automatique, et tout ce que vous voudrez, mais cela sort du cadre de Vagrant..

Créons d’abord le Shell “général”, qui verra si l’environnement est déjà installé, et qui lance ensuite les autres installation, si tel n’est pas le cas (dans mon cas, j’ai décidé de l’appeler install_env.sh, tout simplement) :

#!/usr/bin/env bash# Checks environment stateif [ ! -e /home/vagrant/conf.d/debian ]then  function setupenv {    sudo apt-get -y update    echo “Installation of the environment !”    sudo /bin/bash /home/tuto/install/installnginx.sh    sudo /bin/bash /home/tuto/install/installphp.sh    sudo mkdir /home/vagrant/conf.d    sudo touch /home/vagrant/conf.d/debian    echo “Environment installed !”  }  setupenvelse  echo “Environment already setup !”  sudo systemctl restart nginx php-fpmfi

Ensuite, il ne reste plus qu’à créer les autres scripts d’installations spécifiques à chaque composant de notre environnement (ici, nous faisons des scripts les plus basiques qui soient):

install_nginx.sh :

#!/usr/bin/env bashfunction checkandinstallnginx() {  if [ ! -e /etc/nginx ]  then    echo “Installation of Nginx !”    sudo apt-get -y install nginx=1.6.*    echo “Nginx installed !”  else    echo “Nginx already installed !”  fi }checkandinstallnginx

install_php.sh :

#!/usr/bin/env bashfunction checkandinstallphp() {  if [ ! -e /etc/php5 ]  then    echo “Installation of PHP 5 FPM !”    sudo apt-get -y install php5-fpm    echo “PHP 5 FPM installed !”  else    echo “PHP 5 FPM already installed !”  fi }checkandinstallphp

Bien sûr, des utilitaires existent pour ne pas avoir à faire tout cela en Shell, tels que Chef Solo ou encore Puppet. Dans cet exemple, je préfère rester au Shell classique, afin de ne pas sortir du cadre de l’article, mais vous trouverez de très bons tutoriels sur le site officiel de Vagrant : ici pour Chef Solo, et ici pour Puppet !
Maintenant que notre Shell de Provisionnement est fait, exécutons-le lors de notre vagrant up, dans notre Vagrantfile :

config.vm.provision :shell, :path => “./install/install_env.sh”

Accès à notre application

Le principe de Vagrant est de pouvoir utiliser une machine virtuelle pour effectuer nos développements, et de pouvoir en même temps, les tester sur le navigateur de notre machine physique. Pour cela, il faut donc préciser comment accéder à notre application, et cela se fait encore une fois dans le Vagrantfile, comme ceci (à ajouter dans le bloc “Vagrant.configure”) :

config.vm.network “privatenetwork”, ip: “192.168.33.10”, hostip: "127.0.0.1"

Par défaut, l’adresse IP du réseau local donnée est 192.168.33.10. Dans mon cas elle me convient très bien, mais si ce n’est pas votre cas vous pouvez la modifier comme bon vous semble.

Revue du Vagrantfile

C’est le moment de vérifier que vous avez bien suivi toutes les étapes !
Une fois toutes les manipulations précédentes effectuées, vous devriez avoir un fichier Vagrantfile ressemblant à ceci (sans les commentaires de base) :

Vagrant.configure(“2”) do |config|  # Caractéristiques de la machine (auto. suite au vagrant init)  config.vm.box = “debian/jessie64”  config.vm.boxversion = “8.9.0”# Pour accéder à notre appli dans notre navigateur  config.vm.network “privatenetwork”, ip: “192.168.33.10”, hostip: "127.0.0.1"# Pour synchroniser le fichiers : local/VM  config.vm.syncedfolder “.”, “/vagrant”, disabled: true  config.vm.syncedfolder “../tuto/”, “/home/tuto/”, type: “virtualbox”# Pour installer automatiquement notre environnement  config.vm.provision :shell, :path => “./install/installenv.sh”end

Ré-utilisation de la VM

Pour qu’une autre personne reprenne et travaille sur votre projet avec cette VM, il lui faudra récupérer les fichiers à partir du dossier tuto/ dans mon cas pour l’architecture précédemment donnée (avec Git par exemple), et que les logiciels pré-requis (Étape 1) soient installés sur le nouveau poste.
À partir de ce moment, il suffit de cloner le projet, installer le plugin dont nous avons parlé, puis faire un vagrant up. Lors de ce premier vagrant up, le lancement sera un peu long puisqu’il faut le temps de télécharger toute la VM. Une fois celui-ci terminé, vous êtes déjà prêt : vous pouvez vous connecter à cette machine avec un vagrant ssh.
Encore mieux : si vous avez vos fichiers de configurations dans votre versionnage, avec la mise en place automatique de ceux-ci dans votre environnement grâce à vos scripts, vous pouvez directement voir votre application web sur le nouveau poste. Il vous suffit de vous connecter à l’adresse renseignée dans vote Vagrantfile à la ligne du “config.vm.network.

Conclusion

Vous avez désormais ce qu’il vous faut pour virtualiser vos environnements de développement grâce à Vagrant !
Plus d’excuses pour les problèmes de compatibilités ou les mises en production foireuses, entre autres..

Bien évidemment, nous n’avons qu’effleuré le sujet, et un tas d’autres possibilités s’offrent à vous grâce à cet outil très complet.

Slickteam