Chapitre 813 minIntermédiaire
Modèles, clones et cloud-init : déployer une VM en une minute
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- distinguer un clone complet d'un clone lié ;
- construire un modèle Debian 13 avec cloud-init ;
- déployer une VM configurée en une minute depuis un modèle ;
- généraliser un modèle Windows avec Sysprep et éviter les doublons.
4 exercices corrigés
Un modèle (template) est une machine virtuelle préparée une fois pour toutes, figée, qui sert de base à de nouvelles VM : on la clone au lieu de réinstaller un système à chaque fois. Avec cloud-init, le clone reçoit à son premier démarrage son nom, son adresse IP, son compte et sa clé SSH, sans qu'on ouvre la console. Ce chapitre explique la différence entre clone complet et clone lié, construit un modèle Debian 13 avec cloud-init, prépare un modèle Windows avec Sysprep, et automatise le déploiement.
Pourquoi des modèles
Installer Debian à la main prend vingt minutes, Windows Server une heure avec les mises à jour. Et deux installations manuelles ne sont jamais tout à fait identiques. Un modèle apporte :
- la vitesse : un clone est prêt en une minute ;
- la standardisation : tous les serveurs partent de la même base, avec les mêmes réglages de sécurité, le même agent invité, la même configuration de l'heure ;
- la documentation : le modèle est décrit une fois, ses clones héritent de cette description.
Le piège, c'est la duplication des identifiants. Une VM copiée telle quelle garde ceux de l'original : le nom d'hôte, l'identifiant de machine Linux (/etc/machine-id), les clés d'hôte SSH, et sous Windows l'identifiant de sécurité (SID) de la machine. Deux machines du domaine avec le même SID, deux serveurs avec les mêmes clés SSH ou le même machine-id (et donc parfois le même bail DHCP) provoquent des pannes difficiles à comprendre. Un modèle doit donc être généralisé : débarrassé de tout ce qui doit être unique. Proxmox, lui, attribue toujours une nouvelle adresse MAC au clone.
Modèle, clone complet et clone lié
Dans Proxmox VE, une VM devient un modèle avec More > Convert to template (ou qm template <VMID>). Un modèle ne démarre plus ; son icône change, ses disques sont renommés base-<VMID>-disk-N et deviennent en lecture seule. On en tire des clones avec More > Clone :
| Clone complet (Full Clone) | Clone lié (Linked Clone) | |
|---|---|---|
| Disques | Copie intégrale des disques du modèle | Un disque qui ne stocke que les différences avec le modèle |
| Durée de création | Proportionnelle à la taille des disques | Quelques secondes |
| Espace occupé | Toute la taille | Seulement ce qui change |
| Dépendance | Aucune : le clone vit sa vie | Le clone a besoin du modèle : on ne peut plus supprimer le modèle tant qu'il a des clones liés |
| Stockage | N'importe lequel, même différent de celui du modèle | Le même que le modèle, et un stockage qui le permet (qcow2, LVM-thin, ZFS, Ceph) |
| Usage | Les serveurs de production | Les laboratoires, les VM jetables de test |
Un modèle Debian 13 avec cloud-init
cloud-init est un programme présent dans les images « cloud » des distributions Linux. Au premier démarrage, il lit une configuration fournie par l'hyperviseur (sous Proxmox, un petit lecteur CD virtuel CloudInit Drive) et l'applique : nom d'hôte, compte utilisateur, clé SSH, adresse IP, DNS, mise à jour des paquets. Il régénère aussi les clés d'hôte SSH : le clone est unique sans rien faire.
Debian publie une image prête, debian-13-genericcloud-amd64.qcow2. Sur pve1, en root :
# 1. Télécharger l'image cloud de Debian 13
cd /root
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2
# 2. Créer la VM 9000, sans disque pour l'instant
qm create 9000 --name modele-debian13 --ostype l26 \
--cpu x86-64-v2-AES --cores 2 --memory 2048 \
--scsihw virtio-scsi-pci --net0 virtio,bridge=vmbr0,tag=20 \
--agent enabled=1
# 3. Importer l'image comme disque de la VM, sur le stockage partagé
qm set 9000 --scsi0 truenas-nfs:0,import-from=/root/debian-13-genericcloud-amd64.qcow2,format=qcow2
# 4. Ajouter le lecteur cloud-init, démarrer sur le disque, console série
qm set 9000 --ide2 truenas-nfs:cloudinit
qm set 9000 --boot order=scsi0
qm set 9000 --serial0 socket --vga serial0
# 5. Réglages communs à tous les clones
qm set 9000 --ciuser sorbier-admin --sshkeys /root/.ssh/id_ed25519.pub \
--nameserver 192.168.10.177 --searchdomain ad.sorbier.example --ciupgrade 1
# 6. Figer le modèle
qm template 9000
Ce qu'il faut retenir de ces commandes :
import-fromcopie l'image téléchargée dans un nouveau disque de la VM ; la taille0signifie « la taille de l'image » (environ 3 Go) ;truenas-nfs:cloudinitcrée le lecteur qui portera la configuration cloud-init ; toute VM cloud-init doit en avoir un ;--serial0 socket --vga serial0donne une console série : les images cloud n'affichent pas toujours d'écran graphique. On l'ouvre avec Console (xterm.js) ;--ciupgrade 1demande à cloud-init de mettre à jour les paquets au premier démarrage.
Les mêmes réglages se trouvent dans l'onglet Cloud-Init de la VM : User, Password, DNS domain, DNS servers, SSH public key, Upgrade packages, IP Config (net0). Après une modification, le bouton Regenerate Image reconstruit le lecteur cloud-init.
#cloud-config
packages:
- qemu-guest-agent
runcmd:
- systemctl start qemu-guest-agent
Déployer un serveur depuis le modèle
Sorbier veut un serveur de recette, srv-recette, pour tester la prochaine version de son application de gestion avant de l'installer sur srv-gestion. Le VLAN 20 des serveurs est plein : il va dans le VLAN 21 APPLIS (192.168.21.0/24, passerelle 192.168.21.254), que Sorbier a ouvert pour les applications internes et la recette quand le VLAN 20 des serveurs a été plein, avec l'adresse 192.168.21.186. Le modèle est branché sur le VLAN 20 : on change donc l'étiquette de la carte du clone.
qm clone 9000 186 --name srv-recette --full --storage truenas-nfs
qm set 186 --cores 4 --memory 8192
qm set 186 --net0 virtio,bridge=vmbr0,tag=21,firewall=1
qm set 186 --ipconfig0 ip=192.168.21.186/24,gw=192.168.21.254
qm disk resize 186 scsi0 40G
qm start 186
Une minute plus tard, ssh sorbier-admin@192.168.21.186 fonctionne : le clone a son nom (celui de la VM, srv-recette), son adresse, le compte sorbier-admin avec ta clé, ses propres clés d'hôte SSH, et cloud-init a agrandi la partition pour occuper les 40 Go du disque. Sans --full, qm clone crée un clone lié à partir d'un modèle.
Pour un laboratoire, le même déploiement se scripte en boucle :
#!/usr/bin/env bash
# Déploie trois VM de TP, en clones liés du modèle 9000, dans le VLAN 10 (DHCP des postes)
set -euo pipefail
for i in 1 2 3; do
vmid=$((300 + i))
qm clone 9000 "$vmid" --name "tp-linux-$i"
qm set "$vmid" --net0 virtio,bridge=vmbr0,tag=10 --ipconfig0 ip=dhcp
qm start "$vmid"
done
qm list
Pour aller plus loin, on décrit les VM dans des fichiers et on laisse un outil les créer et les configurer : le cours Scripts PowerShell et Bash montre l'automatisation par scripts.
Un modèle Windows Server avec Sysprep
Windows n'a pas cloud-init en standard (l'équivalent existe avec Cloudbase-Init, à installer). La méthode classique est Sysprep, l'outil de Microsoft qui généralise une installation : il supprime le SID de la machine, son nom et ses pilotes spécifiques, puis éteint la machine. Au démarrage suivant, chaque clone repasse par l'écran de premier démarrage (OOBE) et reçoit un nouveau SID.
- Crée la VM 9001
modele-ws2025comme au chapitre 6, installe Windows Server 2025, les pilotes VirtIO et l'agent invité. - Installe les mises à jour et les réglages communs (fuseau horaire, Bureau à distance, pare-feu). Ne la joins pas au domaine et n'installe aucun rôle.
- Lance Sysprep en tant qu'administrateur :
C:\Windows\System32\Sysprep\sysprep.exe /generalize /oobe /shutdown
- Quand la VM s'est éteinte, ne la redémarre pas : convertis-la directement en modèle (
qm template 9001).
Chaque clone démarre sur l'écran de premier démarrage : il reste à choisir la langue, le mot de passe administrateur, puis à le nommer, lui donner son adresse et le joindre au domaine. Un fichier de réponses (/unattend:C:\Windows\System32\Sysprep\unattend.xml), préparé avec l'outil Windows System Image Manager, automatise aussi ces étapes.
Généraliser un modèle Linux sans cloud-init
Si tu pars d'une installation Debian classique plutôt que d'une image cloud, généralise-la toi-même avant de la convertir en modèle :
apt clean
truncate -s 0 /etc/machine-id # régénéré au prochain démarrage
rm -f /var/lib/dbus/machine-id
rm -f /etc/ssh/ssh_host_* # clés d'hôte SSH supprimées
history -c
poweroff
Sur chaque clone, au premier démarrage, régénère les clés SSH avec dpkg-reconfigure openssh-server, puis change le nom d'hôte avec hostnamectl set-hostname. C'est exactement ce que cloud-init fait à ta place.
Exercices
Exercice 1 sur 4 Clone complet ou lié ? Réussi À revoir
Pour chaque besoin, choisis le type de clone et justifie.
- Vingt VM Debian identiques pour un TP de deux heures, détruites à la fin.
- Le futur serveur de supervision de Sorbier, à partir du modèle Debian 13.
- Un clone d'un modèle rangé sur
local-lvmdepve1, à placer surtruenas-nfs.
Voir la réponseMasquer la réponse de l'exercice 1
- Clones liés : création instantanée, très peu d'espace, et la dépendance au modèle ne gêne pas pour des VM jetables.
- Clone complet : un serveur de production ne doit pas dépendre d'un modèle.
- Clone complet obligatoirement : un clone lié doit rester sur le même stockage que son modèle.
Tu avais trouvé ?
Exercice 2 sur 4 Déployer srv-recette2 Réussi À revoir
Écris les commandes qui déploient srv-recette2 (VM 189, 192.168.21.189/24, dans le VLAN 21 APPLIS) en clone complet du modèle 9000 sur truenas-nfs, avec 2 vCPU, 4 Gio de mémoire, un disque de 30 Go, puis la démarrent. Vérifie que l'adresse est dans le réseau du VLAN 21 et qu'elle n'entre pas en conflit avec la passerelle.
Voir la réponseMasquer la réponse de l'exercice 2
qm clone 9000 189 --name srv-recette2 --full --storage truenas-nfs
qm set 189 --cores 2 --memory 4096
qm set 189 --net0 virtio,bridge=vmbr0,tag=21,firewall=1
qm set 189 --ipconfig0 ip=192.168.21.189/24,gw=192.168.21.254
qm disk resize 189 scsi0 30G
qm start 189
Le réseau 192.168.21.0/24 va de .1 à .254 pour les hôtes : .189 est dedans, et il est libre (.182 est ct-horaires, .186 srv-recette). La passerelle est .254, sur le pare-feu. Sans la ligne --net0, le clone garderait l'étiquette 20 du modèle : il serait dans le VLAN des serveurs avec une adresse du VLAN 21, et ne joindrait pas sa passerelle.
Tu avais trouvé ?
Exercice 3 sur 4 Les doublons Réussi À revoir
Un technicien a créé trois serveurs Windows en copiant le disque d'une VM déjà installée, sans Sysprep, puis les a joints au domaine. Deux problèmes apparaissent : des avertissements sur des identifiants de sécurité en double, et deux serveurs Linux copiés de la même façon qui affichent un avertissement SSH « REMOTE HOST IDENTIFICATION HAS CHANGED » sur le poste d'administration. Explique les deux et ce qu'il aurait fallu faire.
Voir la réponseMasquer la réponse de l'exercice 3
- Windows : les trois serveurs ont le même SID de machine, celui de la VM d'origine. Il fallait généraliser la VM d'origine avec
sysprep /generalize /oobe /shutdown, la convertir en modèle, et cloner le modèle : chaque clone obtient un nouveau SID au premier démarrage. - Linux : les deux serveurs ont les mêmes clés d'hôte SSH (et le même
machine-id). Le poste d'administration a mémorisé la clé du premier ; quand il se connecte au second avec une adresse qu'il associait à une autre clé, ou au premier après une régénération, l'empreinte ne correspond plus. Il fallait supprimer les clés et vider/etc/machine-idavant de faire le modèle, ou utiliser une image cloud-init, qui les régénère à chaque clone.
Tu avais trouvé ?
Exercice 4 sur 4 Lire l'onglet Cloud-Init Réussi À revoir
Un clone du modèle 9000 démarre, mais la connexion ssh sorbier-admin@192.168.21.186 est refusée avec « Permission denied (publickey) ». L'onglet Cloud-Init montre User sorbier-admin, SSH public key vide, IP Config correcte. Explique et corrige.
Voir la réponseMasquer la réponse de l'exercice 4
Le compte sorbier-admin existe, mais aucune clé publique n'a été fournie : l'image cloud de Debian refuse par défaut les connexions SSH par mot de passe, donc personne ne peut se connecter. Ajoute la clé dans SSH public key (ou qm set 186 --sshkeys /root/.ssh/id_ed25519.pub), clique sur Regenerate Image et redémarre la VM : cloud-init installe la clé au démarrage.
Tu avais trouvé ?