Ne vous est-il jamais arrivé de ne pas être capable de reproduire, sur votre environnement de développement, un bug rencontré en production ? Vous êtes sûrement sous MS Windows ou Mac OS X alors que la production tourne sous GNU/Linux… Ou ne vous est-il pas arrivé de pester pour écrire ou suivre un guide d’installation d’un environnement de développement ?

Depuis quelques années, les VMs sont là pour répondre à ces problématiques. Néanmoins, ces outils ne sont pas toujours simple à mettre en place. C’est à cet instant que Vagrant entre en scène.

Présentation

Vagrant est un outil en ligne de commande pour créer et configurer des machines virtuelles. Il encapsule un logiciel de virtualisation (tel que VirtualBox ou VMware) et un logiciel de gestion de configuration (au sens provisionning de l’environnement tel que Chef, Puppet, Salt, Docker, etc…).

Les intérêts sont multiples :

  • disposer d’un environnement de développement sur un système d’exploitation différent de sa propre machine
  • avoir plusieurs environnements de développement sans modifier la configuration de son propre système (certains projets nécessitent des configurations système qui les rendent incompatibles entre eux)
  • monter rapidement un environnement de développement complet
  • certains outils sont plus faciles à installer sous GNU/Linux
  • etc…

L’avantage principal de Vagrant est qu’il ne repose que sur un simple fichier de configuration qui définit le système à utiliser et la configuration à appliquer. Les autres avantages sont :

  • outils très simple
  • les VMs sont portables
  • moins lourd que les VMs classiques
  • facilité à dupliquer et/ou reproduire un environnement autant de fois qu’on le souhaite

Installation

Prérequis

Pour pouvoir utiliser Vagrant, il faut simplement disposer de VirtualBox et de Vagrant aussi ! Il est possible de trouver beaucoup de tutoriels sur Internet pour Mac OS X ou GNU/Linux. Pour ma part, j’ai installé VirtualBox 4.3.10 et Vagrant 1.5.4 sur MS Windows 8.

VirtualBox et Vagrant

Télécharger la dernière version de VirtualBox et la dernière version de Vagrant, puis les installer.

La VM : une box

Vagrant repose sur des boxes. Ce sont les images des OS qui sont utilisées pour la virtualisation (ici par VirtualBox). Voici les commandes pour gérer les boxes :

# ajouter une box (l'URL est optionnelle pour les boxes officielle
$ vagrant box add nom_de_ma_box url_de_la_box

# supprimer une box
$ vagrant box remove nom_de_ma_box

# lister les boxes installées
$ vagrant box list

Un des autres intérêts de Vagrant est qu’il existe déjà de nombreuses boxes toutes prêtes à être utilisées (sur vagrantbox.es ou vagrantcloud.com) mais également de nombreux projets Vagrant proposant des boxes et/ou des configurations pour différents environnements de développement (Java EE, monitoring, PHP, etc…).

Il est également possible de créer sa propre box. Il est possible de trouver un exemple de création de box sur GitHub.

Ici, nous allons simplement réutiliser une box officielle avec la commande suivante :

$ vagrant box add hashicorp/precise32

Cette commande va prendre un peu de temps car elle va télécharger l’image de l’OS :

==> box: Loading metadata for box 'hashicorp/precise32'
box: URL: https://vagrantcloud.com/hashicorp/precise32
==> box: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
box: Downloading: https://vagrantcloud.com/hashicorp/precise32/version/1/provider/virtualbox.box
←[0m←[0m Progress: 100% (Rate: 609k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!

Une fois l’image téléchargée, elle est utilisable. Pour cela, il faut créer un répertoire pour votre projet et s’y placer dedans et enfin initialiser Vagrant avec la commande suivante :

$ vagrant init hashicorp/precise32

Cette commande va simplement créer le fichier de configuration Vagrant pour votre projet :

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Utilisation

Instance de la VM

Une fois l’environnement initialisé (et éventuellement configuré), il existe quelques commandes pour manipuler l’instance de la VM :

# démarrer et configurer la VM
$ vagrant up

# se connecter en SSH à la VM
$ vagrant ssh

# vérifier l'état des VM
$ vagrant status

# mettre en pause la VM
$ vagrant suspend

# sortir de pause la VM
$ vagrant resume

# arrêter la VM
$ vagrant halt

Au premier lancement, Vagrant va construire à l’instance de la VM en fonction du fichier de configuration Vagrantfile :

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: virtualisation_default_1398468142891_45569
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.2.0
    default: VirtualBox Version: 4.3
==> default: Mounting shared folders...
    default: /vagrant => C:/projects/virtualisation

La VM est lancée. Il est possible de s’y connecter en SSH et de vérifier l’OS de la VM avec la commande suivante :

vagrant@precise32:~$ uname -a
Linux precise32 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux

Facile ! Non ?

Provisionning

Vous savez maintenant déclarer et utiliser une VM. Il est maintenant temps de s’intéresser au provisionning… Il y a au moins 4 façons de provisionner votre environnement :

C’est un sujet assez vaste que je ne vais pas détailler ici (des exemples très simples par Alexandre).

Conclusion

Nous avons là tous les éléments pour créer facilement, rapidement, de façon sûre et reproductible des environnements. Le champ d’application qui s’ouvre à nous est énorme !

  • tester des outils seulement disponibles sur un OS différent de notre machine
  • monter des environnements “types”
  • faire des tests de configuration système “jetables”
  • monter des environnements à la demande (pour l’intégration continue ou les tests de charge en continue)
  • etc…

Personnellement, dans un premier temps, je pense essayer de configurer un environnement d’intégration continue (avec Jenkins et Sonar comme l’a fait Olivier) mais surtout un environnement de monitoring (avec jmxtrans, collectd, graphite, etc…).

Ensuite, si ces tests sont concluant, je regarderai pour créer un environnement de développement complet (cad avec un environnement graphique, un IDE de développement, pré-configuration de tous les outils, etc…).

Je vous souhaite une bonne virtualisation !