Vagrant 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'...
Vagrant 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.
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.
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
Ces 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
Notez 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 :
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