Chapitre 820 minIntermédiaire
Postes Linux : preseed, autoinstall et cloud-init
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- écrire un fichier preseed pour installer Debian 13 sans intervention ;
- fournir un fichier autoinstall à l'installeur d'Ubuntu ;
- configurer une machine virtuelle au premier démarrage avec cloud-init ;
- choisir l'outil adapté entre preseed, autoinstall, cloud-init et Ansible.
4 exercices corrigés1 schéma
Sous Linux, on déploie rarement par image : on automatise l'installation elle-même avec un fichier de réponses, preseed pour Debian et autoinstall pour Ubuntu, puis on configure les machines virtuelles au premier démarrage avec cloud-init. Ce chapitre écrit un fichier preseed pour Debian 13, un fichier autoinstall pour Ubuntu 26.04 LTS, et prépare sur Proxmox un modèle de VM configuré par cloud-init.
Pourquoi Linux se déploie autrement
Une installation de Debian ou d'Ubuntu par le réseau prend une dizaine de minutes : elle télécharge les paquets à jour depuis un miroir. Il n'y a ni activation, ni identifiant de sécurité de la machine à régénérer (seuls l'identifiant /etc/machine-id et les clés SSH de l'hôte doivent être uniques, et les outils de clonage savent les recréer), et la configuration se décrit très bien dans des fichiers texte. D'où trois outils, selon le contexte :
| Outil | Distribution | Quand il agit | Usage typique |
|---|---|---|---|
| preseed | Debian (et ses dérivées utilisant l'installateur Debian) | Pendant l'installation | Postes et serveurs physiques ou virtuels, installés depuis le réseau ou une clé |
| autoinstall | Ubuntu Server et Desktop | Pendant l'installation | La même chose pour Ubuntu, avec un fichier YAML |
| cloud-init | Presque toutes (images « cloud ») | Au premier démarrage d'une image déjà installée | Machines virtuelles créées en série sur Proxmox ou dans le cloud |
Après ces outils, la configuration continue de vivre avec un outil de gestion de configuration comme Ansible, qui applique et vérifie l'état voulu sur tout le parc.
Preseed : installer Debian 13 sans intervention
L'installateur de Debian pose ses questions par l'intermédiaire de debconf. Un fichier preseed fournit les réponses à l'avance, une par ligne, sous la forme propriétaire question type valeur : le propriétaire est d-i pour l'installateur lui-même, ou le nom du paquet concerné. Le manuel d'installation de Debian 13 publie un fichier d'exemple complet et commenté, example-preseed.txt : on part toujours de lui, pour la version visée.
Voici le fichier des postes Linux du service informatique de Sorbier :
#### poste-debian13.cfg : installation automatique de Debian 13 « Trixie »
### Langue, pays et clavier
d-i debian-installer/locale string fr_FR.UTF-8
d-i keyboard-configuration/xkb-keymap select fr
### Réseau : première carte avec un lien, nom proposé si le DHCP n'en donne pas
d-i netcfg/choose_interface select auto
d-i netcfg/get_hostname string pc-lyo-linux
d-i netcfg/get_domain string ad.sorbier.example
### Miroir
d-i mirror/country string manual
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
### Comptes : pas de connexion root, un administrateur qui utilise sudo
d-i passwd/root-login boolean false
d-i passwd/user-fullname string Administrateur Sorbier
d-i passwd/username string adminsorbier
d-i passwd/user-password-crypted password $6$Sorbier26$I11NC8B09odz.sD3gwFFlQSK9IbB0PKPo1xbe6tx8UYEUedzinPC01nII4dSIrGAmqoKrYOOJtzB5Yoc5titx1
### Horloge et fuseau horaire
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 192.168.10.177
### Partitionnement : tout le disque, LVM, une seule partition pour le système
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
### Logiciels : système standard, bureau GNOME, serveur SSH
tasksel tasksel/first multiselect standard, gnome-desktop, ssh-server
d-i pkgsel/include string sudo curl
d-i pkgsel/upgrade select full-upgrade
popularity-contest popularity-contest/participate boolean false
### Chargeur de démarrage sur le disque principal
d-i grub-installer/bootdev string default
### Commandes finales dans le système installé, puis redémarrage sans question
d-i preseed/late_command string in-target sh -c 'mkdir -p /etc/sorbier && date > /etc/sorbier/deploiement'
d-i finish-install/reboot_in_progress note
Les points importants :
- Les mots de passe ne s'écrivent jamais en clair :
user-password-cryptedattend une empreinte au format decrypt, qu'on génère avecopenssl passwd -6(SHA-512) oumkpasswd -m sha-512(paquetwhois). L'empreinte de l'exemple correspond au mot de passe d'exemple du chapitre 3 : à changer, évidemment. root-login falsedésactive la connexion directe en root ; le compte créé est alors ajouté au groupesudo.- Le nom de la machine donné par le DHCP l'emporte sur celui du fichier. Le fichier sert surtout à éviter la question ; on renomme ensuite chaque poste (ou on utilise une réservation DHCP avec un nom).
- Le partitionnement est la partie la plus délicate. La recette
atomicmet tout dans une seule partition, LVM utilise tout le disque, et les lignesconfirmrépondent oui aux avertissements de destruction des données. S'il y a plusieurs disques, il faut désigner le bon avecd-i partman-auto/disk string /dev/nvme0n1(ou/dev/sda) : sans cette ligne, l'installateur s'arrête pour demander. late_commandexécute des commandes à la fin ;in-targetles lance dans le système installé (monté sur/target), pas dans l'installateur.
Lancer l'installation avec le fichier. On publie le fichier sur un serveur web, par exemple dans /var/www/html/preseed/ de srv-deploiement, qui fait déjà tourner Apache pour FOG. Puis :
- depuis une clé ou l'ISO
netinstde Debian 13 : au menu de démarrage, se placer sur l'entrée d'installation, appuyer sur e (sur un PC UEFI, le menu est celui de GRUB) et ajouter à la ligne du noyau :
auto=true priority=critical url=http://192.168.10.186/preseed/poste-debian13.cfg
- depuis le réseau : l'archive
netboot.tar.gzde Debian 13 contient le noyau et l'image de démarrage de l'installateur ; on les publie sur le serveur et on ajoute une entrée au menu iPXE de FOG qui les charge avec les mêmes paramètres.
Le mode auto=true retarde les questions de langue et de clavier jusqu'au chargement du fichier ; priority=critical n'affiche que les questions critiques auxquelles le fichier n'a pas répondu. Si l'installateur pose quand même une question, c'est qu'une réponse manque ou qu'elle est mal écrite : note la question et ajoute la ligne correspondante. Pour trouver son nom exact, installe une machine à la main, puis lance debconf-get-selections --installer (paquet debconf-utils) : la commande liste toutes les réponses données. debconf-set-selections -c poste-debian13.cfg vérifie la syntaxe d'un fichier.
Autoinstall : installer Ubuntu 26.04 LTS sans intervention
Depuis 2020 pour Ubuntu Server, et depuis la version 23.04 pour Ubuntu Desktop, l'installateur s'appelle Subiquity et lit un fichier autoinstall au format YAML. Exemple pour un poste Ubuntu du service informatique :
#cloud-config
autoinstall:
version: 1
locale: fr_FR.UTF-8
keyboard:
layout: fr
timezone: Europe/Paris
identity:
realname: Administrateur Sorbier
username: adminsorbier
hostname: pc-lyo-0150
password: "$6$Sorbier26$I11NC8B09odz.sD3gwFFlQSK9IbB0PKPo1xbe6tx8UYEUedzinPC01nII4dSIrGAmqoKrYOOJtzB5Yoc5titx1"
storage:
layout:
name: lvm
ssh:
install-server: true
allow-pw: false
authorized-keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExempleDeCleSorbier admin@sorbier
packages:
- curl
- vim
late-commands:
- curtin in-target -- mkdir -p /etc/sorbier
Ce qu'il faut retenir :
version: 1est obligatoire ; tout le reste est rangé sous la cléautoinstall:.identitycrée le compte, avec une empreinte de mot de passe entre guillemets (les$et les points ont un sens en YAML).storage.layout.namevautlvm(par défaut sur un disque unique),direct(partitions simples) ouzfs.sshinstalle le serveur SSH et n'autorise que la clé indiquée :allow-pw: falseinterdit la connexion par mot de passe. Sur l'ISO Desktop, le paquet du serveur SSH n'est pas sur le média : l'installation doit avoir accès aux dépôts d'Ubuntu.late-commandss'exécutent à la fin, le système installé monté sur/target;curtin in-target --lance la commande à l'intérieur.
Fournir le fichier à l'installateur, trois possibilités :
- Sur le média : un fichier
autoinstall.yamlà la racine de l'ISO (le dossier qui contient le dossiercasper), ce qui suppose de reconstruire l'ISO. - Par cloud-init, la méthode recommandée : le fichier, avec son en-tête
#cloud-config, est publié sous le nomuser-datasur un serveur web, à côté d'un fichiermeta-data(qui peut être vide), et la machine démarre avec les paramètres du noyauautoinstall ds=nocloud;s=http://192.168.10.186/autoinstall/. Dans le menu GRUB, le point-virgule doit être protégé par une barre oblique inverse :ds=nocloud\;s=http://…. - Par le paramètre
subiquity.autoinstallpath=chemin/vers/autoinstall.yamldu noyau, pour un fichier présent dans le système d'installation.
Le mot-clé autoinstall sur la ligne du noyau évite une dernière confirmation : sans lui, même avec un fichier complet, l'installateur demande une confirmation avant d'écrire sur les disques. C'est un garde-fou volontaire, pour la même raison que l'avertissement sur le preseed.
Cloud-init : configurer une VM au premier démarrage
cloud-init est l'outil standard de configuration des machines au premier démarrage. Il est installé dans les images cloud que publient les distributions (Debian genericcloud, Ubuntu Cloud Images) : des disques déjà installés, sans compte ni mot de passe. Au premier démarrage, cloud-init cherche une source de données (un lecteur virtuel, une adresse web du fournisseur de cloud), y lit la configuration et l'applique : nom de la machine, comptes, clés SSH, réseau, paquets, commandes.
Proxmox VE sait fournir ces données grâce à un lecteur Cloud-Init attaché à la VM. Chez Sorbier, on crée une fois un modèle Debian 13, puis chaque nouvelle VM en est un clone, configuré en quelques secondes. Sur l'hôte Proxmox, en ligne de commande, après avoir téléchargé l'image debian-13-genericcloud-amd64.qcow2 depuis le site officiel de Debian :
# Créer la VM 9000, sans disque, sur le VLAN 20
qm create 9000 --name debian13-modele --memory 2048 --cores 2 \
--net0 virtio,bridge=vmbr0,tag=20 --scsihw virtio-scsi-single
# Importer l'image cloud comme disque système, ajouter le lecteur Cloud-Init
qm set 9000 --scsi0 local-lvm:0,import-from=/root/debian-13-genericcloud-amd64.qcow2
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --boot order=scsi0
qm set 9000 --serial0 socket --vga serial0
# Transformer la VM en modèle
qm template 9000
# Cloner le modèle et configurer le clone
qm clone 9000 120 --name srv-test --full
qm set 120 --ciuser adminsorbier --sshkeys /root/cle-admin.pub --ipconfig0 ip=dhcp
qm start 120
Les mêmes réglages se font dans l'interface web, onglet Cloud-Init de la VM : User, Password, DNS domain, DNS servers, SSH public key, IP Config, puis Regenerate Image. Le cours Virtualisation détaille les modèles et les clones sous Proxmox.
Pour aller plus loin que ces réglages, on fournit son propre fichier de configuration user-data. Il commence obligatoirement par la ligne #cloud-config :
#cloud-config
hostname: srv-test
timezone: Europe/Paris
package_update: true
packages:
- qemu-guest-agent
- htop
users:
- name: adminsorbier
groups: [sudo]
shell: /bin/bash
sudo: "ALL=(ALL) NOPASSWD:ALL"
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExempleDeCleSorbier admin@sorbier
runcmd:
- systemctl enable --now qemu-guest-agent
On le dépose dans un stockage Proxmox qui accepte le type de contenu Snippets (par exemple /var/lib/vz/snippets/ pour le stockage local, après avoir coché Snippets dans ses réglages), puis :
qm set 120 --cicustom "user=local:snippets/srv-test-user-data.yaml"
Joindre un poste Linux au domaine
Un poste Linux peut rejoindre le domaine Active Directory, pour que les salariés s'y connectent avec leur compte du domaine. Sur Debian ou Ubuntu, on utilise realmd, qui configure SSSD et crée le compte d'ordinateur :
sudo apt install realmd sssd sssd-tools adcli libnss-sss libpam-sss packagekit
sudo realm discover ad.sorbier.example
sudo realm join --user=svc-jonction ad.sorbier.example
La commande demande le mot de passe du compte de jonction, crée le compte d'ordinateur dans le conteneur par défaut (l'option --computer-ou choisit une OU), puis configure SSSD. Comme pour Windows, le poste doit utiliser le DNS de l'annuaire. Cette étape trouve naturellement sa place dans les commandes finales d'une installation automatique, ou dans un rôle Ansible.
Exercices
Exercice 1 sur 4 Compléter un preseed Réussi À revoir
Un collègue a écrit ce début de fichier preseed, mais l'installation s'arrête sur trois questions : le clavier (qui propose QWERTY), le fuseau horaire et le mot de passe de root. Écris les lignes manquantes pour un clavier AZERTY, le fuseau de Paris, et aucun mot de passe root (le compte adminsorbier utilisera sudo).
d-i debian-installer/locale string fr_FR.UTF-8
d-i passwd/user-fullname string Administrateur Sorbier
d-i passwd/username string adminsorbier
d-i passwd/user-password-crypted password $6$...
Voir la réponseMasquer la réponse de l'exercice 1
d-i keyboard-configuration/xkb-keymap select fr
d-i time/zone string Europe/Paris
d-i passwd/root-login boolean false
Avec root-login à false, l'installateur ne demande pas de mot de passe root et ajoute adminsorbier au groupe sudo. On peut ajouter d-i clock-setup/utc boolean true pour l'horloge matérielle en UTC.
Tu avais trouvé ?
Exercice 2 sur 4 Le bon outil Réussi À revoir
Pour chaque besoin, choisis entre preseed, autoinstall et cloud-init, et justifie.
- Créer en cinq minutes une VM Debian 13 de test sur le Proxmox de Sorbier, avec la clé SSH d'Antoine.
- Réinstaller chaque été les 16 postes Ubuntu 26.04 de la salle de formation.
- Installer Debian 13 sur un serveur physique neuf, depuis le réseau, toujours avec le même partitionnement.
Voir la réponseMasquer la réponse de l'exercice 2
- cloud-init : on clone le modèle Debian 13 fait à partir de l'image cloud, et le lecteur Cloud-Init fournit le nom, le compte et la clé SSH au premier démarrage. Aucune installation à attendre.
- autoinstall : c'est l'installateur d'Ubuntu ; le fichier YAML, fourni par cloud-init via un serveur web, rend les 16 installations identiques. Une image FOG du poste Ubuntu serait aussi possible, mais l'installation automatique part toujours des paquets à jour.
- preseed : l'installateur Debian, lancé par le réseau, avec un fichier qui fixe le partitionnement et désigne le bon disque avec
partman-auto/disk.
Tu avais trouvé ?
Exercice 3 sur 4 cloud-init ne fait rien Réussi À revoir
Chloé a cloné le modèle et ajouté ce fichier avec --cicustom. La VM démarre, mais l'utilisateur n'existe pas et les paquets ne sont pas installés.
hostname: srv-supervision-test
packages:
- htop
users:
- name: clambert
groups: [sudo]
ssh_authorized_keys:
- ssh-ed25519 AAAAC3Nza... chloe@sorbier
- Quelle est l'erreur ?
- Où aurait-elle pu trouver l'information ?
Voir la réponseMasquer la réponse de l'exercice 3
- La première ligne
#cloud-configmanque. Sans elle, cloud-init ne reconnaît pas le fichier comme une configuration cloud-config et l'ignore. Il faut l'ajouter en toute première ligne, sans espace avant. - Dans
/var/log/cloud-init.logde la VM (le fichier y est signalé comme non reconnu), et aveccloud-init status --long. La commandecloud-init schema --config-file fichier.yaml, lancée sur une machine où cloud-init est installé, valide un fichier avant de l'utiliser.
Tu avais trouvé ?
Exercice 4 sur 4 Générer une empreinte Réussi À revoir
- Écris la commande qui produit l'empreinte SHA-512 du mot de passe
Lab-Sorbier!pour un fichier preseed ou autoinstall. - Pourquoi ne pas écrire directement le mot de passe dans le fichier ?
Voir la réponseMasquer la réponse de l'exercice 4
openssl passwd -6 'Lab-Sorbier!'(oumkpasswd -m sha-512 'Lab-Sorbier!'). Les apostrophes empêchent le shell d'interpréter le!. La commande tire un sel aléatoire : deux exécutions donnent deux empreintes différentes, toutes deux valides.- Le fichier est publié sur un serveur web, copié, versionné : toute personne qui le lit connaîtrait le mot de passe. Une empreinte salée ne se « décode » pas ; elle peut seulement être attaquée par force brute, d'où l'intérêt d'un mot de passe long, changé après l'installation ou remplacé par une authentification par clé SSH.
Tu avais trouvé ?