Go to Hackademy website

Vagrant et la virtualisation pour faciliter le développement

Alexandre Salaün

Posté par dans la catégorie système

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’éxécution des commandes de Vagrant a bien été ajouté à votre PATH.

La seconde méthode, qui est celle que j’ai utilisé 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 suivi 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éfini dans ce fichier tels que le mot de passe MySQL :

config.vm.provision :chef_solo do |chef|
  chef.json = {
    :mysql_password => 'password'
  }
end

De plus amples informations sont disponible 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.

L’équipe Synbioz.

Libres d’être ensemble.

Articles connexes

Setup multiple servers easily with Chef

19/12/2012

Chef is a gem which aims to help sys admins in the process of managing servers. Chef allows you to write recipes using ruby code rather than running commands on the servers to install and configure software, users and so on. This way you can easily…

Afficher plus Afficher moins

Commentaires (5) Flux RSS des commentaires

  • 29/12/2013 à 00:22

    pharaon

    true that vagrant simplifies enormously dev environments. cheers to his creator ;-)

  • 19/04/2015 à 14:11

    BELKACEMI

    bonjour, merci pour le site web

  • 20/08/2015 à 14:54

    Joule

    Faute de grammaire
    d’avoir, auparavant, installer VirtualBox.
    Passé composé (auxiliaire + participe)
    -->
    d’avoir, auparavant, installé VirtualBox.
    pour se souvenir : remplacer par un verbe comme "prendre"
    avoir pris et non avoir prendre

  • 04/01/2016 à 18:24

    hoggar

    thank you for this nice article, can you please provide specific case: how to create a box from a production environment? I find vagrant becomes very heavy on production environments comparing with Docker?

    I allows me to add a tool that made this evidence and is very convenient in the provisioning configuration tasks is the baby ansible :)

  • 13/01/2017 à 19:29

    Guillaume Duveau

    Au cas où, pour installer les Virtualbox Guest Additions avec une machine-hôte OS X et une machine-invitée sous Linux (Debian/Ubuntu) : http://guillaumeduveau.com/fr/virtualbox-guest-additions-mac/

Ajouter un commentaire