Article écrit par Alexandre S.
Si Vagrant vous intéresse, nous disposons également d’un tutoriel vidéo gratuit pour mettre en place votre première machine virtuelle avec vagrant.
Lors du développement d’une application ou d’un site web, il vous est sans doute arrivé d’avoir un bug dans un environnement donné (production ou staging) que vous n’arriviez pas à reproduire en local, sur votre poste. Vagrant va vous permettre, via la virtualisation, d’avoir exactement le même environnement en développement que sur vos serveurs.
Dans le cas présent, nous allons utiliser Vagrant pour le développement d’une application Rails.
Qu’est ce que Vagrant ?
Vagrant est un outil permettant de créer des machines virtuelles pendant le développement de votre application afin d’obtenir l’environnement souhaité sans pour autant changer la configuration de votre machine. Le but étant de travailler, en développement, dans le même environnement qu’en production ou en staging.
Attention toutefois, Vagrant, et par extension Virtualbox, n’ont pas vocation à être utilisés directement en production. Il s’agit bien de simuler un environnement de production pour de la pré-production ou du développement.
En ce qui me concerne, je travaille sous Mac OS mais les serveurs sont sous Debian (pour la plupart). Avec Vagrant, je ne suis donc pas obligé de changer d’OS sur mon poste pour avoir le même environnement qu’en production.
Certains diront qu’il est possible d’installer des machines virtuelles directement sur votre poste de développement (via VirtualBox ou VMware par exemple) afin de pouvoir utiliser différents environnements. C’est effectivement possible mais si vous avez un nombre de sites conséquents et donc un nombre d’environnements différents tout aussi important vous allez passer un certain temps à configurer chacun de ses environnements et ce n’est sans doute pas la façon la plus pratique de procéder.
Vagrant, lui, vous propose, via un simple fichier de configuration et un ensemble de commandes, de définir le système utilisé et de définir la configuration souhaitée pour votre environnement.
Les principaux avantages de cet outil sont la simplicité, la portabilité des VM, la légèreté (comparé à une machine virtuelle installée avec l’un des outils cités précédemment) et également la facilité que l’on a à reproduire ou dupliquer un même environnement plusieurs fois.
Pré-requis
Afin de pouvoir utiliser Vagrant sur votre machine, il est nécessaire d’avoir, auparavant, installer VirtualBox. Vous trouverez la version compatible avec votre OS sur le site de VirtualBox. Ensuite, vous pourrez installer Vagrant.
Les versions de VirtualBox supportées par Vagrant sont les suivantes : 4.0.x, 4.1.x and 4.2.x.
Installation
Il existe plusieurs façons d’installer Vagrant.
La première, consiste à télécharger le fichier nécessaire (dans la version souhaitée) pour lancer l’installation comme vous le feriez pour n’importe quelle application. Attention, dans ce cas vérifiez que le chemin nécessaire à l’exécution des commandes de Vagrant a bien été ajouté à votre PATH.
La seconde méthode, qui est celle que j’ai utilisée pour cet article, est d’utiliser RubyGems :
gem install vagrant
Une fois l’installation terminée, vous allez pouvoir ajouter des boxes pour, par la suite, créer vos environnements. Ces boxes ne sont rien d’autres que des images pour installer les OS souhaités. Il est possible d’ajouter, retirer ou lister les box via les commandes suivantes :
# ajouter une box vagrant
box
add nom_de_ma_box url_de_la_box
# supprimer une box vagrant
box remove nom_de_ma_box
# lister les box existantes
vagrant box list
Un certain nombre de boxes sont disponibles sur le site www.vagrantbox.es. Vous y trouverez sans doute ce qui vous convient. Dans le cas contraire, il est possible de créer vous-même votre propre box.
Création d’une box
Afin de créer une box, il vous faut créer un projet Vagrant. Vous pouvez ajouter le provisionning, partager des répertoires et tout ce qui est nécessaire au bon fonctionnement de l’environnement souhaité.
Un exemple complet de création de box est disponible sur le Github de Open Knowledge Foundation.
Une fois le projet complet, vous pouvez finaliser la box (afin de pouvoir l’utiliser par la suite) via la commande suivante :
vagrant package
Des options sont disponibles comme vous pouvez le voir en tapant la commande suivie de l’option –help :
vagrant package --help
Il est possible d’utiliser VeeWee pour la création de boxes. Vous trouverez sur le wiki la documentation expliquant comment créer des boxes pour Vagrant.
Utilisation
L’utilisation de Vagrant commence par l’ajout d’une box si vous ne l’avez pas encore fait :
vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
Attention, ceci peut prendre un certain temps car il faut télécharger l’image.
Ensuite, créez votre application Rails comme vous le feriez pour n’importe quel autre projet.
rails new vagrant_test_app --database=mysql
Allez, dans le répertoire de cette application pour pouvoir initialiser Vagrant via la commande suivante :
vagrant init lucid32
# lucid32 est le nom de la box utilisée pour cette application
Cette commande va créer le fichier Vagrantfile qui va servir à configurer votre box (par défaut ce fichier ne contient que le nom de la box utilisée).
Vous pouvez dès maintenant lancer la machine virtuelle :
vagrant up
Pour tester si cette dernière est bien lancée, vous pouvez vous connecter en SSH :
vagrant ssh
Si tout a fonctionné correctement, vous devriez donc maintenant être connecté en SSH sur votre VM.
Dans le cas présent, nous sommes donc connectés sur une machine virtuelle fonctionnant sous Ubuntu 10.04.4 LTS. Vous allez pouvoir installer tous les éléments nécessaires au bon fonctionnement de votre application Rails (Ruby, git, MySQL, rbenv et encore bien d’autres choses…).
Provisionnement
Différents modes de provisionnement sont disponibles. Il est possible d’utiliser Chef ou Puppet mais également de tout faire via le shell.
Avant d’effectuer toute modification dans le Vagrantfile, arrêtez votre VM via la commande suivante :
vagrant suspend
Une fois que vous aurez fini vos modifications, alors vous pourrez la relancer.
Chef
Pour pouvoir utiliser Chef afin de provisionner votre VM vous devez définir le mode de provisionnement dans le Vagrantfile de votre application :
Vagrant::Config.run do|config|
config.vm.box = "lucid32"
config.vm.provision :chef_solo do|chef|
...
end
end
Vous devez définir le chemin des cookbooks de Chef si vous en utilisez via la ligne suivante :
config.vm.provision :chef_solo do|chef|
# le chemin est relatif au répertoire de l'application Rails
chef.cookbooks_path = "./cookbooks"
end
Il est possible de donner une url plutôt que donner le chemin relatif des cookbooks:
config.vm.provision :chef_solo do|chef|
chef.recipe_url = “http://mon_site.fr/cookbooks.tar.gz”
end
Vous pouvez également ajouter des recipes à Chef :
config.vm.provision :chef_solo do|chef|
add_recipe 'ruby'
add_recipe 'mysql'
end
Des éléments de configuration peuvent également être définis dans ce fichier tel que le mot de passe MySQL :
config.vm.provision :chef_solo do |chef|
chef.json = {
:mysql_password => 'password' }
end
De plus amples informations sont disponibles dans la documentation concernant Chef et Vagrant.
Puppet
Comme pour Chef, il est nécessaire de préciser que vous utilisez Puppet dans le Vagrantfile de votre application :
Vagrant::Config.run do|config|
config.vm.provision :puppet do|puppet|
...
end
end
Le chemin et le nom du manifest de Puppet doivent être spécifié dans le fichier de configuration de Vagrant.
config.vm.provision :puppet do|puppet|
puppet.manifests_path = "./manifests"
puppet.manifest_file = "mon_manifest.pp"
end
Une documentation pour Puppet et Vagrant est également disponible sur le wiki de Vagrant.
Shell
Si vous ne souhaitez pas utiliser d’outil afin de provisionner votre VM vous pouvez tout faire via le shell. Là encore, il faut spécifier que vous utilisez le shell dans le Vagrantfile :
Vagrant::Config.run do|config|
config.vm.provision :shell do|shell|
...
end
end
Vous pouvez exécuter des scripts dans votre shell ou bien lancer des commandes :
config.vm.provision :shell, :path => "./mon_script.sh"
config.vm.provision :shell, :inline => "echo foo > /vagrant/test"
Installation manuelle
Dans le cas présent, j’ai installé tous les packages nécessaires en étant connecté en SSH sur la VM, je n’ai donc pas utilisé les instructions ci-dessus. Cette méthode est très semblable à ce que l’on pourrait faire lors de l’installation d’un serveur (vous pouvez trouver un exemple sur le Railscast concernant Vagrant).
D’autres éléments de configuration peuvent être pris en compte avant de relancer votre VM. En effet, il est par exemple possible d’utiliser plusieurs machines virtuelles pour un même projet (l’une pour la base de données et l’autre pour l’application) ou bien de définir la mémoire allouée.
Vagrant::Config.run do|config|
config.vm.define :web do|web_config|
web_config.vm.box = "web"
web_config.vm.forward_port 3000, 3000
end
config.vm.define :
db do|db_config|
db_config.vm.box = "db" db_config.vm.forward_port 3306, 3306
end
config.vm.customize [
"--memory", "256"
]
end
Le Vagrantfile utilisé pour les besoins de l’article ne contient que les lignes suivantes :
Vagrant::Config.run do|config|
config.vm.box = "lucid32"
config.vm.forward_port 3000, 3000
end
L’instruction forward_port permettra d’accèder au port 3000 de votre VM via ce même port depuis la machine locale. Il est possible de spécifier un autre port mais également de définir l’adresse IP de la machine virtuelle :
config.vm.network :hostonly, "192.168.17.17"
Une fois votre VM provisionnée et correctement configurée, vous allez pouvoir, dans un premier temps, la relancer.
vagrant resume
Ensuite, il faut se rendre dans le répertoire de l’application sur la VM et lancer la serveur Webrick (via bundle exec rails s). Enfin, vous pouvez accéder à votre application (qui se trouve sur votre VM) depuis votre machine locale via l’url suivante http://localhost:3000 (ou 192.168.17.17:3000 si vous avez défini l’adresse IP telle qu’indiqué plus haut).
Vous avez donc maintenant une application Rails dans l’environnement souhaité accessible depuis votre machine.
Conclusion
Vagrant est donc un outil permettant de créer différents environnements sur une même machine afin de pouvoir, durant le développement d’une application, utiliser le même environnement qu’en production (ou staging). Cet outil a pour principal avantage la facilité à pouvoir dupliquer un environnement donné afin de l’utiliser pour une application donnée.
La prise en main est assez rapide et avec des outils tels que Chef ou Puppet il est très simple de réutiliser une configuration donnée.
De nombreux autres exemples d’utilisation de Vagrant sont disponibles, parmi lesquels celui de Bob Maerten, qui nous a fait une belle présentation lors du dernier apéro ruby.
Si vous avez déjà utilisé Vagrant n’hésitez pas à donner vos retours en commentant cet article, je serai très intéressé de savoir ce que vous en pensez et comment vous l’utilisez.