Si vous êtes un sysops ou un devops, vous savez à quel point la création de machines virtuelles peut être fastidieuse et répétitive. C'est là qu'intervient Vagrant, un outil open-source qui permet de créer et de gérer facilement des environnements de développement et de test.

L'intérêt de Vagrant

L'intérêt de Vagrant est de générer des VM reproductibles et éphémères, avec une configuration spécifiée dans un fichier Vagrantfile. Cela permet aux développeurs de rapidement tester leurs applications sur différents environnements, tout en garantissant la cohérence des VM utilisées.

En tant que sysops, cet outil est particulièrement intéressant pour tester des mises à jour ou des outils dans un contexte de préprod.

Quelques éléments de compréhension

Les "boxes" sont des images prêtes à l'emploi que Vagrant utilise pour créer des VM. Vous pouvez trouver des boxes pour de nombreuses distributions Linux, ainsi que pour Windows. Il est également possible de créer des boxes personnalisées.

Vous pouvez chercher des images à cette adresse : https://app.vagrantup.com/boxes/search.

Pour utiliser Vagrant, vous devez d'abord installer les prérequis, tels que libvirt, VirtualBox et les librairies nécessaires. Vous devrez aussi ajouter votre utilisateur local au groupe "libvirt" ou "vbox" (en fonction de votre outil de virtualisation) pour avoir les droits de création de VM.

Pour déployer vos premières VM avec Vagrant, vous pouvez créer un environnement de test dans un dossier nommé "Vagrant". Ensuite, vous pouvez éditer le fichier Vagrantfile pour spécifier la configuration de la VM, comme la distribution Linux, la quantité de RAM, etc.

💡
N'utilisez pas Vagrant pour vos environnements de production !

Dans cet article, j'utiliserai uniquement Virtualbox.

Pré-requis d'installation sous Linux Debian 11

Installons libvirt (et ses dépendances), VirtualBox et les librairies nécessaires. Nous ajouterons l'utilisateur local de la machine au groupe "libvirt" pour avoir les droits de création de VM.

$ sudo apt update && sudo apt upgrade

$ sudo echo "deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian bullseye contrib" > /etc/apt/sources.list.d/virtualbox.list

$ wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | apt-key add -
$ wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | apt-key add -

$ sudo apt update && sudo apt install gcc make perl linux-headers-amd64 qemu-kvm libvirt-clients libvirt-daemon-system virtualbox-6.0

$ sudo usermod -aG libvirt <username>

Environnement de test Vagrant

Avant de se lancer dans la génération de machines virtuelles avec Vagrant, nous allons générer un premier environnement de tests, dans le répertoire local de l'utilisateur et dans un dossier que je nommerai "Vagrant".

$ mkdir ~/Vagrant
$ touch ~/Vagrant/Vagrantfile

Création d'une machine virtuelle Ubuntu 22.04 (Jammy) pour VirtualBox

Par défaut, la première carte réseau générée est de type NAT, pour que Vagrant puisse communiquer avec l'hôte (vous). La ligne "config.vm.post_up_message" spécifiera un message personnalisé une fois la VM construite et fonctionnelle/démarrée.

Éditons le fichier "Vagrantfile" (il n'y a pas d'extension de fichier) : $ sudo nano Vagrantfile.

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

Vagrant.configure("2") do |config|
  config.vm.define "vag-ubuntu2204" do |config|
  config.vm.hostname = "vag-ubuntu2204"
  config.vm.box = "generic/ubuntu2204"
  config.vm.post_up_message = "VM Ok"
  end
end

Ce fichier Vagrantfile est vraiment simple : génération d'une VM Ubuntu 22.04 (sans interface graphique), affichage d'un message de configuration une fois la machine lancée, rien de plus !

Pour avoir une seconde carte réseau dans la VM et la connecter dans le réseau privé hôte VirtualBox (permet la communication entre les VM et l'hôte), ajoutez cette ligne juste après le "config.vm.define..." :

config.vm.network "private_network", type: "dhcp"

Utiliser libvirt avec Vagrant

Installez le plugin complémentaire pour permettre à Vagrant d'utiliser libvirt :

$ vagrant plugin install vagrant-libvirt

Création de trois VM Ubuntu 22.04 en même temps

Pour créer plusieurs VM avec un seul Vagrantfile, rien de plus simple :

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

Vagrant.configure("2") do |config|
  config.vm.define "vag-ubuntu2204-1" do |config|
  config.vm.hostname = "vag-ubuntu2204-1"
  config.vm.box = "generic/ubuntu2204"
  config.vm.post_up_message = "VM 1 Ok"
  end

  config.vm.define "vag-ubuntu2204-2" do |config|
  config.vm.hostname = "vag-ubuntu2204-2"
  config.vm.box = "generic/ubuntu2204"
  config.vm.post_up_message = "VM 2 Ok"
  end

  config.vm.define "vag-ubuntu2204-3" do |config|
  config.vm.hostname = "vag-ubuntu2204-3"
  config.vm.box = "generic/ubuntu2204"
  config.vm.post_up_message = "VM 3 Ok"
  end
end

Par défaut, la machine virtuelle générée ne peut pas accéder au stockage local de la machine hôte.

Vagrant permet de partager des fichiers entre votre machine hôte et vos machines virtuelles. Cela est utile lorsque vous avez besoin d'échanger des fichiers ou de partager des ressources entre vos machines virtuelles. Par exemple, pour partager le dossier "/home/user/shared" de votre machine hôte avec une machine virtuelle, vous pouvez ajouter les lignes suivantes à votre Vagrantfile :

config.vm.synced_folder "/home/user/shared", "/vagrant_data"

Cette configuration indique à Vagrant de synchroniser le dossier "/home/user/shared" de votre machine hôte avec le dossier "/vagrant_data" de votre machine virtuelle.

Lignes de commande habituelles avec Vagrant

Ajouter une box (modèle de VM)

$ vagrant box add <fournisseur>/<nomBox>
# e.q. "vagrant box add generic/ubuntu2204"

Lister les box (modèle de VM)

$ vagrant box list

Générer et lancer les VM

$ vagrant up

Se connecter dans une VM

$ vagrant ssh <nom-vm.define>

Éteindre gentiment (graceful) toutes les VM/le projet

$ vagrant halt

Détruire toutes les VM/le projet

$ vagrant destroy

Quelques exemples de Vagrantfile

J'utilise VirtualBox pour effectuer mes tests, l'outil étant largement répandu et multiplateforme.

Utilisation de Vagrant avec Docker :

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"
  config.vm.provision "docker" do |d|
    d.pull_images "nginx", "postgres"
    d.run "web", image: "nginx", ports: ["80:80"]
    d.run "db", image: "postgres", ports: ["5432:5432"]
  end
end

Utilisation de provisionnement avec Ansible pour configurer la VM :

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
  end
end

Le fichier playbook.yml doit être dans le même dossier où est le Vagrantfile.


Créer un environnement de développement web : exemple de fichier Vagrantfile qui crée une machine virtuelle avec PHP 7.4, nginx et MySQL :

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = "2"
  end
  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt-get install -y nginx mysql-server php7.4 php7.4-mysql
  SHELL
end

Affaire à suivre...

Partager l'article