Utiliser Multipass pour créer des VM sur Ubuntu et Debian

Utiliser Multipass pour créer des VM sur Ubuntu et Debian

Vous avez besoin d'effectuer des tests sur une VM plutôt qu'un conteneur Docker ?
Vous avez besoin de VMs pour effectuer du scaling horizontal à partir d'une VM sur-dimensionnée ?
Multipass est fait pour vous !

Présentation

Multipass est un outil développé par Canonical, qui est aussi accessoirement en charge de la distribution Ubuntu.
Comme dit plus haut, cela vous permet de créer de véritables VM très simplement et est compatible Linux, Mac OS et Windows. Nous allons nous attarder sur la partie Linux pour des raisons évidentes 😅

Multipass s'appuie sur l'hyperviseur KVM et s'installe avec le gestionnaire de paquets Snap.

Installation

Avant de passer à l'installation, assurez-vous du bon support de KVM avec la commande suivante

kvm-ok

Installer le paquet Snap à l'aide de cette commande

snap install multipass

Assurez-vous de sa bonne installation avec la commande

snap info multipass

Hypervisons

Maintenant que vous avez installé Multipass, les commandes sont très simples à retenir et rappellent celles de Docker par exemple.  La particularité est que Multipass requiert d'exécuter les commandes en tant que root !

Démarrons notre première VM avec la commande suivante

multipass launch

Listons la liste des VM présentes avec la commande

multipass list

Connectons-nous à cette VM avec la commande suivante

multipass shell <nom de la VM>

Maintenant que nous avons lancé notre première VM et que nous nous y sommes connectés, vous me direz que nous n'avons pas eu la possibilité de la personnaliser.
C'est ce que nous allons voir !

Personnalisons

Il est possible de personnaliser sa VM de plein de manières différentes, avec des moyens plus ou moins poussés.

Pour lancer une VM en la nommant, en lui allouant de l'espace disque, de la mémoire RAM et des cpus il faudra utiliser les arguments suivants de la commande multipass launch :

multipass launch --name VM1 --disk 20G -m 2G -c 1
Cette commande va créer une VM nommée "VM1" avec 20Go d'espace disque, 2Go de RAM et 1 CPU.

Cloud-Init

Pour personnaliser sa VM d'une manière bien plus poussée, nous allons utiliser Cloud-init qui est un outil qui permet de personnaliser, pré-installer une VM une instance sur le Cloud. Cela s'accorde très bien avec Multipass car c'est aussi Canonical qui a développé cet outil.
Sa configuration se présente sous la forme d'un fichier YAML et possède différentes syntaxes. Créons un fichier nommé cloud-config.yml  :

#cloud-config

users:
  - name: test
    ssh-authorized-keys:
      - < PUT YOUR SSH KEY>
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash

package_update: true
packages:
  - python3
  - git

runcmd:
  - echo "$HOSTNAME" >> inventory/hosts

final_message: "L'instance est maintenant up depuis $UPTIME secondes"

Dans cet exemple :

  • Dans la liste users, je crée un user test dans lequel je viens copier ma clé SSH (ajouter la vôtre).
  • Je mets à jour mes paquets et j'installe python et git
  • J'écris le hostname de la VM dans un fichier (peut servir pour le cas d'Ansible par exemple pour ajouter cette VM à notre inventaire).
  • Et j'affiche au lancement de la VM, un dernier message avec l'Uptime du serveur.

Pour passer ce fichier cloud-init en paramètre à Multipass, il suffit de préciser l'argument suivant :

multipass launch --name cloud-init --cloud-init cloud-config.yml

Vous aurez donc une VM avec vos paquets pré-installés et toute la configuration que vous lui passerez !
Un fichier de log est généré sur la VM par cloud-init à cet emplacement /var/log/cloud-init-output.log

Il existe bien d'autres options, et la pré-configuration de la VM peut aller bien plus loin, la documentation officielle explique bien cela.

Les images

A la manière de Docker, Multipass possède des "images" qui sont des Templates de VM. Pour les lister, il suffit d'exécuter cette commande

multipass find

Il est donc possible de lancer des VM avec différentes version d'Ubuntu, avec Docker d'installé et même Minikube ! Il faudra juste préciser le nom de l'image souhaitée à la fin de la commande  multipass launch précédemment détaillée.

Les appliances

Il y aussi des VM avec logiciels déjà installés comme Nextcloud, Plex et bien d'autres. Mais pour installer Nextcloud, rien de mieux que de passer par cette installation 😉

Quelques commÄndes suffisent

Ce n'est pas une faute d'orthographe dans le titre, juste une petite référence 😉

Il est possible d'effectuer de nombreuses autres actions avec Multipass (créer des networks, monter des volumes, transférer des fichiers etc...) pour avoir la liste complète il suffit d'exécuter la commande multipass --help
Voici une liste non exhaustive des commandes qui pourront vous servir.

Transférer un fichier depuis sa machine vers une VM Multipass :

multipass transfer NOMDUFICHIER NOMDELAVM:/repertoire_de_destination

Exécuter une commande depuis sa machine vers la VM Multipass :

multipass exec NOMDELAVM -- COMMANDE

Monter un répertoire local sur la VM Multipass (équivalent d'un volume Docker)

multipass mount /REPERTOIRELOCAL NOMDELAVM:/repertoire_de_destination

Conclusion

Multipass est donc un très bon outil de part sa prise en main qui est très simple. Pouvoir exploiter sa machine en lançant des VM de cette manière est très appréciable. L'utilisation des conteneurs avec Docker par exemple a parfois ses limites (le fait de partager son OS avec son hôte) et je pense notamment dans la pratique du DIND (Docker In Docker) qui nécessite parfois d'avoir une vraie VM et non pas un conteneur.

Un de ces inconvénients serait son installation avec Snap qui n'est clairement pas le meilleur gestionnaire de paquets, et il arrive parfois d'avoir des soucis avec la socket Unix (de nombreuses issues Github là-dessus).