đ§ 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
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
$ vagrant box list
ubuntu/bionic64 (virtualbox, 20230607.0.0)
ubuntu/focal64 (virtualbox, 20240220.0.0)
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)
[...]
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:~$
Le diagramme ci-dessous illustre le parcours typique d'une machine virtuelle Vagrant, depuis son initialisation jusqu'Ă sa suppression complĂšte.
Ătapes principales
vagrant init
Initialise un projet Vagrant en créant unVagrantfile
.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 commandevagrant up
on dĂ©marre la machine virtuelle. Si elle nâexiste pas, elle est créée et provisionnĂ©e.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
-
Destroy
Avecvagrant 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.
- 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
- 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
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
Pour plus dâinformations sur la sychronisation consulter la documentation officielle ici.
- 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
đ§Ș 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
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é"
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é"
đ§© 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)