Aller au contenu

Exercice 3 — Préparer le template sur le stockage partagé

Durée : ~25 min · En équipe · Théorie associée : Templates et cloud-init, Le cluster Proxmox et le stockage partagé

Objectif

Le template Debian 13 9000 existe une seule fois pour tout le cluster, avec son disque, son lecteur cloud-init et son snippet sur nfs-aria. Chaque VM qui en sortira pourra démarrer sur n'importe quel nœud, avec Docker déjà installé.

Prérequis

  • L'exercice 2 terminé : nfs-aria est actif sur les trois nœuds.

Vous avez déjà fabriqué ce template à l'exercice 2 de la semaine 4. Les commandes sont les mêmes, à une différence près : chaque fichier va sur nfs-aria au lieu de local ou local-lvm.

Étape 1 — Télécharger l'image cloud

Ouvrez le Shell du serveur 1.

Bash
cd /var/lib/vz/template/iso
Bash
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2

Le téléchargement se termine, le fichier fait environ 350 Mo

Le fichier reste sur le stockage local du serveur 1. Il ne sert qu'à l'importation de l'étape 3, et aucune VM n'en dépendra ensuite.

Étape 2 — Créer la VM vide

Bash
qm create 9000 --name tmpl-debian13 --memory 2048 --cores 2 --cpu x86-64-v2-AES --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-single --ostype l26

La VM apparaît sous le serveur 1, sans disque. L'option --cpu x86-64-v2-AES est indispensable : sans elle, qm create donne à la VM un processeur kvm64 trop ancien, et MySQL refuse de démarrer à l'exercice 4. La carte réseau n'a pas d'étiquette VLAN : ses trames sortiront sans étiquette et arriveront donc dans le VLAN 700 de gestion, celui des nœuds.

Étape 3 — Importer l'image sur le stockage partagé

Bash
qm set 9000 --scsi0 nfs-aria:0,import-from=/var/lib/vz/template/iso/debian-13-genericcloud-amd64.qcow2,format=qcow2

Proxmox crée vm-9000-disk-0.qcow2 sur nfs-aria et y recopie l'image

Sur un stockage NFS, un disque est un simple fichier. Le format qcow2 sait faire des snapshots et des clones liés, ce qu'un fichier .raw ne sait pas faire.

Étape 4 — Agrandir le disque

Bash
qm disk resize 9000 scsi0 20G

Comme à la semaine 4, le système de fichiers s'agrandira de lui-même au premier démarrage de chaque copie.

Étape 5 — Ajouter le lecteur Cloud-Init sur le stockage partagé

Bash
qm set 9000 --ide2 nfs-aria:cloudinit

Ce lecteur doit lui aussi être sur nfs-aria. S'il restait sur local-lvm, chaque VM clonée garderait une pièce enfermée dans un seul nœud, et ne pourrait plus démarrer ailleurs.

Étape 6 — Régler le démarrage et la console

Bash
qm set 9000 --boot order=scsi0
qm set 9000 --serial0 socket
qm set 9000 --agent enabled=1

Les trois réglages de la semaine 4 : démarrer sur le disque, offrir un port série, activer l'agent invité.

Étape 7 — Écrire le snippet sur le stockage partagé

Bash
nano /mnt/pve/nfs-aria/snippets/aria-docker.yaml

Écrivez exactement ceci :

YAML
#cloud-config
packages:
  - qemu-guest-agent
  - docker.io
  - curl
runcmd:
  - systemctl enable --now qemu-guest-agent
  - systemctl enable --now docker
  - usermod -aG docker etudiant

C'est le snippet des serveurs de Cyclo-Nord, au même contenu près. La seule chose qui change, c'est l'endroit où il est rangé.

Étape 8 — Rattacher le snippet au template

Bash
qm set 9000 --cicustom "vendor=nfs-aria:snippets/aria-docker.yaml"

Proxmox lit ce fichier à chaque démarrage de la VM, pour fabriquer le lecteur cloud-init. Sur local, il n'existerait que sur le serveur 1, et une VM redémarrée par la HA sur le serveur 3 refuserait de démarrer. Sur nfs-aria, il est lisible de partout.

