Petit jeu, est-ce que vous vous retrouvez dans les différentes situations ci-dessous :
Vous avez tout tenté :
Tiens, voici Gégé d'ailleurs...
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.
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.
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 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 :
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"
Partagez un répertoire entre votre VM et la machine hôte peut avoir plusieurs intérêt :
Pour cela, vous allez déclarer des sync folder :
config.vm.synced\_folder 'C:Usershugovagrantaptcache', "/var/cache/apt/archives"
config.vm.synced\_folder 'D:Devsrcsample', "/vagrant/src"
Le provisionning va consister lors de la création de la VM à effectuer la configuration de la machine :
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.
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