Aller au contenu

Vagrant sous OpenSUSE Tumbleweed

VirtualBox facilite considérablement la tâche lorsqu'on a besoin d'une ou plusieurs machines virtuelles pour tester une configuration ou pour des travaux pratiques lors d'une formation. Il n'en demeure pas moins que l'installation et la configuration post-installation d'une machine virtuelle reste une activité relativement chronophage. Pour installer une machine virtuelle basée sur une distribution Linux minimale, il faut à chaque fois récupérer le fichier ISO de l'installateur, créer et configurer une machine virtuelle et suivre toutes les étapes du programme d'installation.

C'est là où Vagrant entre en jeu. Vagrant est une surcouche en ligne de commande à toute une panoplie d'hyperviseurs comme HyperV, KVM, Parallels, VMWare et VirtualBox. Le grand avantage de Vagrant, c'est qu'il permet la mise en place d'une machine virtuelle "jetable" en deux minutes chrono.

Dans l'atelier pratique ci-dessous, nous utiliserons Vagrant conjointement avec VirtualBox.

Installation

Vagrant est fourni par les dépôts officiels de la distribution :

# zypper install --no-recommends vagrant vagrant-vim vagrant-bash-completion

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/alpine312
==> box: Loading metadata for box 'roboxes/alpine312'
    box: URL: https://vagrantcloud.com/roboxes/alpine312

Les images diffèrent selon le système de virtualisation utilisé. Je récupère l'image pour VirtualBox :

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: 4

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

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

J'initialise mon système Alpine Linux :

$ vagrant init generic/alpine312
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 dernière 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/alpine312"
end

Je lance ma machine virtuelle :

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'generic/alpine312'...
==> default: Matching MAC address for NAT networking...
...

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

$ vagrant ssh
alpine312:~$

Je suis bien dans un système Alpine Linux :

alpine312:~$ cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.12.12
PRETTY_NAME="Alpine Linux v3.12"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

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

alpine312:~$ whoami
vagrant

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

alpine312:~$ sudo apk update
fetch https://mirrors.edge.kernel.org/alpine/...
...
OK: 12763 distinct packages available

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

alpine312:~$ exit
logout

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: Destroying VM and associated drives...

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/alpine312
Removing box 'generic/alpine312' (v4.1.2) with provider 'virtualbox'...

Trois OS en deux minutes

Imaginons que vous ayez besoin de vérifier le fonctionnement d'une commande sous Red Hat Enterprise Linux 8, Rocky Linux 8 et Alma Linux 8. 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 avec plusieurs hyperviseurs. Assurez-vous à chaque fois de sélectionner virtualbox.

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/microlinux/Vagrant/RHEL'
mkdir: création du répertoire '/home/microlinux/Vagrant/Rocky'
mkdir: création du répertoire '/home/microlinux/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.

Partant de là, lancez chaque machine individuellement, connectez-vous, affichez le contenu du fichier /etc/os-release, déconnectez-vous, arrêtez la machine virtuelle et supprimez-la lorsque vous n'en avez plus besoin.

Trouver des machines

Le site de Vagrant permet de rechercher et d’essayer un nombre assez conséquent de machines virtuelles. Cliquez sur le bouton Find Boxes sur la page d’accueil du projet et cherchez le ou les systèmes dont vous avez besoin pour vos tests.

Monter un cluster virtuel

Dans l'atelier pratique ci-dessous, nous allons mettre en place trois machines virtuelles dotées d'un système Rocky Linux 8 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

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/microlinux/Vagrant/Cluster'
mkdir: création du répertoire '/home/microlinux/Vagrant/Cluster/server-01'
mkdir: création du répertoire '/home/microlinux/Vagrant/Cluster/server-02'
mkdir: création du répertoire '/home/microlinux/Vagrant/Cluster/server-03'

Éditez un fichier /etc/vbox/networks.conf pour autoriser la création de réseaux privés virtuels, si ce n'est déjà fait :

# /etc/vbox/networks.conf
* 0.0.0.0/0 ::/0

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 "virtualbox" do |vb|
    vb.name = "server-01"
    vb.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 "virtualbox" do |vb|
    vb.name = "server-02"
    vb.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 "virtualbox" do |vb|
    vb.name = "server-03"
    vb.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
-----------------------------------------------------------------------------
57d530f default virtualbox running /home/microlinux/Vagrant/Cluster/server-01
cb11736 default virtualbox running /home/microlinux/Vagrant/Cluster/server-02
34d7a55 default virtualbox running /home/microlinux/Vagrant/Cluster/server-03

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é.


Documentation rédigée par un informaticien heureux élevé en plein air.
Offrez-lui un café en cliquant sur la tasse.