Aller au contenu principal

Vagrant 2.3.0

· 8 minutes de lecture
Stéphane ROBERT
Consultant DevOps

logo

Annoncée il y a un peu plus d'un an cette version 2.3.0 est le premier pas vers la sortie de la version 3.0 qui est en fait une réécriture complète de l'outil de création d'environnements de développement virtuels d'HashiCorp.

Cette version 2.3.0 est donc le premier pas et ne bouleverse pas encore trop les habitudes. En effet, cette version fournit encore la version écrite en ruby mais elle est accompagnée de la première version alpha de vagrant-go, comme son nom l'indique, elle est écrite en Go.

Sur le site de la documentation de Vagrant-Go on peut lire ceci : "Cette version de Vagrant-Go reste compatible avec les plugins Vagrant écrit en Ruby ainsi que les fichiers Vagrantfile". Cool. "Cependant, il y a quelques changements importants dans le fonctionnement de Vagrant-go qui le rendent NON interchangeable avec Vagrant (Ruby)". Ah mince.

Je vous propose de tester tout de suite cette version de Vagrant-Go, mais avant vérifions que le plugin vagrant-libvirt s'installe correctement.

Installation du plugin vagrant-libvirt avec Vagrant-Go

Je vais tester l'installation du plugin vagrant-libvirt avec Vagrant-Go sur ma configuration devops 2022. Pour rappel, cette configuration est montée sur une VM hyper-V elle-même créé avec la version Windows de Vagrant. Elle est basée sur une Ubuntu 22.04.

Info Importante : Vagrant-Go ne fonctionne pas pour le moment sous Windows !

export VAGRANT_DEFAULT_PROVIDER=libvirt
vagrant-go plugin install vagrant-libvirt

This is an experimental version of Vagrant. Please note that some things may
not work as you expect and this version of Vagrant is not compatible with the
stable version of Vagrant. For more information about vagrant-go read the docs
at https://www.vagrantup.com/docs/experimental/vagrant_go. To disable this
warning set the environment variable 'VAGRANT_SUPPRESS_GO_EXPERIMENTAL_WARNING'.


Installing the 'vagrant-libvirt' plugin. This can take a few minutes...
Installed the plugin 'vagrant-libvirt (0.10.0)'!

Si on souhaite désactiver le message d'erreur il suffit d'exporter la variable VAGRANT_SUPPRESS_GO_EXPERIMENTAL_WARNING avec la valeur true :

export VAGRANT_SUPPRESS_GO_EXPERIMENTAL_WARNING=true

vagrant help
Usage: vagrant [options] <command> [<args>]

-h, --help Print this help.

Common commands:
autocomplete manages autocomplete installation on host
box manages boxes: installation, removal, etc.
cloud manages everything related to Vagrant Cloud
destroy stops and deletes all traces of the vagrant machine
global-status outputs status Vagrant environments for this user
halt stops the vagrant machine
help shows the help for a subcommand
init initializes a new Vagrant environment by creating a Vagrantfile
login
package packages a running vagrant environment into a box
plugin manages plugins: install, uninstall, update, etc.
port displays information about guest port mappings
powershell connects to machine via powershell remoting
provision provisions the vagrant machine
push deploys code in this environment to a configured destination
rdp connects to machine via RDP
reload restarts vagrant machine, loads new Vagrantfile configuration
resume resume a suspended vagrant machine
serve start Vagrant server
snapshot manages snapshots: saving, restoring, etc.
ssh connects to machine via SSH
ssh-config outputs OpenSSH valid configuration to connect to the machine
status outputs status of the vagrant machine
suspend suspends the machine
up starts and provisions the vagrant environment
upload upload to machine via communicator
validate validates the Vagrantfile
version prints current and latest Vagrant version
winrm executes commands on a machine via WinRM
winrm-config outputs WinRM configuration to connect to the machine

For help on any individual command run `vagrant COMMAND -h`

