22
0
Fork 0
wiki/HowtoVagrant.md

436 lines
11 KiB
Markdown
Raw Permalink Normal View History

2018-03-02 15:24:17 +01:00
---
title: Howto Vagrant
2018-04-26 10:16:48 +02:00
categories: virtualisation dev
2018-03-02 15:24:17 +01:00
---
2016-12-29 11:25:39 +01:00
2018-03-02 15:24:17 +01:00
* Documentation : <https://www.vagrantup.com/docs/>
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
[Vagrant](https://www.vagrantup.com) est un logiciel qui permet de configurer et démarrer des environnements virtuels légers, portables et reproductibles.
À travers son fichier de configuration nommé **Vagrantfile**, il permet d'orchestrer l'installation et la configuration de VMs ou de conteneurs variés (Libvirt, LXC, VirtualBox, VMWare, Docker, Amazon EC2...).
2016-12-29 11:25:39 +01:00
## Installation
2023-09-15 12:21:42 +02:00
~~~
apt install vagrant
~~~
Des paquets Debian officiels (maintenus par Hashicorp) sont aussi disponibles pour des versions plus récentes, mais sans dépôt : <https://www.vagrantup.com/downloads.html>
## Quickstart
Prérequis : `libvirt`, DHCP
Créer un fichier `Vagrantfile` dans un répertoire dédié :
~~~
Vagrant.configure("2") do |config|
config.vm.provider :libvirt do |libvirt|
libvirt.memory = 1024
libvirt.cpus = 2
libvirt.keymap = "fr"
end
config.vm.box = "debian/bookworm64"
config.vm.define :test_vagrant do |node|
node.vm.hostname = "test-vagrant"
end
config.vm.synced_folder "./", "/vagrant", disabled: true
end
~~~
Lancer la box :
~~~
$ vagrant up test_vagrant
~~~
Se connecter à la box :
~~~
$ vagrant ssh test_vagrant
vagrant@test-vagrant:~$
~~~
2024-01-15 18:01:25 +01:00
Stopper la box :
~~~
$ vagrant halt test_vagrant
~~~
2024-01-15 18:15:37 +01:00
## Fonctionnement
### Boxes
Vagrant utilise des [boxes](https://developer.hashicorp.com/vagrant/docs/boxes) pour créer des VMs ou des conteneurs.
Ce sont des images de systèmes pré-installés.
On peut trouver des boxes dans le [catalogue public de son éditeur HashCorp](https://vagrantcloud.com/boxes/search).
Les boxes sont nommées par fournisseurs, par exemple :
* `debian/bullseye64`
* `debian/bookworm64`
On peut aussi les récupérer en spécifiant une URL plutôt à la place du nom de la box.
### Providers
Vagrant permet de lancer et configurer des boxes dans VirtualBox, Libvirt, LXC, VMware, Docker, Amazon EC2 et autres.
Ces providers peuvent être locaux ou situés sur des serveurs distants.
#### Libvirt
Les boxes et les images `QCOW2` du provider `libvirt` sont stockées par défaut dans `/var/lib/libvirt/images/`.
Par défaut, le volume de stockage est une image au format `QCOW2`, ce qui éviter d'avoir à réserver de l'espace disque.
2024-01-15 18:15:37 +01:00
## Syntaxe de Vagrant
2023-09-15 12:21:42 +02:00
2024-01-15 18:15:37 +01:00
On configure un environnement Vagrant, constitué d'une ou plusieurs boxes, avec un fichier `Vagrantfile`.
2023-09-15 12:21:42 +02:00
2024-01-15 18:15:37 +01:00
On peut avoir autant d'environnements qu'on souhaite, tant qu'ils sont dans des répertoires distincts.
2023-09-15 12:21:42 +02:00
2024-01-15 18:15:37 +01:00
Le `Vagrantfile` peut notamment être partagé dans le dépôt d'un projet et permet d'avoir un environnement de test reproductible pour tous les usagers du dépôt.
2018-03-02 15:24:17 +01:00
2024-01-15 18:15:37 +01:00
La syntaxe est en Ruby et décrit le type de machine à démarrer, leurs spécifications et leur configuration initiale (provision).
2023-09-15 12:21:42 +02:00
2024-01-15 18:15:37 +01:00
### Vérifier la validité d'un `Vagrantfile`
2023-09-15 12:21:42 +02:00
2024-01-15 18:15:37 +01:00
Se positionner dans le répertoire où se trouve le `Vagrantfile` :
2023-09-15 12:21:42 +02:00
~~~
2024-01-15 18:15:37 +01:00
$ vagrant validate
2023-09-15 12:21:42 +02:00
~~~
2023-09-15 15:04:04 +02:00
### Exemple de `Vagrantfile` avec VirtualBox et provisionnement Ansible
2023-09-15 12:21:42 +02:00
~~~{.ruby}
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure('2') do |config|
# Image de base de la machine virtuelle
config.vm.box = "debian/bookworm64"
# Désactiver le partage et la synchronisation via NFS (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
2018-03-02 15:24:17 +01:00
~~~
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
#### Providers
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
##### Libvirt
2018-04-26 10:40:55 +02:00
2023-09-15 12:21:42 +02:00
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).
2018-04-26 10:40:55 +02:00
2023-09-15 12:21:42 +02:00
Voici un exemple d'utilisation d'un serveur KVM distant :
2018-04-26 10:40:55 +02:00
2023-09-15 15:04:04 +02:00
~~~{.ruby}
# -*- mode: ruby -*-
# vi: set ft=ruby :
2018-04-26 10:40:55 +02:00
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
~~~
2023-09-15 12:21:42 +02:00
##### 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 :
2018-04-26 10:40:55 +02:00
2023-09-15 15:04:04 +02:00
~~~{.ruby}
# -*- mode: ruby -*-
# vi: set ft=ruby :
2018-04-26 10:40:55 +02:00
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
~~~
## Utilisation du CLI
2023-09-15 12:21:42 +02:00
### Gestion des boxes
Ajouter une nouvelle box Debian Bookworm pour `libvirt` aux boxes disponibles localement :
~~~
$ vagrant box add --provider=libvirt debian/bookworm64
~~~
Lister les boxes disponibles localement :
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
~~~
$ vagrant box list
debian/bookworm64 (libvirt, 12.20230723.1)
debian/bullseye64 (libvirt, 11.20210829.1)
~~~
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
Lister les boxes locales à mettre à jour :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2023-09-15 12:21:42 +02:00
$ vagrant box outdated --global
* 'debian/bullseye64' for 'libvirt' is outdated! Current: 11.20210829.1. Latest: 11.20230615.1
* 'debian/bookworm64' for 'libvirt' (v12.20230723.1) is up to date
2016-12-29 11:25:39 +01:00
~~~
2023-11-27 11:38:49 +01:00
Mettre-à-jour toutes les box :
~~~
$ vagrant box update
~~~
2023-11-27 11:54:53 +01:00
Note : pour la commandes suivantes, l'option `--provider` n'est nécessaire que s'il y a des boxes du même nom sur plusieurs providers.
2023-11-27 11:38:49 +01:00
Mettre-à-jour une box en particulier :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2023-09-15 12:21:42 +02:00
$ vagrant box update [--provider=libvirt] --box debian/bullseye64
2016-12-29 11:25:39 +01:00
~~~
2023-09-15 12:21:42 +02:00
Supprimer une box :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2023-09-15 12:21:42 +02:00
$ vagrant box remove [--provider=libvirt] debian/bullseye64
2016-12-29 11:25:39 +01:00
~~~
2023-11-27 11:54:53 +01:00
Pour supprimer les boxes qui ne sont plus à jour, il faut d'abord faire un `vagrant destroy [<VM_ID|NAME>]` (voir plus bas [la gestion des VMs](#gestion-des-environnements-et-des-vms)) sur les VMs qui les utilisent.
Puis (ajouter `-n` pour un dry-run) :
~~~
$ vagrant box prune [--provider=libvirt]
~~~
Si on lance la commande sans supprimer les VMs au préalable, elle demandera une confirmation pour les boxes qui sont encore utilisées.
2023-09-15 12:21:42 +02:00
### Gestion des environnements et des VMs
Notes :
* Pour simplifier, on utilise le terme « VM » mais en fonction du provider ce peut aussi être un conteneur.
* **La plupart de ces commandes doivent être jouées dans le répertoire de l'environnement concerné.**
* Un environnement peut contenir plusieurs VMs. Dans ce cas, il faut préciser le nom ou l'id de l'instance dans la commande.
Lister toutes les VMs Vagrant présentes sur l'hôte (utile pour retrouver les répertoires, les ids...) :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2023-09-15 12:21:42 +02:00
$ vagrant global-status
2016-12-29 11:25:39 +01:00
~~~
2023-09-15 12:21:42 +02:00
Indiquer le statut de la ou les VMs :
2017-01-03 11:20:35 +01:00
2016-12-29 11:25:39 +01:00
~~~
2023-11-27 11:54:53 +01:00
$ vagrant status [<VM_ID|NAME>]
2016-12-29 11:25:39 +01:00
~~~
2023-11-10 11:22:48 +01:00
Créer une instance de VM par défaut avec la box `debian/bookworm64` :
2023-07-04 09:30:17 +02:00
~~~
2023-09-15 12:21:42 +02:00
$ vagrant init debian/bookworm64
2023-07-04 09:30:17 +02:00
~~~
2023-09-15 12:21:42 +02:00
Cette commande crée un fichier `Vagrantfile` (à modifier) qui contient la configuration de la VM.
2023-07-04 09:30:17 +02:00
2023-09-15 12:21:42 +02:00
Alternativement, on peut créer soi-même le `Vagrantfile` pour configurer plusieurs VMs dans le même environnement ou configurer plus finement la VM.
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
Démarrer ou redémarrer la VM :
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
~~~
2023-11-27 11:54:53 +01:00
vagrant up|reload [<VM_ID|NAME>]
2023-09-15 12:21:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
Éteindre la VM :
2017-01-03 11:20:35 +01:00
2023-09-15 12:21:42 +02:00
~~~
2023-11-27 11:54:53 +01:00
$ vagrant halt [<VM_ID|NAME>]
2023-09-15 12:21:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
Sortir de veille ou mettre en veille la VM :
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
~~~
2023-11-27 11:54:53 +01:00
$ vagrant resume|suspend [<VM_ID|NAME>]
2023-09-15 12:21:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
Supprimer la VM (extinction + suppression des ressources) :
2016-12-29 11:25:39 +01:00
2023-09-15 12:21:42 +02:00
~~~
2023-11-27 11:54:53 +01:00
$ vagrant destroy [<VM_ID|NAME>]
2023-09-15 12:21:42 +02:00
~~~
2017-01-03 11:20:35 +01:00
2023-09-15 12:21:42 +02:00
Attention : cette commande est différente de `virsh destroy`, qui ne fait qu'éteindre une VM sans supprimer les ressources ! `vagrant destroy` équivaut plutôt à `virsh destroy && virsh undefine`.
### Snapshots des environnements / VMs
> **Pré-requis** : le paquet `libguestfs-tools` doit être installé.
2024-01-15 12:51:57 +01:00
La commande `vagrant package` permet de créer une "box" d'une VM (allumée ou éteinte).
Depuis le dossier contenant le `Vagrantfile` :
2024-01-15 12:51:57 +01:00
~~~{.bash}
$ vagrant package jessie --output test-jessie-1.box
~~~
Le fichier box est une archive tar contenant un fichier .img et des métadonnées.
> **Remarque** : Vagrant enlève les clefs SSH de lhôte
2023-09-15 12:21:42 +02:00
### Interaction avec les environnements / VMs
2023-09-15 15:04:04 +02:00
Lister les ports mappés de l'invité vers l'hôte (fonctionnalité non supportée par le provider `libvirt`) :
2016-12-29 11:25:39 +01:00
2017-01-03 11:20:35 +01:00
~~~
2023-09-15 12:21:42 +02:00
$ vagrant port
22 (guest) => 2222 (host)
80 (guest) => 8080 (host)
~~~
Se connecter en SSH à une VM :
~~~
$ vagrant ssh
~~~
On peut aussi demander à Vagrant de produire une configuration SSH à ajouter dans notre `.ssh/config` :
~~~
$ vagrant ssh-config
~~~
Uploader un fichier dans la VM :
~~~
2023-12-12 15:07:47 +01:00
$ vagrant upload source [destination] [<VM_ID|NAME>]
2023-09-15 12:21:42 +02:00
~~~
### Provisionnement des environnements / VMs
*Documentation à venir*
~~~
vagrant provision
~~~
## FAQ
2024-01-15 18:15:37 +01:00
### Désactiver le partage NFS
Pour éviter que Vagrant ne crée par défaut un partage NFS, le `Vagrantfile` doit contenir :
~~~
config.vm.synced_folder "./", "/vagrant", disabled: true
~~~
Sinon, au lancement, on rencontre l'erreur :
~~~
It appears your machine doesn't support NFS, or there is not an adapter to enable NFS on this machine for Vagrant. Please verify that `nfsd` is installed on your machine, and try again. If you're on Windows, NFS isn't supported. If the problem persists, please contact Vagrant support.
~~~
### Configurer localement le provider par défaut
Si le `Vagrantfile` de l'environnement est partagé entre plusieurs utilisateurs, ceux-ci peuvent souhaiter utiliser différents providers.
Pour cela, on peut créer un fichier `~/.Vagrantfile` local, configurant le provider par défaut de l'utilisateur. Par exemple, pour utiliser par défaut le provider `libvirt` :
~~~
Vagrant.configure("2") do |config|
config.vm.provider "libvirt"
end
~~~
Ensuite, il faut mettre dans le `Vagrantfile` de chaque environnement cet en-tête :
~~~
# Load ~/.Vagrantfile if exist, permit local config provider
vagrantfile = File.join("#{Dir.home}", '.Vagrantfile')
load File.expand_path(vagrantfile) if File.exists?(vagrantfile)
~~~
Si `~/.Vagrantfile` n'existe pas et qu'aucun provider n'est défini, le provider par défaut du système sera utilisé.
### Synchroniser un répertoire entre l'hôte et l'invité
<https://developer.hashicorp.com/vagrant/docs/synced-folders>
#### Avec Rsync
*Documentation à venir*
<https://developer.hashicorp.com/vagrant/docs/synced-folders/rsync>
Synchroniser automatiquement le répertoire :
~~~
vagrant rsync-auto
~~~
Voir la [documentation](https://developer.hashicorp.com/vagrant/docs/synced-folders/rsync).
### Répertoire avec Plusieurs `Vagrantfiles`
On peut utiliser la variable d'environnement [`VAGRANT_VAGRANTFILE`](https://developer.hashicorp.com/vagrant/docs/other/environmental-variables#vagrant_vagrantfile) pour spécifier le nom (et non le chemin) du `Vagrantfile` à utiliser.