DEV Community

ZINSOU Trinité
ZINSOU Trinité

Posted on

A la découverte de vagrant

🧠 Introduction

"Et si tu pouvais faire apparaĂźtre autant de machines comme par magie, autant que tu en voudrais pour tes environnementes tests? Pas de baguette, juste Vagrant."

Les environnements de test peuvent vite virer au cauchemar : installation foireuse, conflits de versions, etc. Et si on changeait ça avec un outil qui te fait sentir comme un DevOps sorcier ? đŸŽ©âœš

Dans cet article, on va :

  • DĂ©couvrir ce qu’est Vagrant (sans s’endormir) 😮❌

  • L’utiliser pour crĂ©er deux VMs Ubuntu đŸ–„ïžđŸ–„ïž et prĂ©parer un environnement de test pour notre sĂ©rie sur les sauvegardes incrĂ©mentales avec Postgre+Barman

  • Et tester notre setup comme des pros đŸ§Ș

đŸȘ„ Vagrant, c’est quoi ce truc ?

"Vagrant, c’est un peu comme Docker, mais pour les VM. C’est ton chef d’orchestre pour VirtualBox, VMware, Hyper-V, et autres joyeusetĂ©s. C’est un outil ultra fiable pour gĂ©rer des environnements complets avec de vraies machines virtuelles de maniĂšre simple et automatisĂ©e."

Il s’agit d’un outil dĂ©veloppĂ© par Hashicorp permettant de gĂ©rer facilement des VMs avec une isolation totale des dĂ©pendances et des configurations, tout ceci dans un environement unique et jetable.

Tu lui Ă©cris un Vagrantfile, tu tapes vagrant up, et boum đŸ’„ : ta(tes) machine(s) est(sont) lĂ , toute prĂȘte Ă  etre utilisĂ©e(s). Pas besoin de cliquer sur 27 boutons dans VirtualBox ou te battre avec Hyper-V.

Vagrant t’évite de :

❌ Aller tĂ©lĂ©charger une ISO

❌ Suivre l’installateur à la main

❌ GalĂ©rer avec le rĂ©seau et les scripts

✅ Il te permet de tout faire automatiquement, et de rĂ©initialiser ton environnement quand tu veux, comme une sauvegarde rapide de ta vie de dev.

🔍 Pourquoi c’est pratique ?

  • 🔄 Test facile : tu veux tester une config Postgres ? SSH ? Un cluster ? Un lab rĂ©seau? Boom, tu spin une VM.

  • đŸ’„ Sans risque : tu peux facilement prĂ©parer des dĂ©mos ou tutoriels sans polluer ta machine principale. Si tu casses tout, tu fais vagrant destroy && vagrant up et ça repart.

  • đŸ€ Partageable : tu bosses en Ă©quipe ? Tu commits ton Vagrantfile et tout le monde a le mĂȘme environnement.

  • đŸ§Ș Proche de la prod : tu peux crĂ©er des environnements qui imitent vraiment un serveur rĂ©el (contrairement Ă  Docker qui fait du container). Tu as dĂ©sormais donc tout pour apprendre l’admin systĂšme ou le DevOps.

đŸ› ïž Comment ça fonctionne ?

Vagrant repose sur :

  • Un provider (gĂ©nĂ©ralement VirtualBox ou Hyper-V) pour faire tourner les machines

  • Les boxes : ce sont des images de systĂšmes dĂ©ployables au sein de tout environnement Vagrant. Il s'agit en pratique d'une façon de packager une distribution afin de permettre un dĂ©ploiement uniforme quel que soit le systĂšme d'exploitation ou l'hyperviseur utilisĂ©. Tu peux consulter le depot officiel des boxes de vagrant ici

  • Un Vagrantfile (ta recette): le fichier dans lequel toute la magie se dĂ©finie.

  • Des scripts ou outils pour provisionner la machine (installer des logiciels, configurer les services de base)

Vagrant va provisioner la machine en fonction de ce qui est décrit dans le fichier Vagrantfile (souvent à la racine du projet). Un fichier Vagrantfile est un fichier Ruby, dont le contenu ne nécessite pas une grande connaisance de Ruby. Il sert à décrire toutes les caractéristiques de la machine cible (stockages, Ram, réseaux, etc) et aussi à préparer tous les utilitaires de base nécessaire au bon fonctionnement de la machine.

