Vagrant, créez votre propre box

L'interêt principal de Vagrant est de proposer un environnement de développement identique à chaque développeur d'un projet. Le principe est donc de construire une machine virtuelle, la configurer avec les bons outils, puis la distribuer à son équipe. Nous avons vu précédemment comment fonctionnait Vagrant à partir d'une VM existante. Nous allons maintenant voir comment créer notre propre box.

Préparation

La première étape consiste à créer une machine virtuelle de façon très classique depuis l'interface graphique de VirtualBox. Appellez la machine MaBox.

VirtualBox create new vm

Installez votre OS dessus en choisissant comme premier utilisateur vagrant avec le mot de passe vagrant. Pareil pour le mot de passe root : vagrant. Puis démarrez là. Une fois connecté à la machine, plusieurs étapes vous attendent :

Passez en utilisateur root et installez SSH et sudo :

$ su
# apt-get install ssh sudo

On va installer un éditeur texte aussi pour faciliter la suite. Mon préféré est vi mais je ne vous en voudrais pas si vous préférez nano.

# apt-get install vim

Configurez sudo pour que les utilisateurs du groupe admin puisse avoir les droit superuser sans taper de mot de passe.

# groupadd admin
# usermod -G admin vagrant

On va ensuite modifier la configuration du fichier sudoers pour autoriser tous les utilisateurs du groupe admin à sudoer sans mot de passe.

# vi /etc/sudoers

Ajoutez (ou modifier le cas échéant) la ligne suivante :

%admin          ALL=(ALL)       NOPASSWD: ALL

Redémarrez sudo :

# service sudo restart

Revenez sur votre utilisateur vagrant et testez :

# exit
$ sudo ls

Si aucun mot de passe n'est demandé et qu'aucune erreur n'apparait, alors on est bon. Passons à la suite qui consiste à autoriser la clé SSH par défaut de vagrant à se connecter sur le compte vagrant.

$ mkdir .ssh
$ curl -k https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub > .ssh/authorized_keys
$ chmod 0700 .ssh
$ chmod 0600 .ssh/authorized_keys

C'est tout ! Il est quand même possible de procéder de façon plus sécurisée en créant votre propre clé rsa et même en changeant le nom de l'utilisateur. Cela sera le sujet d'un prochain article.