Additional subcommands are available, but are either more advanced
or not commonly used. To see all subcommands, run the command
`vagrant list-commands`.
--[no-]color Enable or disable color output
--machine-readable Enable machine readable output
-v, --version Display Vagrant version
--debug Enable debug output
--timestamp Enable timestamps on log output
--debug-timestamp Enable debug output with timestamps
--no-tty Enable non-interactive output

Revenons à notre plugin vagrant-libvirt. Je viens de me rendre compte qu'il s'agit d'une nouvelle version de celui-ci. Sortie un jour après cette implémentation de Vagrant en Go. Un petit tour dans le changelog ne montre pas que c'est en relation avec la sortie de cette version, mais apporte des corrections au plugin.

Maintenant que le plugin est installé vérifions que cela fonctionne.

Test de Vagrant 2.3.0 avec le plugin libvirt

Pour faire mes tests, j'ai repris le Vagrantfile de la IAC du HomeLab sur lequel j'ai lancé l'ancienne version (en ruby) pour vérifier qu'elle fonctionne encore puis la version en Go.

git clone git@gitlab.com:b4288/infra-as-code-homelab.git
Clonage dans 'infra-as-code-homelab'...

cd infra-as-code-homelab

cat Vagrantfile

Dont le contenu est :

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

Vagrant.configure(2) do |config|

number_devbox = 2 # Number of master nodes kubernetes
cpu = 1
mem = 1024
config.vm.box = "generic/ubuntu2110" # Image for all installations

nodes = []
(0..number_devbox-1).each do |i|
nodes[i] = {
"name" => "devbox#{i+1}"
}
end

# Provision VM
nodes.each do |node|
config.vm.define node["name"] do |machine|
machine.vm.hostname = node["name"]
machine.vm.provider "libvirt" do |lv|
lv.cpus = cpu
lv.memory = mem
end
machine.vm.synced_folder '.', '/vagrant', disabled: true
machine.vm.provision "ansible" do |ansible|
ansible.playbook = "playbooks/provision.yml"
ansible.groups = {
"k3s" => ["devbox1"],
"libvirt" => ["devbox2"],
"all:vars" => {
}
}
end
end
end
end

Allez on lance le bon vieux vagrant up :

Bringing machine 'devbox1' up with 'libvirt' provider...
Bringing machine 'devbox2' up with 'libvirt' provider...
==> devbox1: Box 'generic/ubuntu2110' could not be found. Attempting to find and install...
devbox1: Box Provider: libvirt
devbox1: Box Version: >= 0
==> devbox1: Loading metadata for box 'generic/ubuntu2110'
devbox1: URL: https://vagrantcloud.com/generic/ubuntu2110
==> devbox1: Adding box 'generic/ubuntu2110' (v4.1.6) for provider: libvirt
devbox1: Downloading: https://vagrantcloud.com/generic/boxes/ubuntu2110/versions/4.1.6/providers/libvirt.box
Progress: 24% (Rate: 6757k/s, Estimated time remaining: 0:04:36)

Au bout de quelques minutes le provisionnement se lance avec le lancement des playbooks Ansible. Pas de problème donc les deux VM sont disponibles.

vagrant ssh devbox1
Last login: Wed Aug 17 07:10:28 2022 from 192.168.121.1
vagrant@devbox1:~$

Allez on détruit et on teste avec la version en GO :

vagrant destroy -f
==> devbox2: Removing domain...
==> devbox2: Deleting the machine folder
==> devbox1: Removing domain...
==> devbox1: Deleting the machine folder

vagrant-go up
! ==> devbox2: An error occurred. The error will be shown after all tasks complete.
==> devbox1: Box 'generic/ubuntu2110' could not be found. Attempting to find and install...
devbox1: Box Provider: libvirt
devbox1: Box Version: >= 0
==> devbox1: Loading metadata for box 'generic/ubuntu2110'
devbox1: URL: https://vagrantcloud.com/generic/ubuntu2110
==> devbox1: Adding box 'generic/ubuntu2110' (v4.1.6) for provider: libvirt
Progress: 8% (Rate: 6739k/s, Estimated time remaining: 0:05:47)

