Aller au contenu

Exercice 2 — Fabriquer un template Debian cloud-init

Durée : ~45 min · Théorie associée : Templates et cloud-init

Objectif

Construire une VM modèle Debian 13 à partir d'une image cloud, la personnaliser avec cloud-init, la tester, puis la figer en template. Toutes les VM de l'exercice 3 en sortiront.

Prérequis

  • L'exercice 1 terminé : bridge-vids contient les VLAN internes.
  • Le nœud a accès à Internet depuis son Shell.
  • L'accès à l'interface web de votre nœud et à son Shell.

Étape 1 — Autoriser les snippets sur le stockage local

Un snippet est un fichier de configuration cloud-init déposé sur le nœud. Le stockage local ne les accepte pas par défaut.

Allez dans Datacenter > Storage, sélectionnez local et cliquez sur Edit. Dans la liste Content, ajoutez Snippets sans retirer les autres types.

La fenêtre d'édition du stockage local avec Snippets coché en plus des autres types de contenu

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

Ouvrez le Shell du nœud.

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

Le fichier fait environ 350 Mo

Moins de 400 Mo pour un système complet. Comparez avec l'ISO d'installation de Debian, et surtout avec celui de Windows Server de la semaine 2. Il n'y a ici ni programme d'installation, ni interface graphique, ni paquet superflu.

Étape 3 — 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 dans l'arborescence, sans disque. L'ID 9000 n'a rien de spécial pour Proxmox : c'est une convention pour ranger les templates loin des VM de travail.

Étape 4 — Importer l'image comme disque

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

Proxmox crée le volume vm-9000-disk-0 et recopie l'image dedans

Le 0 de local-lvm:0 veut dire « la taille du fichier importé ». Proxmox crée un volume à la bonne taille et y recopie l'image. Aucune installation, aucun assistant : le système est déjà dedans.

Étape 5 — Agrandir le disque

L'image fait environ 3 Go, ce qui est trop juste dès qu'on installe quelques paquets.

Bash
qm disk resize 9000 scsi0 20G

Le système de fichiers, lui, fait toujours 3 Go. Il s'agrandira de lui-même au premier démarrage de chaque copie : cloud-init s'en charge.

Étape 6 — Ajouter le lecteur Cloud-Init

Bash
qm set 9000 --ide2 local-lvm:cloudinit

C'est le lecteur de CD-ROM dans lequel Proxmox déposera la configuration de chaque VM. Sans lui, les copies démarreront sans compte et sans réseau.

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

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

La VM démarre sur son disque, et non sur le lecteur cloud-init. Le port série et l'agent invité sont les deux réglages qu'attendent la plupart des outils d'automatisation.

Étape 8 — Écrire le snippet cloud-init

Les champs de l'interface web savent créer un compte et poser une adresse IP, mais pas installer un paquet. Pour ça, il faut fournir du user-data.

Bash
nano /var/lib/vz/snippets/agent.yaml

Écrivez exactement ceci :

YAML
#cloud-config
packages:
  - qemu-guest-agent
runcmd:
  - systemctl enable --now qemu-guest-agent

Rattachez le fichier à la VM :

Bash
qm set 9000 --cicustom "vendor=local:snippets/agent.yaml"

La forme vendor= ajoute ce fichier à ce que Proxmox génère. Avec user=, il l'aurait remplacé, et les champs User et Password de l'interface web n'auraient plus eu aucun effet.

Étape 9 — Remplir les champs cloud-init

Sélectionnez la VM 9000 dans l'arborescence et ouvrez son panneau Cloud-Init. Trois lignes sont à remplir, chacune 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 serveur DNS

Ces valeurs sont recopiées dans chaque copie du template au premier démarrage. La ligne SSH public key reste vide pour l'instant.

Important

Ce mot de passe finira dans chaque VM clonée. Il est acceptable sur un réseau interne de laboratoire ; il ne l'est plus dès qu'une VM porte une adresse publique. En production, on ne met qu'une clé SSH dans le champ SSH public key et aucun mot de passe.

Étape 10 — Figer le template

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

C'est définitif : la VM 9000 ne démarrera plus jamais, elle ne sert qu'à être copiée. C'est aussi ce qui débloque le clone lié, qui n'existe que pour un template : une copie ne peut s'appuyer sur un disque d'origine que si ce disque ne peut plus changer.

Si le test des étapes suivantes révèle une erreur, tout n'est pas perdu : clonez le template, corrigez le clone, et convertissez-le en template à son tour.

Étape 11 — Cloner le template pour le tester

Faites un clic droit sur la VM 9000 et choisissez Clone.

Champ Valeur
VM ID 999
Name test-cloudinit
Mode Linked Clone

La fenêtre de clonage avec l'ID 999, le nom test-cloudinit et le mode Linked Clone

La copie apparaît en une ou deux secondes. Elle ne recopie rien : son disque ne contient que les différences avec celui du template, et il est vide au départ. Un Full Clone aurait recopié les 20 Go, ce qui prend plusieurs minutes sur un disque mécanique.

Étape 12 — Vérifier la carte réseau de la copie

Sélectionnez la VM 999, ouvrez son panneau Hardware et double-cliquez sur Network Device (net0).

La carte est sur le bridge vmbr0 et le champ VLAN Tag est vide

Le champ VLAN Tag doit rester vide. Le réseau de gestion du collège est le VLAN natif de votre câble : ses trames arrivent sans étiquette, donc une carte sans tag tombe dedans. Mettre 700 dans ce champ enverrait au contraire des trames étiquetées, que le switch ne comprendrait pas.

Fermez la fenêtre sans rien changer.