Déconnectez vous et éteignez la machine (ou l'inverse) et passons à l'étape suivante.

Packaging

Nous avons donc une machine virtuelle nommée MaBox dans Virtualbox. Nous allons la packager pour en faire une box. Placez vous quelquepart où stocker votre box. Créez par exemple un dossier box dans vos documents. Puis lancez la commande suivante :

vagrant package --base MaBox

Le paramètre base est le nom de la VM dans VirtualBox. Un traitement un peu long va se produire et à la fin, vous obtiendrez un fichier mabox.box. Ce fichier, rangez le dans un endroit accessible à vos futures config vagrant : soit en le laissant dans ce dossier, soit en la mettant sur un serveur http.

Utilisation

Nous pouvons maintenant utiliser cette box avec vagrant. Nous allons créer un dossier monserveurweb. Dedans, nous allons créer deux dossiers : data et vm. Nous allons nous rendre dans le dossier vm et initialiser vagrant :

$ mkdir monserveurweb
$ cd monserveurweb
$ mkdir data
$ mkdir vm
$ cd vm
$ vagrant init

Un fichier VagrantFile va alors apparaitre. Éditez le avec votre éditeur favori afin de modifier quelques trucs.

  • config.vm.box a pour valeur base. Changez là pour le nom de votre box (mabox)
  • config.vm.box_url est commenté. Décommentez le et indiquez le chemin vers votre fichier .box. Soit une URL si vous l'avez placé sur un serveur web, soit un chemin absolu ou relatif à votre fichier VagrantFile. Je suppose qu'on doit aussi pouvoir y mettre une URL samba, nfs, afp ou autre partage de fichier (smb://serveur/path/vm.box) pour la partager au sein d'une entreprise.
  • config.vm.network est commenté. Décommentez le et choisissez une IP si celle proposée par défaut ne vous convient pas. Si c'est la première VM que vous créez, laissez 192.168.33.10, sinon, changez le dernier octet pour avoir un IP différente de vos autres VM déjà existantes.
  • config.vm.network est commenté. Décommentez le uniquement si vous désirez que votre VM se connecte à Internet via un pont et obtienne sa propre IP privée en DHCP.
  • config.vm.synced_folder permet de spécifier un dossier partagé. C'est ici que rentre en jeu notre dossier data précédemment créé. Indiquez : config.vm.synced_folder "../data", "/home/vagrant/data". Le dossier /home/vagrant/data de votre VM sera alors synchronisé avec votre dossier data sur votre machine hôte. Vous pourrez alors y placer votre code source et l'éditer depuis Sublime Text 2.

Le reste concerne l'approvisionnement qu'on verra dans un prochain article. On peut alors terminer le tutoriel en démarrant la machine d'un vaillant :

vagrant up

Selon la localisation du fichier .box, la machine va mettre plus ou moins de temps à démarrer pour la première fois. Il va aussi vous demander quelle interface réseau la VM doit utiliser pour se connecter à Internet. Une fois fait, vous pouvez vous connecter à la machine d'un simple :

vagrant ssh

Vous voilà chez vous. Vous pouvez installer tout le caca que vous voulez, dès que vous vous rendez compte que vous avez foutu un merdier in-netoyable, sortez de votre VM et détruisez là :

vagrant destroy

Ce n'est que la VM qui est détruite. La box est toujours à sa place et vous pouvez alors la recréer juste en lançant :

vagrant up

Vous pouvez aussi diffuser ce fichier VagrantFile à vos collaborateurs qui n'auront plus qu'à lancer vagrant up à leur tour pour créer leur clone de votre VM, à la condition que le fichier .box leur soit accessible (d'où l'interêt du serveur web).

Have fun

À vous maintenant de bien préparer vos box afin de pouvoir démarrer de nouveaux projets très rapidement. Je me suis fait par exemple une box après avoir installé Debian et node.js et npm. Dès la machine créée, je peux commencer à coder.

Bonus : l'interêt du réseau privé virtuel

Quand vous avez décommenté config.vm.network, en laissant la valeur par défaut qui est donc private_network, vous avez en réalité créé un réseau qui n'existe qu'entre votre machine hôte et votre VM sur le sous réseau 192.168.33.0/32. L'IP que vous avez donc indiquée (192.168.33.10 par défaut) est donc une IP visible uniquement par vous. Si vous êtes plusieurs collaborateurs sur le même réseau local (cas typique d'une entreprise) avec chacun votre VM, si vous n'aviez utilisé que le pont réseau, chacun aurait une IP différente, rendant alors compliqué la configuration du domaine. Mais grâce à ça, chaque collaborateur accède à sa propre machine virtuelle avec la même IP ! C'est fou non ?
Du coup, vous pouvez faire des trucs fun comme configurer un sous domaine de votre application en la faisant pointer sur cette IP. Par exemple, vous indiquerez dans la configuration des zones DNS de monsuperprojetweb20.com que dev.monsuperprojetweb20.com pointe sur 192.168.33.10. Pour n'importe qui, ce domaine pointera donc dans le vide. Mais pour un développeur avec sa VM démarrée, c'est le projet de dev qui s'affichera.
Pour les codeurs solitaire, une solution bien plus simple consiste à modifier son fichier /etc/hosts afin de lui indiquer que 192.168.33.10 pointe sur absolument ce que vous désirez :

192.168.33.10   monprojet.local
192.168.33.10    kikooooooo
192.168.33.10    google.com

C'est toujours plus agréable de bosser avec un domaine qu'avec une IP impersonnelle et en plus, vous en avez absolument besoin quand vous travaillez avec des APIs qui vous demandent de renseigner les détails de votre site.

Hadrien

Hi, I'm a french Javascript Lead Developer, Web Architect from Toulouse, France. I've worked for 12 years for many projects with YUI, AngularJS, Aurelia.io and now React and React native.

Toulouse, France https://hadrien.eu