Refonte complète de la page

This commit is contained in:
whirigoyen 2023-09-15 12:21:42 +02:00
parent a59b4c349a
commit 9c76b3f49b

View file

@ -5,27 +5,94 @@ 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.
[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...).
À 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
apt install vagrant
~~~
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>
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>
## 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.
## Configuration d'un environnement avec le `Vagrantfile`
### Libvirt
Le `Vagrantfile` est unique à un projet et doit être situé dans le répertoire racine de ce dernier.
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 :
Il est écrit en Ruby et décrit le type de machine à démarrer, leurs spécifications et leur configuration initiale (provision).
Pour vérifier la validité de votre `Vagrantfile` :
~~~
$ vagrant validate
~~~
Pour éviter que Vagrant crée par défaut un partage NFS, la configuration doit contenir :
~~~
config.vm.synced_folder "./", "/vagrant", disabled: true
~~~
Sinon, 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.
~~~
### Exemple de `Vagrantfile`
~~~{.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
~~~
#### Providers
##### 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 exemple d'utilisation d'un serveur KVM distant :
~~~
Vagrant.configure('2') do |config|
@ -41,9 +108,12 @@ Vagrant.configure('2') do |config|
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 :
##### 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|
@ -54,101 +124,214 @@ config.vm.provider :virtualbox do |v|
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 :
#### 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` :
~~~
# Load ~/.VagrantFile if exist, permit local config provider
vagrantfile = File.join("#{Dir.home}", '.VagrantFile')
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)
~~~
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é.
Si `~/.Vagrantfile` 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:
### Synchroniser un répertoire entre l'hôte et l'invité
~~~
vagrant up
~~~
<https://developer.hashicorp.com/vagrant/docs/synced-folders>
2. Provisionner l'environnement:
~~~
vagrant provision
~~~
#### Avec Rsync
3. Stopper l'exécution de l'environnement:
*Documentation à venir*
~~~
vagrant halt
~~~
<https://developer.hashicorp.com/vagrant/docs/synced-folders/rsync>
4. Supprimer l'environnement:
~~~
vagrant destroy
~~~
5. Accéder à la machine virtuelle par SSH
~~~
vagrant ssh
~~~
6. Synchro automatique
Synchroniser automatiquement le répertoire :
~~~
vagrant rsync-auto
~~~
Voir la [documentation](https://developer.hashicorp.com/vagrant/docs/cli/rsync-auto).
Voir la [documentation](https://developer.hashicorp.com/vagrant/docs/synced-folders/rsync).
## 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.
## Fonctionnement
Exemple:
### Boxes
~~~{.ruby}
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant utilise des [boxes](https://developer.hashicorp.com/vagrant/docs/boxes) pour créer des VMs ou des conteneurs.
Vagrant.configure('2') do |config|
#Image de base de la machine virtuelle
config.vm.box = "debian/bookworm64"
Ce sont des sortes d'images de systèmes pré-installés.
#Désactivation de la synchronisation des fichiers à la racine du projet. (activé par défaut)
config.vm.synced_folder "./", "/vagrant", disabled: true
On peut trouver des boxes dans le [catalogue public de son éditeur HashCorp](https://vagrantcloud.com/boxes/search).
#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
Les boxes sont nommées par fournisseurs, par exemple :
#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
* `debian/bullseye64`
* `debian/bookworm64`
#Configuration permettant de distribuer l'image dans le Vagrant Atlas
config.push.define "atlas" do |push|
push.app = "evolix/evolinux"
push.vcs = false
end
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.
## Utilisation
### Gestion des boxes
Ajouter une nouvelle box Debian Bookworm pour `libvirt` aux boxes disponibles localement :
end
~~~
$ vagrant box add --provider=libvirt debian/bookworm64
~~~
Lister les boxes disponibles localement :
~~~
$ vagrant box list
debian/bookworm64 (libvirt, 12.20230723.1)
debian/bullseye64 (libvirt, 11.20210829.1)
~~~
Lister les boxes locales à mettre à jour :
~~~
$ 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
~~~
Mettre-à-jour une box :
~~~
$ vagrant box update [--provider=libvirt] --box debian/bullseye64
~~~
Supprimer une box :
~~~
$ vagrant box remove [--provider=libvirt] debian/bullseye64
~~~
Note : l'option `--provider` n'est nécessaire que s'il y a des boxes du même nom pour plusieurs providers.
### 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...) :
~~~
$ vagrant global-status
~~~
Indiquer le statut de la ou les VMs :
~~~
$ vagrant status
~~~
Créer une instance de VM par défaut avec la box `debian/bullseye64` :
~~~
$ vagrant init debian/bookworm64
~~~
Cette commande crée un fichier `Vagrantfile` (à modifier) qui contient la configuration de la VM.
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.
Démarrer ou redémarrer la VM :
~~~
vagrant up|reload
~~~
Éteindre la VM :
~~~
$ vagrant halt|suspend
~~~
Sortir de veille ou mettre en veille la VM :
~~~
$ vagrant resume|suspend
~~~
Supprimer la VM (extinction + suppression des ressources) :
~~~
$ vagrant destroy
~~~
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
*Documentation à venir*
### Interaction avec les environnements / VMs
Lister les ports mappés de l'invité vers l'hôte :
~~~
$ 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 :
~~~
$ vagrant upload source [destination]
~~~
### Provisionnement des environnements / VMs
*Documentation à venir*
~~~
vagrant provision
~~~