Vagrant est une solution Open Source créée pour la configuration automatique de machine virtuelle et de conteneur. Vagrant permet par exemple de configurer la quantité de ram, la quantité de CPU, les paramètres réseaux et le nom d’hôte. Il peut ensuite automatiquement exécuter des scripts de gestion de configuration (Ansible, chef, Puppet, etc…). Ces scripts vont permettre l’installation et la configuration des paquets via le protocole SSH. La première version est sortie le 8 mars 2010 et était développée par Mitchell Hashimoto et John Bender en Ruby.
Vagrant est par défaut compatible avec les services de virtualisations suivants :

  • Virtual box
  • Hyper-V
  • Docker
  • VMWare
  • Amazon EC2

Il est possible d’ajouter des providers grâce à des plugins.
Installation

Pour installer Vagrant, il faut se rendre sur le site officiel (https://www.vagrantup.com/downloads.html), télécharger l’exécutable de votre système et l’exécuter. Le but est d’avoir accès à la commande « Vagrant » via la console (sur Windows il faudra donc ajouter Vagrant à votre « global path »).
Les commandes
Pour utiliser Vagrant il faut obligatoirement créer un « projet », ces derniers sont appelés « boxs ». Une liste de box partagé par la communauté est accessible sur le site http://www.vagrantbox.es/.

# lister les boxs présentent sur le système
vagrant box list
# ajouter une box
vagrant box add nom_de_ma_box url_de_la_box
# supprimer une box
vagrant box remove nom_de_ma_box
# finalisation du projet vagrant
vagrant package
# initialisation du projet vagrant
vagrant init nom_de_la_box
# Lancer la machine virtuelle
vagrant up
# Pour tester si la machine fonctionne, on se connecte en SSH
vagrant ssh

Configuration des machines virtuelles
La configuration du projet Vagrant se fait dans le fichier « vagrantfile ».
Voici quelques exemples de configurations :

nodes = [
    { :hostname => 'ex5web', :ip => '192.168.0.42', :box => 'precise32' },
    { :hostname => 'ex5db', :ip => '192.168.0.43', :box => 'precise32', :ram => 512 }
]
Vagrant.configure("2") do |config|
    nodes.each do |node|
    config.vm.define node[:hostname] do |nodeconfig|
        nodeconfig.vm.box = "precise32"
        nodeconfig.vm.hostname = node[:hostname] + ".box"
        nodeconfig.vm.network :private_network, ip: node[:ip]
        memory = node[:ram] ? node[:ram] : 256;
        nodeconfig.vm.provider :virtualbox do |vb|
        vb.customize [
            "modifyvm", :id,
            "--cpuexecutioncap", "50",
            "--memory", memory.to_s,
        ]
    end
    end
    end
    config.vm.provision "ansible" do |ansible|
        ansible.playbook = "playbook.yml"
    end
end

La partie « nodes » permet de configurer un tableau de machine à créer avec des variables personnalisées, ici, on configure leurs noms d’hôtes, leurs IPs, la RAM et l’image à utiliser.

nodes = [
    { :hostname => 'ex5web', :ip => '192.168.0.42', :box => 'precise32' },
    { :hostname => 'ex5db', :ip => '192.168.0.43', :box => 'precise32', :ram => 512 }
]

La partie centrale, « vagrant.configure » applique les paramètres du tableau de node indiqué auparavant et créait chaque machine avec les bons paramètres associés.

Vagrant.configure("2") do |config|
    nodes.each do |node|
        config.vm.define node[:hostname] do |nodeconfig|
        nodeconfig.vm.box = "precise32"
        nodeconfig.vm.hostname = node[:hostname] + ".box"
        nodeconfig.vm.network :private_network, ip: node[:ip]
        memory = node[:ram] ? node[:ram] : 256;
        nodeconfig.vm.provider :virtualbox do |vb|
            vb.customize [
                "modifyvm", :id,
                "--cpuexecutioncap", "50",
                "--memory", memory.to_s,
            ]
        end
    end
end

La partie « ansible » permet de configurer le playbook ansible à utiliser sur les machines précédemment créées.

config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
end

Gestion de configuration
Le principe de la gestion de configuration est d’avoir un script exécuté via SSH sur les machines virtuelles à la fin de la création de ces dernières par Vagrant. Dans cet exemple nous utiliserons Ansible comme gestionnaire de configuration. Pour plus d’info sur Ansible (voir l’article de présentation d’Ansible).

Vagrant.configure("2") do |config|
    #
    # Run Ansible from the Vagrant Host
    #
    config.vm.provision "ansible" do |ansible|
        ansible.playbook = "playbook.yml"
    end
end

La ligne « config.vm.provision "ansible" do |ansible| » indique que cette partie va utiliser le module Ansible de Vagrant.
La ligne « ansible.playbook = "playbook.yml" » indique à Vagrant quel script Ansible exécuté.

Conclusion
Vagrant permet de créer facilement un grand nombre de machines virtuelles et de conteneurs. Il compléte les gestionnaires de configuration qui eux, s’arrêtent à la configuration des services sur la machine et ne gère absolument pas la création des machines virtuelles. De plus la communauté est active et partage énormément de ressources.

Plus d’infos
https://www.vagrantup.com
https://www.synbioz.com/blog/vagrant_et_la_virtualisation_pour_faciliter_le_developpement
https://www.sitepoint.com/getting-started-vagrant-windows/
https://fr.wikipedia.org/wiki/Vagrant