Un environnement de Dev Linux sous Windows 10 avec vagrant, kvm et ansible

Soutenez moi :) En achetant à partir de ce lien je toucherai une toute petite comm.


Il y a quelques jours je vous proposais un tutorial pour installer un VM de dev sur votre poste Windows en utilisant multipass de Canonical. Mais voila du coup on se retrouve avec une distribution Ubuntu.

J'ai donc revu ma copie et je vous livre un nouveau tutoriel avec cette vagrant en provisioner sous windows avec une distribution Oracle Linux 8.

Comme pour la version avec Multipass cet environnement doit être simple à mettre en œuvre et surtout rapide. On y trouve tout ce qu'il faut pour developper des roles ansible, de tester ses container, d'installer des VM, ….

  • ansible
  • kitchen avec serverpec
  • docker
  • kvm
  • vagrant

Pour la rapidité ca demeure acceptable car pour faire fonctionner le plugin vagrant-libvirt j'ai du recompiler des librairies.

Installation des produits nécessaires : hyperv, cifs et vagrant

Prérequis :

  • Windows 10 Entreprise, Professionnel ou Éducation
  • Processeur 64 bits avec traduction d’adresse de second niveau (SLAT).
  • Processeur prenant en charge les extensions de mode du moniteur de machine virtuelle (VT-c sur les processeurs Intel).
  • Au minimum 4 Go de mémoire.

Actvition d'hyper-v et SMB/CIFS

Dans un premier temps il faut activer hyper-v et le partage SMB/CIFS sur votre poste Windows. Dans une fenêtre Powershell ouverte en tant qu'administrateur, taper les commandes suivantes

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

Installation de Vagrant

Vous pouvez télécharger la dernière version de Vagrant sur la page vagrantup

Création de la première VM

Vagrant oblige de lancer ses commandes dans une fenêtre powershell avec les droits admin.

vagrant box add generic/oracle8
vagrant init generic/oracle8

Pour créer ma VM de dev je vais utiliser cette fois un shell script car le support de cloud-init dans vagrant est encore en test.

Editer votre fichier Vagrantfile et ajouter ceci :


$script = <<-SCRIPT
echo I am provisioning...
dnf update -y

dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf config-manager --enable ol8_codeready_builder
curl -sSL https://get.rvm.io | bash
source /etc/profile.d/rvm.sh
rvm reload
rvm requirements
rvm install ruby-2.7.2
rvm use 2.7.2 --default

systemctl disable firewalld.service
systemctl stop firewalld.service

dnf module install virt -y
dnf install virt-install virt-viewer libvirt qemu-kvm ruby-devel rsync gcc zlib-devel libvirt-devel curl git htop python3-pip python3-virtualenv cmake -y
systemctl start libvirtd.service
systemctl enable libvirtd.service
usermod -aG docker vagrant
usermod -aG libvirt vagrant
usermod -aG rvm vagrant
sudo pip3 install ansible==2.9.15 ansible-lint
dnf install -y https://releases.hashicorp.com/vagrant/2.2.14/vagrant_2.2.14_x86_64.rpm

dnf install docker-ce --nobest -y
systemctl start docker
systemctl enable docker
gem install test-kitchen kitchen-vagrant kitchen-ansible kitchen-docker kitchen-verifier-serverspec serverspec

cd /tmp/
dnf download --source krb5-libs
rpm2cpio krb5*.rpm| cpio -imdV
tar xf krb5*.gz
cd krb5*/src
LDFLAGS='-L/opt/vagrant/embedded/' ./configure
make
cp lib/libk5crypto.so.3 /opt/vagrant/embedded/lib64/

cd /tmp/;
dnf download --source libssh
rpm2cpio libssh*.rpm | cpio -imdV
tar xf libssh*.xz
mkdir build
cd build
cmake ../libssh-*/ -DOPENSSL_ROOT_DIR=/opt/vagrant/embedded/
make
sudo cp lib/libssh* /opt/vagrant/embedded/lib64/
SCRIPT

$script2 = <<-SCRIPT
CONFIGURE_ARGS="with-libvirt-include=/usr/include/libvirt with-libvirt-lib=/opt/vagrant/embedded/lib64/" vagrant plugin install vagrant-libvirt
echo '. /usr/local/rvm/scripts/rvm' >>/home/vagrant/.bashrc

SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "generic/oracle8"
  config.vm.provider "hyperv" do |hv|
    hv.enable_virtualization_extensions = true
    hv.linked_clone = false
    hv.cpus = "4"
    hv.memory = "2048"
    hv.vmname = "csl"
  end
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.define "csl" do |csl|
    csl.vm.network "public_network"
    csl.vm.hostname = "csl"
  end
  config.vm.provision "shell", inline: $script
  config.vm.provision "shell", inline: $script2, privileged: false
end

Eh oui rien que ca:

  • Pas besoin d'activer la fonctionnalité de virtualisation imbriquée car elle est faite avec l'option enable_virtualization_extensions = true<>
  • Laisser bien le paramètre hv.linked_clone à false sinon vous ne pourrez pas packager votre box pour la distribuer.
  • On ne peut pas fixer l'adresse IP mais vous verrez on peut récupérer la config ssh de vagrant facilement.
  • On a deux script
    • un premier qui s'éxécute avec le compte root
    • un second avec le user vagrant pour installer en local le plugin vagrant-libvirt
    • fixer la version de ruby

Ce fichier permet de :

Maintenant lançons le provisionnement de la VM :

vagrant up

Patience ….. Cela dure quelques minutes le temps de tout installer et configurer.

vagrant ssh

Vous devriez obtenir une invit de commande vagrant@csl. Vérifions que kvm fonctionne :

sudo systemctl status libvirtd.service
[vagrant@csl ~]$ sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-01-14 12:03:20 UTC; 6s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 97188 (libvirtd)
    Tasks: 19 (limit: 32768)
   Memory: 51.5M
   CGroup: /system.slice/libvirtd.service
           ├─76006 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
           ├─76007 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
           └─97188 /usr/sbin/libvirtd --timeout 120

Vous devriez obtenir active (running) :

Création de VM avec vagrant

Toujours dans votre VM dev tapez les commandes suivantes, au moment du choix d'hyperviseur prenez bien libvirt :

vagrant box add centos/7
vagrant init centos/7
vagrant up

Au bout de quelques minutes vous devriez pouvoir vous connecter à votre VM dans la VM:

vagrant ssh
yum update

Et voila.

Accès à votre VM depuis visual code (installé sur Windows)

On va tout simplement utiliser l'extension Remote SSH. Installer la. Pour configurer l'accès il faut juste récupérer la config ssh de vagrant:

vagrant ssh-config

Je vous laisse lire ce tuto pour utiliser cette extension.

Autres billet sur Ansible


Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) au travers du lien produit ci-contre, je touche une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!