Étape 9 — Remplir les champs cloud-init

Sélectionnez la VM 9000 et ouvrez son panneau Cloud-Init. Remplissez trois lignes avec le bouton Edit.

Ligne Valeur
User etudiant
Password Motdepasse123!
DNS servers 9.9.9.9

Le panneau Cloud-Init affiche l'utilisateur etudiant, le mot de passe masqué et le DNS 9.9.9.9

Étape 10 — Figer le template

Faites un clic droit sur la VM 9000 et choisissez Convert to template. Confirmez.

Le journal de la tâche peut afficher une erreur chattr +i ... Operation not supported : NFS ne permet pas de verrouiller le fichier du disque. La tâche se termine tout de même sur TASK OK, et le template est utilisable.

L'icône de la VM change dans l'arborescence.

Étape 11 — Voir les fichiers du template depuis un autre nœud

Ouvrez le Shell du serveur 3.

Bash
ls /mnt/pve/nfs-aria/images/9000

Deux fichiers : base-9000-disk-0.qcow2 et vm-9000-cloudinit.qcow2

Le disque s'appelle maintenant base-9000-disk-0.qcow2 : Proxmox le renomme au moment de la conversion, pour marquer qu'il ne changera plus. Le serveur 3 voit ces fichiers, alors que le template a été fabriqué sur le serveur 1. Il pourra donc cloner le template sans rien copier par le réseau.

Vérification finale

  • Le template 9000 apparaît sous le serveur 1
  • Son panneau Hardware montre scsi0 et ide2 sur nfs-aria
  • /mnt/pve/nfs-aria/snippets/aria-docker.yaml existe
  • Le serveur 3 voit base-9000-disk-0.qcow2 dans /mnt/pve/nfs-aria/images/9000

Question 1

Un coéquipier a rangé le snippet dans /var/lib/vz/snippets/ du serveur 1, comme à la semaine 4. Les VM clonées fonctionnent parfaitement. Quand le problème apparaîtra-t-il ?

  • a) Jamais : le snippet n'est lu qu'au premier démarrage, et Docker est déjà installé.
  • b) Le jour où une de ces VM démarrera sur le serveur 2 ou 3 : Proxmox ne trouvera pas le fichier et refusera de la démarrer.
  • c) Immédiatement, au prochain clonage.
Voir la réponse **b) Le jour où une de ces VM démarrera sur un autre nœud.** Proxmox reconstruit le lecteur cloud-init à chaque démarrage de la VM, sur le nœud où elle démarre, et il a besoin du snippet pour le faire. Le serveur 2 n'a pas `/var/lib/vz/snippets/aria-docker.yaml`. La VM refuse donc de démarrer, avec une erreur `volume 'local:snippets/aria-docker.yaml' does not exist`. Le choix a) est vrai pour ce que fait cloud-init dans la VM : il n'installe Docker qu'une fois. Mais Proxmox, lui, exige que le fichier existe à chaque démarrage. Le piège se déclenche au pire moment : quand la HA tente de sauver une VM après une panne.

En cas de problème

Symptôme Cause probable Correction
storage 'nfs-aria' does not support content-type 'snippets' Snippets n'a pas été coché à l'exercice 2 Datacenter > Storage > nfs-aria > Edit, cocher Snippets
nano affiche No such file or directory à l'enregistrement Le dossier snippets n'existe pas encore mkdir -p /mnt/pve/nfs-aria/snippets, puis reprendre l'étape 7
qm set répond unable to parse value of 'cicustom' Guillemets oubliés ou mal placés Recopier la commande de l'étape 8 telle quelle
MySQL ne démarre pas à l'exercice 4 : CPU does not support x86-64-v2 Le template a été créé sans --cpu x86-64-v2-AES qm set 9000 --cpu x86-64-v2-AES sur le template, puis la même commande sur chaque VM déjà clonée, et redémarrer ces VM
La VM 9000 existe déjà Le template a été créé deux fois qm destroy 9000, puis reprendre à l'étape 2