A la fin de l'envoi, je code !

Vagrant et Fabric : prise en main

vagrantPetit jeu, est-ce que vous vous retrouvez dans les différentes situations ci-dessous :

1) Vous avez un environnement assez complexe à reproduire pour chaque poste de dev, un serveur de bases de données, une lib particulière, une configuration système etc…

Vous avez tout tenté :

  • un manuel d’accueil de 3 pages avec toutes les procédures d’install, mais dont l’une des étapes c’est d’aller chercher Gégé bureau 451 car “il y a que lui qui sait ce qu’il faut faire à cette étape” (Vous vous rappelez de notre fameux pompier pyromane ?).

  • des échanges de fichier via USB ou NFS. Mais au fil du temps il y a des tas de versions dans différents répertoire et plus personne sait ce que c’est. A part Gégé qui a la bonne version sur son PC.

2) Vos équipes ont toutes des postes Windows car les outils bureautiques imposé par votre société tourne dessus : Outlook, Office etc… Sauf que pour le développement vous avez besoin d’utiliser une plateforme Unix. Au début vous avez même testé tous les plugins FTP pour Eclipse, SublimeText, Intellij…

 

Tiens, voici Gégé d’ailleurs…

gege

Et puis un jour, vous avez découvert l’utilité des machines virtuelles. Vous avez passé du temps à configurer une VM, vous avez installé tout ce qu’il fallait et vous l’avez diffusé.

Sauf que le temps a passé, les versions de certains outils ont évolué et chacun a effectué ces mises à jour dans son coin. La version de votre distribution aussi a changé et un beau jour la VM d’origine a tellement divergé qu’il a fallu mettre en place des procédures de mise à jour de vos VMs….

Et si on reprenait nos habitudes de dev, qu’on versionnait notre environnement, qu’on le scriptait, voire même qu’on le testait avant diffusion ? Peut-être avez vous déjà entendu parler de traiter votre infrastructure comme du code ?

Dans ce cas, ce billet vous intéressera puisque nous allons parler de création de VM et de provisionning, le tout de façon automatisé et reproductible avec Vagrant.

Si vous avez lu le dernier billet sur Fabric, celui-ci poursuit dans la lignée. Cette fois-ci je vous propose d’utiliser Vagrant pour créer une VM, et Fabric pour la configurer et installer les softs qu’il vous faut.

Principe

Pour résumer, Vagrant est un outil vous permettant de créer des machines virtuelles prêtes à l’emploi pour vos besoins, le tout avec un simple fichier de configuration. Ce sera donc ce fichier que nous versionnerons pour le partager dans l’équipe.

Vagrant repose sur des “fournisseurs (providers)” : Virtual Box, VMWare, AWS par défaut. Et vous pouvez ajouter des plugins pour gérer d’autres providers, KVM par exemple.

Dans ce billet, nous utiliserons VirtualBox 4.2.16 (attention à bien prendre une version à jour !).

Pour “l’alimentation (provisionning)”, Vagrant repose sur des briques connues : Chef, Puppet, Ansible et du simple Shell. Là encore, en passant par des plugins on peut en rajouter et nous utiliserons justement le plugin Fabric.

Installation

Rien d’exotique, Vagrant a des packages pour les différents OS :

Mais pour notre cas nous allons ajouter deux choses supplémentaires :

Fabric  : que nous installerons avec

pip install Fabric

La petite subtilité si vous utilisez Windows c’est qu’il faut installer pycrypto manuellement pour que Fabric fonctionne. Vous trouverez le package ici http://www.voidspace.org.uk/python/modules.shtml#pycrypto

Et le plugin vagrant Fabric :

vagrant plugin install vagrant-fabric

Ensuite il vous suffirait d’aller dans un répertoire vierge et de taper :

$ vagrant init precise32 http://files.vagrantup.com/precise32.box
$ vagrant up
$ vagrant ssh

Ces commandes vous permettraient d’initialiser une VM Ubuntu Precise 32bits, de la démarrer et de vous y connecter en SSH.

Mais allons plus loin.

Le fichier Vagrantfile

Le fichier Vagrantfile a été créé lorsque vous avez fait vagrant init precise32.

Ce fichier contient la configuration de votre VM. Ce fichier va vous permettre entre autre :

  • de faire suivre des ports entre votre machine et la VM

  • de partager des répertoires entre les deux machines

  • de configurer le réseau de votre VM

  • de provisionner la VM

 

La configuration réseau

Par défaut votre machine virtuelle est accessible en ssh via le port 2222. Vagrant a effectué un reroutage du port 2222 de votre machine vers le port 22 de votre VM.

Cette technique peut s’avérer suffisante dans bien des cas. Si vous avez juste besoin d’un routage de ce type pour voir un apache et un elasticsearch installé sur la VM, il vous suffit d’écrire ceci :

config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 9200, host: 9200

Dans d’autres cas, si par exemple vous voulez utiliser plusieurs VMs et qu’elles soient toutes disponibles sur un réseau privé au sein de votre machine, alors vous allez plutôt configurer des IPs pour chaque machines :

config.vm.network :private_network, ip: "192.168.50.4"

Le partage de répertoire

Partagez un répertoire entre votre VM et la machine hôte peut avoir plusieurs intérêt :

  • éviter que chaque nouvelle VM télécharge les mêmes choses et conserve un cache commun, par exemple celui d’APT

  • Partagez votre répertoire de développement, vous permettant ainsi que développer sous votre IDE préféré sur votre machine tout en ayant tous les fichiers partagés sur la VM.

Pour cela, vous allez déclarer des sync folder :

config.vm.synced_folder 'C:\Users\hugo\vagrant\apt\cache', "/var/cache/apt/archives"
config.vm.synced_folder 'D:\Dev\src\sample', "/vagrant/src"

 

Le provisionning

Le provisionning va consister lors de la création de la VM à effectuer la configuration de la machine :

  • configuration système

  • installation de softs

Ici nous allons utiliser Fabric comme suit :

 

config.vm.provision :fabric do |fab|
  fab.tasks = ["java es_install"]
end

 

Nous avons juste déclaré deux tâches à appeler, et ces tâches sont déclarées dans un fichier fabfile.py présent au même niveau que votre fichier Vagrantfile.

Ce fichier fabfile est appelé par Vagrant pour la machine qui vient d’être monté installant dans notre exemple Java et elasticsearch.

Et en équipe ?

Voilà, nous avons fait un tour rapide. Grâce à Vagrant nous avons pu rapidement monter une VM sur notre machine avec un elasticsearch fonctionnel. Vous pouvez désormais partager ces fichiers de configuration pour votre équipe afin que chacun utilise le même environnement de travail. En cas de modif, changement d’OS, changement de configuration système etc… vous n’avez qu’à reprendre les fichiers Vagrantfile et Fabfile, travailler en local pour les mettre à jour et publier vos modifs.

Rien ne vous empêche aussi de tester la création de vos VM en appelant des scripts de vérification de la machine virtuelle créé, par exemple un script qui teste qu’il y a bien un elasticsearch qui répond sur un port donné de votre nouvelle VM. Et tout ceci, vous pouvez l’automatiser si ce processus de création de VM est vraiment critique pour vous.

Ensuite dans votre équipe, chacun peut réappliquer les modifs de provisionning :

vagrant provision

ou bien réinitialiser complètement la VM :

vagrant reload

ou encore la refaire de zéro :

vagrant destroy
vagrant up

 

Et si vous voulez jouer avec les versions complètes de ces fichiers, vous retrouverez l’ensemble du code sous Github : https://github.com/hlassiege/fabric-vagrant

 

  • Bonjour Hugo,

    Très intéressant. En fait tu utilises une machine virtuelle headless uniquement pour fournir les outils serveurs, n’est-ce-pas ?

    Tu fais comment pour fournir le reste de l’environnement de développement (IDE, éditeur de texte…) de manière automatisée ?

    Mickael

  • hlassiege

    En fait pour ce type d’outils (IDE etc…) j’utilise ceux de la machine hote. Si besoin j’utilise des dossiers partagés pour pouvoir éditer en local des fichiers présents sur la VM.

  • Pour les outils de la machine hôte, comment cela se passe pour l’installation ? chacun fait comme il veut ?

  • hlassiege

    Dans le cas qui m’intéressait, oui.

    Mais effectivement on peut aller plus loin.

    Plusieures pistes de réflexion sur le sujet :

    – Ne pas lancer la VM en mode headless (http://docs-v1.vagrantup.com/v1/docs/config/vm/boot_mode.html) et utiliser la VM avec des outils de dev déployés comme le reste. On se retrouve avec une VM de dev complète

    – utiliser un installeur type install4j pour l’install des outils de dev sur la machine. (Pas la piste que je privilégierais en premier)

    – utiliser un outils de provisionning (compatible windows dans l’idéal).

    Si je devais tester, je tenterais d’abord la 1, ensuite la 3. A voir en fonction aussi des préférences d’OS de l’équipe.

  • Merci Hugo,

    Au boulot, j’ai mis en place la solution 1 et 3 sans utiliser Vagrant (la taille de la VM commence à peser). Je provisionne pour l’instant avec un script Bash (bientôt remplacer par puppet). Tous les outils sont pré-configurés et stockés sur un FTP. Le script Bash pour provisionner ne fait qu’aller chercher les outils sur le FTP. Par contre ici, j’oblige à utiliser Linux.

  • Pingback: Vagrant et Fabric : prise en main | Eventually ...()

  • Pingback: Ansible (timeoff LT 1ère journée) | Eventually Coding()