🎓 Premiers pas avec vagrant

Dans la suite nous allons prendre en main vagrant et mettre en place un lab pour la série à propos des sauvegardes incrémentales avec postgres. On mettra dans la suite notre lab en place sur une machine Ubuntu.

Il s’agira Ă  la fin de pouvoir dĂ©marrer deux VM sur lequelles nous allons installer respectivement barman et postgres.

🚀 Installation de Vagrant

Tu peux installer vagrant soit en ligne de commande soit avec un executable disponible sur la documentation officielle ici.

Il faudra aussi VirtualBox fonctionnel pour la suite, c’est le provider vagrant que nous allons utiliser dans la suite

đŸ› ïž Manipulation de Vagrant

Pour dĂ©marrer nous allons simplement Ă©crire notre premier Vagrantfile, on y mettra le minimum d’information pour faire tourner une VM. Il faudra crĂ©er un dossier qui contiendra un fichier Vagrantfile dont le contenu pourra ĂȘtre le suivant

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.vm.hostname = "vagrantbox"
end
Enter fullscreen mode Exit fullscreen mode

Vagrant mets Ă  disposition une large variĂ©tĂ© de commande pour manipuler les diffĂ©rentes composantes de l’ecosystĂšme vagrant comme vagrant box list ou vagrand box add box_name pour respectivement lister les box disponibles localement, et ajouter une box Ă  la collection locale.

$ vagrant box add ubuntu/focal64
==> box: Loading metadata for box 'ubuntu/focal64'
    box: URL: https://vagrantcloud.com/api/v2/vagrant/ubuntu/focal64
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) virtualbox
4) vmware_desktop

Enter your choice: 3
==> box: Adding box 'ubuntu/focal64' (v2004.01) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/ubuntu/boxes/focal64/versions/20240821.0.1/providers/virtualbox/unknown/vagrant.box
Enter fullscreen mode Exit fullscreen mode
$ vagrant box list             
ubuntu/bionic64 (virtualbox, 20230607.0.0)
ubuntu/focal64  (virtualbox, 20240220.0.0)
Enter fullscreen mode Exit fullscreen mode

Plus d’information sur la gestion des box vagrant ici.

VĂ©rifions ensuite que la syntaxe du fichier est correcte avec vagrant validate. S’il n’y a aucune erreur tu verras le message suivant Vagrantfile validated successfully.

A ce stade s’il n’y a aucune erreur, on peut lancer notre vm avec la commande vagrant up

$ vagrant up             
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/focal64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/focal64' version '20240220.0.0' is up to date...
==> default: A newer version of the box 'ubuntu/focal64' for provider 'virtualbox' is
==> default: available! You currently have version '20240220.0.0'. The latest is version
==> default: '20240821.0.1'. Run `vagrant box update` to update.
==> default: Setting the name of the VM: ocr_default_1749933808776_2967
==> default: Clearing any previously set network interfaces...
[...]

$ vagrant status
Current machine states:

default                   running (virtualbox)
[...]
Enter fullscreen mode Exit fullscreen mode

Une fois la VM lancĂ©e, on pourra s’y connecter par ssh pour effectuer nos diffĂ©rentes manipulations avec la commande vagrant ssh nom_machine.

Vagrant peut etre bien aussi utilisĂ© dans un context pour rĂ©pondre Ă  un schĂ©ma d’architecture multi-tiers ie plusieurs machines(parfois avec diffĂ©rents OS) Ă  la fois comme c’est souvent le cas en production; il suffi juste d’alligner autant de description de VM qu’il nous faut.

Connectons nous Ă  prĂ©sent Ă  notre machine jusqu’ici prĂ©parĂ©e

$ vagrant ssh default             
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-172-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro
[...]
vagrant@vagrantbox:~$
Enter fullscreen mode Exit fullscreen mode

Le diagramme ci-dessous illustre le parcours typique d'une machine virtuelle Vagrant, depuis son initialisation jusqu'Ă  sa suppression complĂšte.

Cycle de vie VM Vagrant