Étape 13 — Demander une adresse en DHCP

Ouvrez le panneau Cloud-Init de la VM 999 et double-cliquez sur la ligne IP Config (net0).

Choisissez DHCP dans la liste IPv4.

La fenêtre IP Config avec IPv4 réglé sur DHCP

C'est le réglage le plus courant sur une VM de test : le serveur DHCP du réseau de gestion lui prêtera une adresse, et vous n'avez rien à choisir.

Étape 14 — Démarrer et ouvrir la console

Cliquez sur Start, puis sur Console.

La VM démarre en quelques secondes et affiche l'invite de connexion de Debian 13

Connectez-vous avec etudiant et Motdepasse123!.

Il n'y a pas d'autre compte. Le compte root existe, mais il n'a aucun mot de passe : essayez su -, et la réponse sera su: Authentication failure. Aucun mot de passe ne marchera, parce qu'il n'y en a pas à trouver.

C'est le fonctionnement normal d'une image cloud. Le seul compte est celui que cloud-init a créé, et il a le droit d'emprunter les pouvoirs de root avec sudo. Toute commande qui touche au système en a donc besoin :

Bash
sudo apt-get update

Les commandes qui se contentent de lire, comme ip, df ou systemctl is-active, fonctionnent sans sudo.

Astuce

Un compte sans mot de passe ne peut pas être deviné. C'est pour ça que les images cloud ne verrouillent pas seulement root par SSH : elles ne lui donnent jamais de mot de passe du tout.

Étape 15 — Vérifier ce que cloud-init a fait

Bash
ip -brief addr show
Bash
df -h /

L'interface porte une adresse en 10.70.x.x obtenue en DHCP, et la racine fait environ 20 Go

Deux choses à regarder. L'adresse est arrivée sans intervention : c'est cloud-init qui a écrit la configuration DHCP avant le démarrage du réseau. Et le disque occupe les 20 Go demandés à l'étape 5, alors que l'image d'origine en faisait 3 : cloud-init a étendu la partition et le système de fichiers.

Vérifiez que la VM sort bien sur Internet :

Bash
ping -c 2 9.9.9.9

Les deux pings répondent

Étape 16 — Vérifier le travail du snippet

Bash
systemctl is-active qemu-guest-agent

La commande répond active

Ce paquet n'est pas dans l'image d'origine. Il a été installé par les quatre lignes du fichier agent.yaml, sans que vous ouvriez de session.

Retournez au panneau Summary de la VM dans l'interface web : l'adresse IP de la machine y est maintenant affichée. C'est l'agent qui la remonte à Proxmox.

Le panneau Summary affiche l'adresse IP de la VM invitée

Étape 17 — Détruire la VM de test

Sélectionnez la VM 999, cliquez sur Shutdown, puis sur More > Remove. Proxmox demande de retaper l'ID 999 pour confirmer.

Attention

La suppression efface la VM et son disque immédiatement, sans corbeille. Relisez le numéro dans la fenêtre de confirmation avant de valider.

Vérification finale

  • La VM 9000 porte l'icône de template et son bouton Start est inactif
  • Son panneau Hardware contient un disque scsi0 de 20 Go et un CloudInit Drive
  • Son panneau Cloud-Init affiche l'utilisateur etudiant
  • La VM de test 999 n'existe plus
  • Le fichier /var/lib/vz/snippets/agent.yaml existe sur le nœud

Question 1

Pourquoi le mode Linked Clone n'est-il proposé qu'après la conversion en template ?

  • a) Parce qu'un clone lié a besoin d'un disque d'origine qui ne peut plus changer.
  • b) Parce que Proxmox interdit de cloner une VM qui n'a jamais démarré.
  • c) Parce que le clone lié copie la configuration, et seule celle d'un template est figée.
Voir la réponse **a) Parce qu'un clone lié a besoin d'un disque d'origine qui ne peut plus changer.** Le disque du clone ne contient que ses propres différences : tout le reste est lu dans le disque du template. Si celui-ci pouvait être modifié, ou simplement démarrer, les copies verraient leur système changer sous leurs pieds. Le choix c) confond les deux moitiés de la VM. La configuration est toujours recopiée intégralement, dans les deux modes de clonage. Ce qui est partagé, et seulement en clone lié, c'est le disque.

Question 2

La carte réseau de la VM de test n'a aucun VLAN Tag, et pourtant elle obtient une adresse du réseau de gestion. Pourquoi ?

  • a) Parce que Proxmox ajoute automatiquement le tag 700 aux VM sans étiquette.
  • b) Parce que le VLAN 700 est le VLAN natif du câble : ses trames arrivent et repartent sans étiquette.
  • c) Parce que le serveur DHCP répond à toutes les VM, quel que soit leur VLAN.
Voir la réponse **b) Parce que le VLAN 700 est le VLAN natif du câble : ses trames arrivent et repartent sans étiquette.** Une carte sans tag envoie des trames nues, que le bridge range dans son PVID. Le switch les traite comme du trafic du VLAN natif, c'est-à-dire le 700. C'est exactement le mécanisme qui a permis à Proxmox de s'installer sans que vous configuriez le moindre VLAN. Le choix a) inverse la logique : Proxmox n'ajoute jamais de tag de lui-même. C'est le switch physique, au bout du câble, qui décide de ce que devient une trame sans étiquette.

Astuce

Dans une commande, le caractère # ouvre un commentaire : tout ce qui suit est ignoré par le shell. Si un document vous demande de remplacer # par le numéro de votre serveur, faites-le avant d'appuyer sur Entrée, sinon la commande part tronquée.