wiki/HowtoVagrant.md
2018-04-26 10:40:55 +02:00

147 lines
4.3 KiB
Markdown

---
title: Howto Vagrant
categories: virtualisation dev
---
* Documentation : <https://www.vagrantup.com/docs/>
[Vagrant](https://www.vagrantup.com) est un logiciel qui permet de configurer des environnements de développement légers, portables et reproductibles.
À travers son fichier de configuration nommé **Vagrantfile**, il permet d'orchestrer la mise en place d'environnement virtuel à base de VM ou de conteneur.
## Installation
Debian Stretch propose Vagrant 1.9.1, pour l'installer (ainsi que le plugin libvirt) :
~~~
apt install vagrant vagrant-libvirt
~~~
Des paquets Debian officiels (maintenu par Hashicorp) sont aussi disponibles dans des versions plus récentes mais sans dépôts : <https://www.vagrantup.com/downloads.html>
## Providers
Vagrant permet de lancer et configurer des environnements basés sur VirtualBox, Libvirt, VMware, Docker, Amazon EC2 et plusieurs autres, ces providers peuvent être locaux ou situés sur des serveurs distants.
### Libvirt
Le [provider libvirt](https://github.com/vagrant-libvirt/vagrant-libvirt/blob/master/README.md) permet d'utiliser les services supportés par l'API [libvirt](https://libvirt.org/), notamment [KVM](HowtoKVM), voici un example d'utilisation d'un serveur KVM distant :
~~~
Vagrant.configure('2') do |config|
config.vm.provider :libvirt do |libvirt, override|
libvirt.host = "kvm-host.example.com"
libvirt.connect_via_ssh = 'yes'
libvirt.memory = 1024
libvirt.cpus = 2
libvirt.cpu_mode = "host-passthrough"
libvirt.random :model => 'random'
override.ssh.proxy_command = "ssh kvm-host.example.com nc -N %h %p"
end
end
~~~
### Virtualbox
Le provider originel et par défaut de Vagrant est [Virtualbox](https://www.virtualbox.org/), il a l'avantage de pouvoir tourner sur Linux, Windows et Mac OS :
~~~
config.vm.provider :virtualbox do |v|
v.memory = 1024
v.cpus = 2
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--ioapic", "on"]
end
~~~
### Configuration locale
Afin de permettre à chacun d'utiliser son propre provider, qu'il soit local ou distant, on peut mettre en place une surcharge de la configuration via un fichier ~/.VagrantFile :
~~~
# Load ~/.VagrantFile if exist, permit local config provider
vagrantfile = File.join("#{Dir.home}", '.VagrantFile')
load File.expand_path(vagrantfile) if File.exists?(vagrantfile)
~~~
Ce ~/.VagrantFile contiendra la configuration du provider spécifique a chaque utilisateur, s'il n'existe pas et qu'aucun provider n'est défini, le provider par défaut du système sera utilisé.
## Commandes de base
1. Lancer l'environnement:
~~~
vagrant up
~~~
2. Provisionner l'environnement:
~~~
vagrant provision
~~~
3. Stopper l'exécution de l'environnement:
~~~
vagrant halt
~~~
4. Supprimer l'environnement:
~~~
vagrant destroy
~~~
5. Accéder à la machine virtuelle par SSH
~~~
vagrant ssh
~~~
## Vagrantfile
Le Vagrantfile un fichier en Ruby qui décrit le type de machine à démarrer, leurs spécifications et leur configuration initiale (provision).
Ce fichier est unique à un projet et doit être situé à la racine de ce dernier.
Exemple:
~~~{.ruby}
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure('2') do |config|
#Image de base de la machine virtuelle
config.vm.box = "debian/stretch64"
#Désactivation de la synchronisation des fichiers à la racine du projet. (activé par défaut)
config.vm.synced_folder "./", "/vagrant", disabled: true
#Spécification du provider et caractéristiques des VM.
config.vm.provider :virtualbox do |v|
v.memory = 1024
v.cpus = 2
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--ioapic", "on"]
end
#Définition de la machine virtuelle qui sera lancée.
config.vm.define :default do |default|
default.vm.hostname = "default"
default.vm.network :private_network, ip: "192.168.33.33"
default.vm.provision :ansible do |ansible|
ansible.limit = "default"
ansible.playbook = "provisioning/vagrant.yml"
ansible.raw_arguments = ["-b"]
end
end
#Configuration permettant de distribuer l'image dans le Vagrant Atlas
config.push.define "atlas" do |push|
push.app = "evolix/evolinux"
push.vcs = false
end
end
~~~