Étapes principales

  1. vagrant init

    Initialise un projet Vagrant en créant un Vagrantfile.

  2. Configured vagrantfile

    Etape importante pour la mise en place du Vagrantfile. On y mettre le necessaire pour la prĂ©paration de la machine(provisonnement et autre). Ensuite grace Ă  la commande vagrant up on dĂ©marre la machine virtuelle. Si elle n’existe pas, elle est créée et provisionnĂ©e.

  3. Running

    La machine est en cours d'exĂ©cution. À partir de lĂ , plusieurs options s’offrent Ă  toi :

* `vagrant reload` : redémarre la VM avec la config à jour

* `vagrant suspend` / `vagrant resume` : suspend et reprend l’exĂ©cution

* `vagrant halt` : éteint la VM proprement

* `vagrant provision` : réexécute les scripts de provisioning
Enter fullscreen mode Exit fullscreen mode
  1. Destroy Avec vagrant destroy, la VM est complÚtement supprimée. Tu reviens alors à un état propre.

🚀 Provisionner les VM vagrant

Maintenant que notre environnement de base est dĂ©fini dans le Vagrantfile, il est temps de prĂ©parer chaque machine pour qu’elles soient prĂȘtes Ă  l’emploi ie installer le nĂ©cessaire qu’il faut pour les utiliser; c’est l’etape du provisionnement.

Vagrant met à disposition plusieurs interfaces pour provisionner nos VM: les provisionneur de type shell, fichier, chef, docker, ansible, etc. Dans la suite, nous allons découvrir quelques un de ces provisonneurs et préparer le nécessaire pour provisonner nos VM pour le lab sur postgres et vagrant.

  1. Provisionner Shell

Il permet de spĂ©cifier une suite d’instruction Ă  exĂ©cuter pour provisionner la machine. Cette interface supporte par defaut deux options inline et path pour respectivement spĂ©cifier une commande Ă  directement saisir dans le vagranfile ou le chemin vers un script bash deja pret Ă  l’emploi pour prĂ©parer notre machine comme le montre l’exemple ci dessous

Vagrant.configure("2") do |config|
  # ... autre configuration
  config.vm.provision "shell",
    inline: "echo Hello, World"
end

Vagrant.configure("2") do |config|
  # ... autre configuration
  config.vm.provision "shell", path: /path/to/my/bash/script
end
Enter fullscreen mode Exit fullscreen mode
  1. Provisionner fichier

Il permet de monter un fichier ou un dossier depuis la machine hĂŽte vers la machine virtuelle.

Ce mĂ©canisme est particuliĂšrement utile lorsqu’il s’agit de partager des scripts de provisionnement, des fichiers de configuration ou des jeux de donnĂ©es entre l’hĂŽte et la VM, sans avoir Ă  les copier manuellement Ă  chaque fois. Pour copier par exemple un fichier vers la machine hote, la syntaxe est la suivante:

Vagrant.configure("2") do |config|
  # ... autre configuration

  config.vm.provision "file", source: "~/path/to/host/folder", destination: "$HOME/remote/newfolder"
end
Enter fullscreen mode Exit fullscreen mode

Cette copie est ponctuelle et ne synchronise pas l’etat des fichiers. Pour synchroniser l’etat des fichiers entre l’hote et la VM, la configuration doit se prĂ©senter comme suit:

Vagrant.configure("2") do |config|
  # ... autre configuration

  config.vm.synced_folder "src/", "/srv/website"
end
Enter fullscreen mode Exit fullscreen mode

Pour plus d’informations sur la sychronisation consulter la documentation officielle ici.

  1. Provisionner ansible

Contrairement aux scripts shell classiques, le provisionneur Ansible permet de dĂ©crire l’état attendu d’un systĂšme de maniĂšre dĂ©clarative. Cela signifie que tu Ă©cris des "playbooks" (fichiers YAML) qui dĂ©finissent ce que tu veux obtenir (ex. : PostgreSQL installĂ©, un utilisateur créé, un service dĂ©marrĂ©), et Ansible s’occupe de faire le nĂ©cessaire pour atteindre cet Ă©tat, sans rĂ©pĂ©ter inutilement les tĂąches dĂ©jĂ  effectuĂ©es.

