VagrantVagrant est un outil libre pour la création et la configuration de machines virtuelles. On peut le considérer comme un wrapper autour des logiciels de virtualisation comme VirtualBox, KVM, VMWare ou HyperV. Au quotidien, Vagrant facilite considérablement la manipulation des machines virtuelles, et c’est d’ailleurs ce que je me propose de vous montrer dans ce petit atelier pratique.

Prérequis

  • L’hyperviseur KVM doit être installé.
  • L’utilisateur « commun mortel » doit faire partie du groupe système libvirt.
  • Vagrant doit être installé et configuré avec le plug-in vagrant-libvirt.

Premier test

Je ne dispose pas encore de systèmes installables sur ma machine :

$ vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.

Pour commencer, je vais installer une image d’Alpine Linux, un système léger dont la taille réduite permet un téléchargement rapide :

$ vagrant box add generic/alpine316
==> box: Loading metadata for box 'generic/alpine316'
    box: URL: https://vagrantcloud.com/generic/alpine316

Les images diffèrent selon le système de virtualisation utilisé. Je récupère l’image pour KVM (libvirt) :

This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) parallels
4) virtualbox
5) vmware_desktop

Enter your choice: 2

Je crée une arborescence de test dans mon répertoire utilisateur :

$ mkdir -pv ~/Vagrant/Alpine
mkdir: création du répertoire '/home/kikinovak/Vagrant'
mkdir: création du répertoire '/home/kikinovak/Vagrant/Alpine'
$ cd ~/Vagrant/Alpine/

J’initialise mon système Alpine Linux :

$ vagrant init generic/alpine316 
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

La commande a généré un fichier Vagrantfile dans mon répertoire ~/Vagrant/Alpine. Pour l’instant, ce fichier est constitué majoritairement d’options commentées. Je peux l’éditer et le simplifier comme ceci :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/alpine316"
end

Je lance ma machine virtuelle :

$ vagrant up
Bringing machine 'default' up with 'libvirt' provider...
==> default: Checking if box 'generic/alpine316' version '4.2.4' is up to date...
==> default: Uploading base box image as volume into Libvirt storage...
==> default: Creating image (snapshot of base box volume).
...
==> default: Machine booted and ready!

Une fois qu’elle a démarré, je peux ouvrir une session SSH comme ceci :

$ vagrant ssh
alpine316:~$

Je suis bien dans un système Alpine Linux :

alpine316:~$ cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.16.3
PRETTY_NAME="Alpine Linux v3.16"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"

Dans cette machine virtuelle, je suis l’utilisateur vagrant :

alpine316:~$ whoami
vagrant

À partir de là, je peux invoquer sudo pour les tâches administratives courantes :