Ah un problème lors de la création de la VM devbox2. D'ailleurs étrange il re-télécharge la box. Comme indiqué, il ne faut pas mélanger les deux versions. Je détruis le répertoire .vagrant et je relance :

vagrant-go up

Bringing machine 'devbox1' up with 'libvirt' provider...
Bringing machine 'devbox2' up with 'libvirt' provider...
! ==> devbox1: An error occurred. The error will be shown after all tasks complete.
==> devbox2: Box 'generic/ubuntu2110' could not be found. Attempting to find and install...
devbox2: Box Provider: libvirt
devbox2: Box Version: >= 0
==> devbox2: Loading metadata for box 'generic/ubuntu2110'
devbox2: URL: https://vagrantcloud.com/generic/ubuntu2110
==> devbox2: Adding box 'generic/ubuntu2110' (v4.1.6) for provider: libvirt
devbox2: Downloading:
https://vagrantcloud.com/generic/boxes/ubuntu2110/versions/4.1.6/providers/libvirt.box

Idem, alors il s'agit bien d'un problème ! Un peu capricieux avec les Vagrantfile contenant plusieurs machines ? Ou, mais oui j'ai installé une nouvelle version du plugin vagrant-libvirt.

J'essaie de désinstaller le plugin pour remettre l'ancienne version et Bim :

  Uninstalling the 'vagrant-libvirt' plugin...
! Running of task plugin uninstall failed unexpectedly

! Error: rpc error: code = Unknown desc = No such file or directory @ rb_check_realpath_internal -
/home/vagrant/.local/share/vagrant/default/project/infra-as-code-homelab/plugins/gems/2.7.6
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/bundler.rb:446:in `realpath'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/bundler.rb:446:in `realpath'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/bundler.rb:446:in `block in clean'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/bundler.rb:445:in `delete_if'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/bundler.rb:445:in `clean'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/plugin/manager.rb:229:in `uninstall_plugin'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/plugins/commands/plugin/action/uninstall_plugin.rb:18:in `call'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/action/warden.rb:48:in `call'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/plugins/commands/plugin/action/plugin_exists_check.rb:20:in `call'
/opt/vagrant/embedded/gems/2.3.0/gems/vagrant-2.3.0/lib/vagrant/action/warden.rb:48:in `call'
/opt/vagrant/embedded...%

Aie !!! Bon les grands moyens : on efface le répertoire .vagrant.d dans la home directory.

rm -rf ~/.vagrant.d
rm -rf .vagrant

Pas mieux. En testant avec des Vagrantfile ne contenant pas plusieurs VM je n'ai pas rencontré de soucis.

Conclusion

Je note une certaine latence sur la version en GO qui met plus de temps à démarrer les box. Vous l'avez vu au-dessus, ce n'est pas du production-ready. Cette version n'est là pour remonter les problèmes à HashiCorp pour les corriger avant la prochaine version qui sera la 2.4.0. Il y aura certainement des versions 2.3.x corrigeant certains de ces problèmes.

**Ne mélangez pas les deux versions non plus !!! **

La suite

On est encore loin de la sortie de la version 3.0 de Vagrant . Cette version 2.3.0 est le premier pas et sera suivi d'une version 2.4.0 ou cette fois, c'est la version Go qui sera fourni en standard.

Un point positif HashiCorp souhaite conserver la compatibilité avec l'existant. Mais pour rappel lors de l'annonce du lancement de l'écriture de Vagrant 3.0, il était annoncé que cette version introduirait de nouvelles méthodes de configuration, mais conserverait une compatibilité avec les fichiers Vagrantfiles. Ces nouvelles méthodes de configuration seront probablement à base de HCL, le langage maison.

La nouvelle architecture permettra d'exécuter Vagrant sur un hôte distant. Ainsi, il sera possible de partager un environnement Vagrant entre plusieurs membres d'une équipe. Il est indiqué plein de choses comme une configuration centralisée (vagrant-cloud ?), une API et plein d'autres choses.

Hâte de voir tout cela, mais j'ai du mal à saisir : Pourquoi apporter toutes ces fonctionnalités dans Vagrant alors que Terraform les apporte déjà ?