🔍 Avantages d’utiliser Ansible avec Vagrant :

  • ✅ Code plus lisible, structurĂ© et rĂ©utilisable.

  • 🔁 Idempotence : rejouer un playbook ne modifie rien si tout est dĂ©jĂ  en place.

  • ⚙ Facile Ă  maintenir, surtout pour des environnements complexes ou multi-machines.

Vagrant peut exĂ©cuter Ansible en tant que provisionneur local ou distant, selon que Ansible est installĂ© sur l’hĂŽte ou sur la VM elle-mĂȘme.

Voici un exemple minimal dans un Vagrantfile :

config.vm.provision "ansible" do |ansible|
  ansible.playbook = "playbook.yml"
  ansible.inventory_path = "inventory.ini"
end
Enter fullscreen mode Exit fullscreen mode

đŸ§Ș Phase pratique : mise en place du lab PostgreSQL + Barman

Il est temps de passer Ă  la pratique et de construire notre environnement de test.

L’objectif de cette phase est de crĂ©er deux machines virtuelles Ă  l’aide de Vagrant :

  • 🐘 Une premiĂšre VM avec PostgreSQL installĂ©; elle simulera notre base de donnĂ©es source,

  • 📩 Une seconde VM avec barman installĂ©; elle reprĂ©sentera un poste administrateur ou une machine de contrĂŽle depuis laquelle on pourra gĂ©rer nos sauvegardes.

Nous allons automatiser l’installation de chaque composant Ă  l’aide de scripts de provisionnement Bash. Le Vagrantfile dĂ©finira l’architecture de notre lab et exĂ©cutera les scripts automatiquement au dĂ©marrage des machines.

Commençons par crĂ©er le fichier Vagrantfile et les scripts nĂ©cessaires Ă  l’installation de postgres et barman.

Vagranfile:

# Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.define "vm1_postgres" do |vm1|
    vm1.vm.box = "ubuntu/jammy64"
    vm1.vm.hostname = "postgres"
    vm1.vm.network "private_network", ip: "192.168.56.10"
    vm1.vm.provision "shell", path: "scripts/setup_postgres.sh"
  end

  config.vm.define "vm2_vagrant" do |vm2|
    vm2.vm.box = "ubuntu/jammy64"
    vm2.vm.hostname = "vagrant"
    vm2.vm.network "private_network", ip: "192.168.56.11"
    vm2.vm.provision "shell", path: "scripts/setup_vagrant.sh"
  end
end
Enter fullscreen mode Exit fullscreen mode

scripts/setup_postgres.sh

#!/bin/bash
set -e

echo "[INFO] Installation de PostgreSQL..."

# Mise Ă  jour des paquets
sudo apt-get update

# Installation de PostgreSQL
sudo apt-get install -y postgresql postgresql-contrib

# Vérification
psql --version && echo "[OK] PostgreSQL installé"
Enter fullscreen mode Exit fullscreen mode

scripts/setup_barman.sh

#!/bin/bash
set -e

echo "[INFO] Installation de Barman..."

# Mise Ă  jour des paquets
sudo apt-get update

# Installation de Barman (et dépendances)
sudo apt-get install -y barman

# Vérification
barman --version && echo "[OK] Barman installé"
Enter fullscreen mode Exit fullscreen mode

đŸ§© Conclusion

Nous venons de dĂ©couvrir Vagrant et en application poser les bases d’un environnement de test en mettant en place deux machines virtuelles : l'une avec PostgreSQL installĂ©, et l'autre avec Barman, notre outil de sauvegarde dans la sĂ©rie sur les sauvegardes incrĂ©mentales.

GrĂące Ă  Vagrant et aux scripts de provisionnement, nous avons automatisĂ© le dĂ©ploiement de cet environnement, ce qui nous permettra de reproduire facilement nos tests, de gagner du temps, et d’éviter les erreurs manuelles.

Ce que nous avons mis en place ici ne se limite pas au contexte de postgres et de barman : ce type de lab peut servir de base gĂ©nĂ©rique pour toutes sortes de pratiques DevOps, d’expĂ©rimentations systĂšmes ou de tests techniques en environnement isolĂ©.

🧰 Un socle simple, reproductible et extensible idĂ©al pour apprendre, tester, casser
 et recommencer !

À trùs bientît pour le prochain article de ce blog

Top comments (0)