Ubuntu installation automatique Déploiement automatisé
autoinstall est la solution d’installation automatisée fournie par le programme d’installation Subiquity du serveur Subiquity. Il utilise un fichier de configuration YAML pour permettre le déploiement de serveur sans surveillance.
Comment ça marche
la configuration de l’installation automatique peut être fournie via :
- données utilisateur cloud-init - transmises via les données utilisateur de la plateforme cloud
- Fichier local - Placé sur le support d’installation ou sur un système de fichiers accessible
- Serveur HTTP - Chargé sur le réseau
Le programme d’installation recherche la configuration d’installation automatique au démarrage. Une fois trouvé, il procède automatiquement à l’installation sans intervention manuelle.
Structure de configuration de base
#cloud-config
autoinstall:
version: 1
# Language and keyboard
locale: en_US.UTF-8
keyboard:
layout: us
# Network configuration
network:
version: 2
ethernets:
eth0:
dhcp4: true
# Software sources
apt:
primary:
- arches: [default]
uri: http://archive.ubuntu.com/ubuntu
# Disk configuration
storage:
layout:
name: lvm
# User configuration
identity:
hostname: ubuntu-server
username: ubuntu
password: "$6$rounds=4096$xyz$hashedpassword"
# SSH configuration
ssh:
install-server: true
allow-pw: false
authorized-keys:
- ssh-ed25519 AAAA... admin@workstation
# Post-installation commands
late-commands:
- curtin in-target -- apt update
- curtin in-target -- apt upgrade -yExemples de configuration complète
Installation standard du serveur
#cloud-config
autoinstall:
version: 1
# Interactive settings (which steps require manual confirmation)
interactive-sections: [] # Empty means fully automatic
locale: en_US.UTF-8
keyboard:
layout: us
variant: ""
# Use updated installer
refresh-installer:
update: true
# Network
network:
version: 2
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
# Proxy (leave empty if not used)
proxy: ""
# APT mirror
apt:
primary:
- arches: [amd64]
uri: http://archive.ubuntu.com/ubuntu
geoip: false
# Storage configuration - using LVM
storage:
layout:
name: lvm
sizing-policy: scaled
# Or specify root partition size
# sizing-policy: all
# System identity
identity:
hostname: prod-web-01
username: deploy
# Generated with: mkpasswd --method=sha-512
password: "$6$rounds=4096$saltsalt$hashedpasswordhere"
# SSH
ssh:
install-server: true
allow-pw: false
authorized-keys:
- ssh-ed25519 AAAA... deploy@admin
# Snap packages to install
snaps:
- name: docker
channel: latest/stable
classic: false
# Deb packages to install
packages:
- ubuntu-server-minimal
- vim
- htop
- curl
- wget
- git
- ufw
- fail2ban
# Automatic security updates
updates: security
# Post-installation commands
late-commands:
# Set timezone
- curtin in-target -- timedatectl set-timezone America/New_York
# Configure firewall
- curtin in-target -- ufw allow ssh
- curtin in-target -- ufw --force enable
# Write custom configuration files
- |
cat <<'SYSCTL' > /target/etc/sysctl.d/99-custom.conf
net.ipv4.ip_forward = 1
net.core.somaxconn = 65535
vm.swappiness = 10
SYSCTL
# Enable services
- curtin in-target -- systemctl enable fail2ban
# Reboot automatically after installation completes
shutdown: rebootSchéma de partitionnement personnalisé
#cloud-config
autoinstall:
version: 1
locale: en_US.UTF-8
storage:
config:
# Disk
- id: disk0
type: disk
ptable: gpt
path: /dev/sda
wipe: superblock-recursive
grub_device: false
# EFI partition
- id: efi-part
type: partition
device: disk0
size: 512M
flag: boot
grub_device: true
# Boot partition
- id: boot-part
type: partition
device: disk0
size: 1G
# Remaining space for LVM
- id: lvm-part
type: partition
device: disk0
size: -1 # All remaining space
# EFI filesystem
- id: efi-fs
type: format
volume: efi-part
fstype: fat32
# Boot filesystem
- id: boot-fs
type: format
volume: boot-part
fstype: ext4
# LVM volume group
- id: vg0
type: lvm_volgroup
name: vg0
devices:
- lvm-part
# LVM logical volume - root
- id: lv-root
type: lvm_partition
volgroup: vg0
name: lv-root
size: 20G
# LVM logical volume - var
- id: lv-var
type: lvm_partition
volgroup: vg0
name: lv-var
size: 30G
# LVM logical volume - home
- id: lv-home
type: lvm_partition
volgroup: vg0
name: lv-home
size: -1
# Format logical volumes
- id: root-fs
type: format
volume: lv-root
fstype: ext4
- id: var-fs
type: format
volume: lv-var
fstype: ext4
- id: home-fs
type: format
volume: lv-home
fstype: ext4
# Mount points
- id: mount-efi
type: mount
device: efi-fs
path: /boot/efi
- id: mount-boot
type: mount
device: boot-fs
path: /boot
- id: mount-root
type: mount
device: root-fs
path: /
- id: mount-var
type: mount
device: var-fs
path: /var
- id: mount-home
type: mount
device: home-fs
path: /home
identity:
hostname: custom-server
username: admin
password: "$6$rounds=4096$saltsalt$hash"
ssh:
install-server: trueFournir la configuration d’installation automatique
Méthode 1 : modifier l’ISO
# Mount the original ISO
mkdir -p /mnt/iso
sudo mount -o loop ubuntu-26.04-live-server-amd64.iso /mnt/iso
# Copy the contents
mkdir -p ~/custom-iso
cp -rT /mnt/iso ~/custom-iso
sudo umount /mnt/iso
# Add the autoinstall configuration
mkdir -p ~/custom-iso/autoinstall
cp autoinstall.yaml ~/custom-iso/autoinstall/user-data
touch ~/custom-iso/autoinstall/meta-data
# Modify the GRUB configuration to add an autoinstall boot entry
# Add the following to ~/custom-iso/boot/grub/grub.cfg:
cat >> ~/custom-iso/boot/grub/grub.cfg << 'EOF'
menuentry "Autoinstall Ubuntu Server" {
set gfxpayload=keep
linux /casper/vmlinuz autoinstall ds=nocloud\;s=/cdrom/autoinstall/ ---
initrd /casper/initrd
}
EOF
# Regenerate the ISO
sudo apt install xorriso -y
xorriso -as mkisofs \
-r -V "Ubuntu 26.04 Autoinstall" \
-o ~/ubuntu-26.04-autoinstall.iso \
-J -joliet-long \
--grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
-partition_offset 16 \
-append_partition 2 0xEF ~/custom-iso/boot/grub/efi.img \
-appended_part_as_gpt \
-eltorito-boot boot/grub/bios.img \
-eltorito-catalog boot/grub/boot.cat \
--no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot -e '--interval:appended_partition_2:all::' --no-emul-boot \
~/custom-isoMéthode 2 : serveur HTTP
# Start an HTTP server on another machine
mkdir -p ~/autoinstall-server
cp autoinstall.yaml ~/autoinstall-server/user-data
touch ~/autoinstall-server/meta-data
cd ~/autoinstall-server
python3 -m http.server 8080
# During installation, add the kernel parameter in the GRUB command line:
# autoinstall ds=nocloud-net;s=http://192.168.1.50:8080/Méthode 3 : démarrage réseau PXE
Adapté au déploiement à grande échelle, combiné avec des serveurs TFTP + HTTP :
# Install PXE-related software
sudo apt install tftpd-hpa -y
# Place the kernel and initrd in the TFTP directory
sudo cp /mnt/iso/casper/vmlinuz /srv/tftp/
sudo cp /mnt/iso/casper/initrd /srv/tftp/
# Add kernel parameters in the PXE configuration
# kernel vmlinuz
# append initrd=initrd autoinstall ds=nocloud-net;s=http://192.168.1.50:8080/ ---Générer un hachage de mot de passe
# Method 1: Using mkpasswd
sudo apt install whois -y
mkpasswd --method=sha-512
# Method 2: Using openssl
openssl passwd -6
# Note: Python 3.13 removed the crypt module; use the mkpasswd or openssl methods above insteadExporter la configuration d’installation automatique d’un système existant
Après l’installation, vous pouvez exporter la configuration d’installation actuelle du système pour l’utiliser comme modèle :
# View the autoinstall configuration used during installation
sudo cat /var/log/installer/autoinstall-user-data
# This file contains the full installation configuration and can be reused as a templateValider la configuration
# Validate syntax with cloud-init
cloud-init schema --config-file autoinstall.yaml
# Check YAML format with Python
python3 -c "import yaml; yaml.safe_load(open('autoinstall.yaml'))"Problèmes courants
L’installation se bloque à une étape de confirmation
Assurez-vous que interactive-sections est défini sur une liste vide :
autoinstall:
interactive-sections: []Configuration réseau non appliquée
Vérifiez que le nom de l’interface réseau est correct. Vous pouvez vérifier le nom réel de l’interface dans l’environnement d’installation avec ip link.
commandes tardives Échec
- Utilisez le préfixe
curtin in-target --pour exécuter des commandes dans le système cible - Pour les opérations de chemin direct, utilisez le préfixe
/target/ - Vérifiez les journaux sur :
/var/log/installer/curtin-install.log