Aller au contenu

VM Linux sur Windows 10 : Vagrant & Ansible

logo

Maj: nouvelle version en utilisant vagrant en lieu et place multipass

Après des heures de tests avec la version 2 de WSL, j’ai failli renoncer à garder ma machine sous Windows 10 et à la passer sous Linux. Mais voilà, je me suis souvenu du projet Multipass de Canonical et là tout est redevenu simple.

Canonical ne se limite pas à délivrer Ubuntu, mais propose aussi tout un écosystème complet d’outils. Parmi eux on trouve Multipass qui facilite la gestion de VM Ubuntu depuis n’importe quelle plateforme Linux, MacOs et Windows.

Je vous propose dans ce tutoriel de mettre en place un environnement de Dévoleppoment avec Multipass hébergé dans l’hyperviseur hyperv de Microsoft. Cet VM de Dev doit pouvoir héberger des VM provisionner avec Vagrant et Ansible, mais aussi des containers Docker. Pour des raisons de performances j’ai choisi de prendre kvm comme hyperviseur dans ma VM.

Cet environnement doit être simple à mettre en œuvre et surtout rapide.

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

J’ai fait le choix d’hyperv car il est tout intégré dans Windows 10, mais vous pouvez également utiliser VirtualBox.

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.

Activation 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

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

Installation de Multipass

Vous pouvez télécharger la dernière version de Multipass sur la page du projet github de multipass

Création de la première VM

Normalement Multipass devrait avoir provisionner une VM répondant au nom de primary. On va de suite la détruire car trop petite. Dans une fenêtre de commande :

Terminal window
multipass delete primary
multipass purge
multipass set client.primary-name=dev

La dernière commande permet de définir le nom de la vm par défaut de multipass.

Pour créer ma VM de dev je vais utiliser cloud-init pour la configurer rapidement. Cela permettra aussi de la détruire et la reconstruire en peu de temps.

Il faut avant génerer une clé SSH qui servira à se connecter à la machine rapidement depuis visual studio code. Toujours dans votre fenêtre de commande tapez :

Terminal window
ssh-keygen -t ed25519

Acceptez les valeurs par défaut. Afficher le contenu du fichier .ssh/id_ed25519.pub il va vous servir à l’étape suivante. Maintenant, créez dans votre répertoire de travail un fichier yaml se nommant cloud-init.yaml et déposez y le contenu suivant et remplacer la 3ème ligne avec le contenu du fichier précédent (gardez bien le tiret):

# cloud config
ssh_authorized_keys:
- ssh-ed25519 AASSS ... ffdfdfdf steph@Steph-pc
package_update: true
apt_upgrade: true
packages:
- git
- vim
- wget
- curl
- jq
- vagrant
- python3-pip
- build-essential
- make
- software-properties-common
- htop
- libsqlite3-dev
- libc6-dev
- libgdbm-dev
- libssl-dev
- libreadline-dev
- libncursesw5-dev
- libmysqlclient-dev
- python3-pip
- python3-virtualenv
- libvirt-dev
- ruby-all-dev
- apparmor-utils
- qemu
- libvirt-daemon-system
- libvirt-clients
- libxslt-dev
- libxml2-dev
- libvirt-dev
- zlib1g-dev
- ruby-dev
- ruby-libvirt
- ebtables
- dnsmasq-base
- docker.io
runcmd:
- [apt, dist-upgrade, -yy]
- [apt, clean, -yy]
- [apt, autoremove, -yy]
- [pip3, install, ansible==2.9.15, ansible-lint]
- [vagrant, plugin, install, vagrant-kvm]
- [usermod, -a, -g, docker, ubuntu]
- [usermod, -a, -g, libvirt, ubuntu]

Ce fichier permet de :

  • mettre à jour la vm Linux;
  • d’installer plein de produits dont python, docker, vagrant et tout ce qu’il faut pour le développement d’applications en Python. A vous de le compléter à vos besoins.
  • de lancer des commandes de configuration pour installer ansible, le plugin libvirt pour vagrant et de donner les droits au user ubuntu de lancer des commandes docker.

Maintenant lançons le provisionnement de la VM en modifiant le chemin du fichier cloud-init.yaml :

Terminal window
multipass launch groovy -n dev -c 4 -m 10G -d 20G --cloud-init c:\Projets\cloud-init.yaml

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

Cette VM possède :

  • une distribution Ubuntu groovy (vous pouvez en prendre une autre: multipass list)
  • 4 CPU (-c)
  • 10G de mémoire (-m)
  • un disque de 20G (-d)

Activation de la virtualisation imbrigué sur notre VM

La virtualisation imbriquée est une fonctionnalité qui vous permet d’exécuter de créer des VMS dans une VM.

Pour cela il faut dans un premier temps arrêter la VM :

Terminal window
multipass stop dev

Dans une fenêtre PowerSell ouverte en tant qu’administrateur :

Terminal window
Set-VMProcessor -VMName dev -ExposeVirtualizationExtensions $True

Maintenant redémarrer votre VM et connectez vous y :

Terminal window
multipass start dev
multipass shell dev

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

Terminal window
root@dev:/home/ubuntu# kvm-ok

Vous devriez obtenir ceci :

Terminal window
INFO: /dev/kvm exists
KVM acceleration can be used

Création de VM avec vagrant

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

Terminal window
vagrant box add centos/7
vagrant init centos/7
vagrant up --provider libvirt

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

Terminal window
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 le nom de la vm dans le fichier C:\Windows\System32\drivers\etc\hosts.ics Moi j’avais dev.mshome.net Je vous conseille bien de mettre ce nom que plutôt ce nom qu’une adresse IP. Et oui si vous détruisez et reconstruisez votre VM elle n’aura pas la même adresse IP.

Je vous laisse lire ce tuto pour utiliser cette extension.

Et voila un vrai bonheur. Finis les galères avec WSL.