Loading search data...

Apprendre et Maitriser Vagrant

Publié le : 19 janvier 2021 | Mis à jour le : 12 mai 2023

logo

Vagrant est un des outils en ligne de commande 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.

Installation de Vagrant

Pour l’installer sur Linux :

# 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

Pour installer libvirt sur Ubuntu :

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.

cockpit machines vagrant

Premiers tours de roue

Pour vérifier que cela 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 l’image 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 ou boolean ou encore une list ou une map.
  • Les chaînes de caractères sont encadrées par des “doubles-quotes”.
  • Les valeurs booléennes peuvent être true ou false.

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 machine
  • config.ssh : pour définir commande vagrant accédera à votre machine
  • config.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é 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 Vagrantfile

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

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

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

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és 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é, 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

vagrant push

La commande vagrant push permet de 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

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.

Mots clés :

devops tutorials infra as code vagrant

Si vous avez apprécié cet article de blog, vous pouvez m'encourager à produire plus de contenu en m'offrant un café sur  Ko-Fi. Vous pouvez aussi passer votre prochaine commande sur amazon, sans que cela ne vous coûte plus cher, via  ce lien . Vous pouvez aussi partager le lien sur twitter ou Linkedin via les boutons ci-dessous. Je vous remercie pour votre soutien.

Autres Articles


Commentaires: