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-ariaest 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.
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¶
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é¶
qm set 9000 --scsi0 nfs-aria:0,import-from=/var/lib/vz/template/iso/debian-13-genericcloud-amd64.qcow2,format=qcow2
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¶
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é¶
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¶
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é¶
Écrivez exactement ceci :
#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¶
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 |
É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.
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
9000apparaît sous le serveur 1 - Son panneau Hardware montre
scsi0etide2surnfs-aria -
/mnt/pve/nfs-aria/snippets/aria-docker.yamlexiste - Le serveur 3 voit
base-9000-disk-0.qcow2dans/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 |