alpine316:~$ sudo apk update
fetch https://mirrors.edge.kernel.org/alpine/v3.16/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.edge.kernel.org/alpine/v3.16/community/x86_64/APKINDEX.tar.gz
v3.16.3-13-g4d933a1fa3 [https://mirrors.edge.kernel.org/alpine/v3.16/main]
v3.16.3-12-g2affb64843 [https://mirrors.edge.kernel.org/alpine/v3.16/community]
OK: 17035 distinct packages available

Je quitte ma machine virtuelle comme n’importe quelle session SSH :

alpine316:~$ exit
logout
Connection to 192.168.121.194 closed.

Il ne me reste plus qu’à arrêter la machine virtuelle :

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

Si je n’ai plus besoin de cette machine, je peux la supprimer :

$ vagrant destroy 
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Removing domain...
==> default: Deleting the machine folder

Et si je n’ai plus du tout l’intention de travailler avec Alpine Linux, je peux même supprimer l’image correspondante de mon système :

$ vagrant box remove generic/alpine316 
Removing box 'generic/alpine316' (v4.2.4) with provider 'libvirt'...

ImportantVagrant enregistre chaque box dans l’arborescence ~/.vagrant.d/boxes. Au premier lancement, cette image est copiée dans /var/lib/libvirt/images. La commande vagrant box remove supprime uniquement l’image dans ~/.vagrant.d/boxes. L’image correspondante dans /var/lib/libvirt/images reste en place et devra être supprimée manuellement :

  • Lancez le gestionnaire de machines virtuelles.
  • Double-cliquez sur QEMU/KVM pour afficher les détails.
  • Sélectionnez l’onglet Stockage.
  • Repérez l’image *.box.img dans la liste.
  • Mettez-la en surbrillance et supprimez-la.

Vagrant & KVM

Trouver des machines

Le portail Vagrant Cloud permet de rechercher et d’essayer un nombre assez conséquent de machines virtuelles.

  • Saisissez le nom du ou des systèmes dont vous avez besoin pour vos tests dans le champ de recherche : « red hat », « rocky », « alma », « oracle », « debian », « ubuntu », « arch », « gentoo », « freebsd », etc.
  • Vérifiez si l’hyperviseur (provider) libvirt est supporté dans les résultats correspondants.

Vagrant Cloud

Trois OS en deux minutes

Imaginons que vous ayez besoin de vérifier le fonctionnement d’une configuration spécifique sous Red Hat Enterprise Linux, Rocky Linux et Alma Linux. Pour commencer, récupérez les images des trois systèmes :

$ vagrant box add generic/rhel8
$ vagrant box add generic/rocky8
$ vagrant box add generic/alma8

ImportantCes images fonctionnent toutes avec plusieurs hyperviseurs. Assurez-vous à chaque fois de sélectionner libvirt.

Créez un répertoire pour chacun des systèmes virtualisés :

$ mkdir -pv ~/Vagrant/{RHEL,Rocky,Alma}
mkdir: création du répertoire '/home/kikinovak/Vagrant/RHEL'
mkdir: création du répertoire '/home/kikinovak/Vagrant/Rocky'
mkdir: création du répertoire '/home/kikinovak/Vagrant/Alma'

Initialisez Red Hat Enterprise Linux :

$ cd ~/Vagrant/RHEL/
$ vagrant init generic/rhel8

Éditez éventuellement le fichier Vagrantfile pour le rendre plus lisible :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/rhel8"
end

Procédez de même pour les machines virtuelles sous Rocky Linux et Alma Linux :

  • Lancez chaque machine individuellement.
  • Connectez-vous : vagrant ssh
  • Affichez le contenu du fichier /etc/os-release.
  • Déconnectez-vous : exit
  • Arrêtez la machine virtuelle : vagrant halt
  • Détruisez-la lorsque vous n’en avez plus besoin : vagrant destroy
  • Supprimez l’image lorsque vous n’en avez plus besoin : vagrant box remove
  • N’oubliez pas de supprimer l’image correspondante dans le pool de stockage de KVM.

Monter un cluster virtuel

Certains ateliers pratiques – comme par exemple la supervision ou l’orchestration – nécessitent d’avoir un cluster de serveurs sous la main. Dans l’exemple qui suit, nous allons mettre en place trois machines virtuelles dotées d’un système Rocky Linux minimal :

  • Machine n° 1 : server-01 / 10.23.45.10
  • Machine n° 2 : server-02 / 10.23.45.20
  • Machine n° 3 : server-03 / 10.23.45.30

Récupérez l’image de Rocky Linux pour KVM (libvirt) si ce n’est pas déjà fait :

$ vagrant box add generic/rocky8

Créez l’arborescence de répertoires pour les machines virtuelles :

$ mkdir -pv ~/Vagrant/Cluster/server-{01,02,03}
mkdir: création du répertoire '/home/kikinovak/Vagrant/Cluster'
mkdir: création du répertoire '/home/kikinovak/Vagrant/Cluster/server-01'
mkdir: création du répertoire '/home/kikinovak/Vagrant/Cluster/server-02'
mkdir: création du répertoire '/home/kikinovak/Vagrant/Cluster/server-03'

Rendez-vous dans le répertoire correspondant à la première machine virtuelle :

$ cd ~/Vagrant/Cluster/server-01/

Initialisez la machine virtuelle :

$ vagrant init generic/rocky8 
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Cette opération a créé un fichier Vagrantfile dans le répertoire courant. Éditez ce fichier comme suit :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/rocky8"
  config.vm.hostname = "server-01"
  config.vm.network "private_network",
    ip: "10.23.45.10"
  config.vm.provider "libvirt" do |kvm|
    kvm.default_prefix = "server-01."
    kvm.memory = 512
  end
end

AstuceNotez qu’ici j’ai limité la RAM disponible pour la VM à 512 Mo, ce qui est largement suffisant pour un serveur Linux sans système graphique. Si vous disposez de plus de ressources sur le système hôte, vous pourrez remplacer 512 par 1024 ou 2048.

Lancez la machine server-01, connectez-vous et éditez le fichier /etc/hosts en tant que root :

# /etc/hosts
127.0.0.1   localhost.localdomain localhost
10.23.45.10 server-01
10.23.45.20 server-02
10.23.45.30 server-03

Déconnectez-vous de la VM, rendez-vous dans le répertoire Cluster/server-02 et éditez le fichier Vagrantfile correspondant :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/rocky8"
  config.vm.hostname = "server-02"
  config.vm.network "private_network",
    ip: "10.23.45.20"
  config.vm.provider "libvirt" do |kvm|
    kvm.default_prefix = "server-02."
    kvm.memory = 512
  end
end

Lancez la machine server-02, connectez-vous et éditez le fichier /etc/hosts en tant que root :

# /etc/hosts
127.0.0.1   localhost.localdomain localhost
10.23.45.10 server-01
10.23.45.20 server-02
10.23.45.30 server-03

Déconnectez-vous de la VM, rendez-vous dans le répertoire Cluster/server-03 et éditez le fichier Vagrantfile correspondant :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/rocky8"
  config.vm.hostname = "server-03"
  config.vm.network "private_network",
    ip: "10.23.45.30"
  config.vm.provider "libvirt" do |kvm|
    kvm.default_prefix = "server-03."
    kvm.memory = 512
  end
end

Lancez la machine server-03, connectez-vous et éditez le fichier /etc/hosts en tant que root :

# /etc/hosts
127.0.0.1   localhost.localdomain localhost
10.23.45.10 server-01
10.23.45.20 server-02
10.23.45.30 server-03

Déconnectez-vous de la VM et affichez la vue d’ensemble :

$ vagrant global-status 
id       name    provider state   directory                                 
----------------------------------------------------------------------------
7de8865  default libvirt running /home/kikinovak/Vagrant/Cluster/server-01 
da88b42  default libvirt running /home/kikinovak/Vagrant/Cluster/server-02 
8efd3b7  default libvirt running /home/kikinovak/Vagrant/Cluster/server-03

Voici ce que ça donne dans le gestionnaire de machines virtuelles :

Vagrant Cluster

Partant de là, connectez-vous successivement à chacune des machines virtuelles et testez la connectivité avec les deux autres :

[vagrant@server-01 ~]$ hostname
server-01
[vagrant@server-01 ~]$ ping -c 1 server-02
PING server-02 (10.23.45.20) 56(84) bytes of data.
64 bytes from server-02 (10.23.45.20): icmp_seq=1 ttl=64 time=0.714 ms

--- server-02 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.714/0.714/0.714/0.000 ms
[vagrant@server-01 ~]$ ping -c 1 server-03
PING server-03 (10.23.45.30) 56(84) bytes of data.
64 bytes from server-03 (10.23.45.30): icmp_seq=1 ttl=64 time=1.29 ms

--- server-03 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.291/1.291/1.291/0.000 ms

Votre cluster local virtualisé est prêt à être utilisé.

Configurer le partage des répertoires

Lorsqu’on utilise Vagrant avec l’hyperviseur VirtualBox, la configuration par défaut met en place un répertoire partagé entre l’hyperviseur et la machine virtuelle. Cette fonctionnalité est parfois très utile, même si dans la pratique quotidienne elle peut se montrer capricieuse, étant donné que la machine virtuelle doit disposer des VirtualBox Guest Additions dans la bonne version.

La combinaison de Vagrant et KVM n’offre pas cette possibilité a priori, mais elle peut être implémentée assez facilement grâce au plug-in vagrant-sshfs. L’avantage de cette solution, c’est qu’elle est robuste et fiable et qu’elle ne nécessite aucune configuration spécifique du côté de la machine virtuelle.

Installez le plug-in :

$ vagrant plugin install vagrant-sshfs
Installing the 'vagrant-sshfs' plugin. This can take a few minutes...
Building native extensions. This could take a while...
Fetching win32-process-0.10.0.gem
Fetching vagrant-sshfs-1.3.7.gem
Installed the plugin 'vagrant-sshfs (1.3.7)'!

Pour utiliser le plug-in, il suffit d’ajouter la directive correspondante dans le fichier Vagrantfile. Voici à quoi cela peut ressembler :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/alpine316"
  config.vm.synced_folder "/home/kikinovak/Vagrant/Alpine", 
    "/vagrant", type: "sshfs"
end

Si tout se passe bien, un message correspondant s’affiche au démarrage de la machine virtuelle :

$ vagrant up
Bringing machine 'default' up with 'libvirt' provider...
...
==> default: Machine booted and ready!
==> default: Installing SSHFS client...
==> default: Mounting SSHFS shared folder...
==> default: Mounting folder via SSHFS: /home/kikinovak/Vagrant/Alpine => /vagrant
==> default: Checking Mount..
==> default: Folder Successfully Mounted!

À partir de là, l’hyperviseur et la machine virtuelle partagent un répertoire à la manière d’un vase communicant :

[kikinovak@alphamule:Alpine] $ vagrant ssh
alpine316:~$ echo "Ceci est un fichier partagé." > /vagrant/partage
alpine316:~$ exit
logout
Connection to 192.168.121.135 closed.
[kikinovak@alphamule:Alpine] $ cat partage 
Ceci est un fichier partagé.

La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *