Maitriser Vagrant
Vagrant est un outil en ligne de commande,open-source développé par HashiCorp, qui permet de virtualiser rapidement des machines en utilisant la plupart des hyperviseurs comme HyperV, Libvirt, Parallels, VMWare et VirtualBox.
Concrètement, vous avez besoin rapidement de trois machines virtuelles tournant respectivement sous des OS différents, Vagrant vous permettra de les instancier en quelques minutes via un simple fichier Vagrantfile.
Vagrant est donc un outil qui permet aux développeurs de créer et de gérer des environnements de développement virtuels. On pourrait le qualifier de gestionnaire de machines virtuelles (VM).
Fonctionnement de Vagrant
À la base, Vagrant fonctionne en utilisant une approche de "configuration as
code." Les utilisateurs définissent leur environnement de développement dans
un fichier appelé un Vagrantfile
. Ce fichier contient des informations sur
la configuration des VM, dont la box, les ressources matérielles, les
logiciels à installer, et bien plus encore. Une fois que le Vagrantfile
est
créé, les développeurs peuvent lancer des VM en utilisant la commande vagrant
up
. A partir de là, Vagrant télécharge automatiquement la box (une image de
VM préconfigurée avec Packer) si nécessaire, la configure selon les
spécifications du Vagrantfile, et la démarre.
Installation de Vagrant
Vagrant fonctionne sur la plupart des systèmes d'exploitation dont Linux, MacOs et Windows.
Installation de vagrant sur Linux
Je ne vais documenter que l'installation de Vagrant sur une distribution de la famille Debian (Ubuntu, kali, Pop OS) :
# Pour un debian/ubuntu
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vagrant
# Pour un redhat/oraclelinux/centos
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install vagrant
Installation de libvirt (KVM)
Libvirt
est une bibliothèque open-source et un ensemble d'outils de gestion
pour la virtualisation. Il fournit une interface de programmation (API) pour
gérer des outils de virtualisation, telles que KVM, QEMU, Xen, VirtualBox, et
d'autres. Ma préférence va bien sûr à l'utilisation de KVM et QEMU car plus
rapide que les autres solutions pourtant plus populaires comme VirtualBox ou
vmWare Player.
Je préfère utiliser libvirt
avec QEMU et KVM, sur un serveur de la famille
Debian :
sudo apt update
sudo apt install qemu-kvm,libvirt-daemon-system,ksmtuned,libvirt-clients,libxslt-dev,libxml2-dev,libvirt-dev,zlib1g-dev,ruby-dev,ruby-libvirt,ebtables
sudo usermod -aG libvirt $USER
vagrant plugin install vagrant-libvirt
Si vous n'êtes pas un pro de la commande virsh
je vous conseille d'installer
cockpit.
sudo apt update
sudo apt install cockpit cockpit-machines
Ensuite pour gérer vos vm cliquez sur ce lien http://localhost:9090. Pour vous connecter, entrez votre user / mdp. La gestion des machines virtuelles se retrouve dans la section du même nom.
Installation de Vagrant sur Windows
Pour installer Vagrant sur une machine Windows ,commencez par téléchargez
l'installeur Windows depuis le site web
officiel.
Ensuite exécutez le et suivez les étapes d'installation. Une fois l'installation
terminée, ouvrez une fenêtre de terminal (par exemple, PowerShell ou CMD) pour
vérifier que tout fonctionne comme attendu et exécutez la commande vagrant
--version
.
Installation de vagrant sur MacOS
Sur MacOS il suffit de lancer l'installation via la commande brew
:
brew install hashicorp/tap/hashicorp-vagrant
Pour vérifier que tout fonctionne comme attendu et exécutez la commande vagrant
--version
dans une fenêtre Terminal.
Premiers tours de roue
À partir de cette section, la plupart des exemples seront faites une machine
Linux ou est installé libvirt
.
Pour vérifier que tout fonctionne, il suffit de lancer le provisionnement de votre première VM :
vagrant box add centos/8
vagrant init centos/8
vagrant up
vagrant ssh
La première commande télécharge la box, vous pouvez en trouver en grand nombre sur ce site, mais faites bien attention à utiliser des images sûres. Nous proposerons bientôt des images que nous construirons avec packer et contentant tout ce qu'il faut pour développer rapidement.
Pour éviter de définir à chaque fois votre hyperviseur, vous pouvez ajouter ceci
à votre .bashrc
:
export VAGRANT_DEFAULT_PROVIDER=libvirt
La seconde commande, vagrant init centos\8
créé le fichier de configuration
Vagrantfile
par défaut avec le minimum syndical en utilisant une des box
ajouté avec la commande box add
.
vagrant up
lance le provisionnement en lui-même. Attention beaucoup de données
sont ajoutée à un dossier caché .vagrant
dans votre répertoire de travail !
vagrant ssh
permet de se connecter à votre VM.
Pour détruire une VM, il suffit de lancer la commande vagrant destroy
.
Le fichier de déclaration Vagrantfile
Ce fichier de déclaration Vagrantfile utilise un langage proche de ruby.
Quelques règles de syntaxe pour les fichiers Vagrantfile
- Les commentaires sur une seule ligne commencent avec un #
- Les commentaires sur plusieurs lignes sont encadrés par / et /
- Les variables Vagrantfile sont assignées avec la syntaxe key = value (aucune importance
concernant les espaces). Les valeurs peuvent être des primitives
string
,number
ouboolean
ou encore unelist
ou unemap
. - Les chaînes de caractères sont encadrées par des "doubles-quotes".
- Les valeurs booléennes peuvent être
true
oufalse
.
Premières lignes de Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "generic/ubuntu2204"
end
Ici, on ne fait que configurer avec la version ("2") de vagrant un objet config
qui utilise une image ubuntu precise 32 bits.
À partir de là, on peut configurer plus finement notre vm avec différentes sections :
config.vm
: pour paramétrer la machineconfig.ssh
: pour définir commande vagrant accédera à votre machineconfig.vagrant
: pour modifier le comportement de vagrant en lui-même.
En fait, on se limitera pour le moment à la partie paramétrage de la VM.
Paramétrage de la VM config.vm
Vous pouvez retrouver toute la documentation de cette partie sur le site de vagrant. Je vais vous expliquer quelques-uns de ces paramètres :
Prenons cet exemple de fichier Vagrantfile
:
Vagrant.configure("2") do |config|
config.vm.box = "ol8"
config.vm.provider "libvirt" do |hv|
hv.cpus = "1"
hv.memory = "512"
end
config.vm.synced_folder '.', '/vagrant', disabled: true
config.vm.define "host1" do |host1|
host1.vm.network :private_network, ip: "192.168.3.10"
host1.vm.hostname = "host1"
end
end
network
On configure ici la partie réseau. Dans notre exemple, on fixe l'adresse ip.
box
Je vous dis plus qu'on retrouve ici la box que l'on va utiliser.
Ces box peuvent être installé avec la commande vagrant box add
. Pour les lister
vagrant box list
et vagrant box remove
pour les retirer.
provider
Attention ici bien indiquée l'hyperviseur utilisé. On ouvre une autre boucle pour configurer propre à chaque hyperviseur. La doc de celui de libvirt est ici.
config.vm.provider "libvirt" do |hv|
hv.cpus = "1"
hv.memory = "512"
provision
Cette partie permet de définir ce qu'il se passe une fois que la machine est démarrée. Vous avez le choix d'utiliser langage dont les plus courants sont le shell, ansible et bien d'autre encore.
Dans notre exemple, on utilise Ansible avec comme paramètre le playbook et le niveau de verbosité utilisé. Le playbook doit se trouver à la racine ou si vous lui indiquez le chemin relatif dans un sous dossier.
Quelques tips
Avec la gestion des VM
Ne pas détruire la VM en cas d'erreur
Dans la phase de développement d'un playbook Ansible, il peut être utile de
conserver la vm et ce même en cas d'erreur à des fins de debug. Pour
cela, il suffit d'utiliser l'option --no-destroy-on-error
:
vagrant up --no-destroy-on-error
Vous pouvez relancer le playbook avec l'option ci-après.
Relancer le provisioning sur une VM déja instanciée
Pour relancer le playbook sur une VM déjà démarrée, il suffit d'utiliser l'option
--provision
:
vagrant up --provision
Ajouter votre VM dans votre fichier /etc/hosts
Vagrant dispose de pas mal de plugins dont un des plus intéressants est
hostsupdater
. Pour l'installer, il suffit de taper la commande suivante :
vagrant plugin install vagrant-hostsupdater
vagrant push
La commande vagrant push
permet d'invoquer une commande shell ou un script
arbitraire dans le cadre d'un push.
Par exemple, vous pouvez lancer des playbooks en prenant l'inventaire généré dans la partie provisioning :
config.push.define "local-exec" do |push|
push.inline = <<-SCRIPT
ansible-playbook -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory master.yml
ansible-playbook -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory slave.yml
SCRIPT
end
Sur les vagrantfile
Boucle sur plusieurs machines
(1..3).each do |i|
config.vm.define "node-#{i}" do |node|
node.vm.provision "shell",
inline: "echo hello from node #{i}"
end
end
Lancer un playbook sur vos vms lors de leur création
Pour permettre d'utiliser plus facilement vos vms, vous pouvez lancer un playbook
pour autoriser la connexion par mots de passe, copier votre propre clé ssh
.
Tout est envisageable.
---
- hosts: all
gather_facts: no
become: true
# Vagrant provison runs this file, so you don't actually need an inventory
# it does that for you.
# Basically we setup a bunch of environment stuff so we can ssh into the host
# Using all the data from all.yml
tasks:
- name: Allow password authentication
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^PasswordAuthentication"
line: "PasswordAuthentication yes"
state: present
notify: restart sshd
- name: Set authorized key took from file
authorized_key:
user: vagrant
state: present
key: "{{ lookup('file', '/home/ubuntu/.ssh/id_rsa.pub') }}"
handlers:
- name: restart sshd
service:
name: sshd
state: restarted
Ensuite, il ne reste plus qu'à modifier votre config ssh dans le fichier ~/.ssh/config pour indiquer que pour se connecter aux vms on utilise le user vagrant.
Host 192.168.121.*
User vagrant
IdentityFile /home/ubuntu/.ssh/id_rsa.pub
Une autre solution serait d'utiliser la conf vagrant retourné par la commande ssh-config. Mais c'est moins générique. À vous de voir.
Host host1
HostName 192.168.121.246
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /home/ubuntu/Projets/ansible/playbooks/izyview/.vagrant/machines/host1/libvirt/private_key
IdentitiesOnly yes
LogLevel FATAL
Suspendre et restorer des VM
Vagrant propose une fonctionnalité permettant de suspendre les VM provisionnées, afin par exemple de changer de projet ou vous pouvez démarrer de nouvelles VMS.
Il s'agit des commandes vagrant suspend
et vagrant resume
Un exemple de configuration plus complexe
Si vous voulez des exemples un peu plus complexes, je vous propose de vous rendre sur mes projets CKASandbox.
Plus d'infos
Site officiel vagrantup.com Documentation vagrantup.com/docs
Sites
- Apprendre Vagrant
- Vagrant - Les commandes à retenir
- Vagrant et la virtualisation pour faciliter le développement