Accélérer le déploiement de VM Proxmox avec Packer

Découverte de Packer
Dans mon parcours d'automatisation d'infrastructure, j'ai découvert Packer, un outil fascinant développé par HashiCorp. C'est un outil gratuit qui m'a permis de créer des images préconstruites pour différentes plateformes comme AWS, Azure, Digital Ocean, VirtualBox, Proxmox et bien d'autres. Dans mon cas, ce sera Proxmox
Ce que j'aime particulièrement avec cet outil en ligne de commande, c'est qu'il me permet de créer des images sur mesure incluant :
- Mes applications préférées déjà installées
- Les comptes utilisateurs préconfigurés
- Les clés SSH
- La configuration réseau
- Et plein d'autres personnalisations...
J'ai été impressionné par sa puissance pour automatiser le déploiement d'infrastructure. Grâce à Packer, je peux déployer mes environnements de test ou de développement en un rien de temps. Le plus cool ? Il fonctionne sur tous les systèmes : Windows, macOS et Linux !
Comment j'ai fait fonctionner Packer avec Proxmox
En explorant Packer, j'ai découvert qu'il propose deux façons différentes de travailler avec Proxmox :
proxmox-iso
proxmox-clone

Pour ce guide, j'ai choisi d'utiliser proxmox-iso
car il s'intègre parfaitement avec les templates VM de Proxmox.
Mon premier template : une expérience pas à pas
Ce que je voulais créer
Je me suis lancé dans la création d'un template basé sur Ubuntu 24.04 (Noble) avec ces caractéristiques :
- CPU : 2 cœurs (parfait pour mes tests)
- RAM : 2048 MB (2GB)
- Disque : 20GB (amplement suffisant pour commencer)
- OS : Ubuntu 24.04
Mise en place de Packer
Installation
La première chose cool avec Packer, c'est qu'il n'a pas besoin d'être sur la même machine que Proxmox. Pour l'installer, j'ai suivi la documentation officielle.
Sur mon Linux, j'ai utilisé ces commandes :
wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install packer
Organisation des fichiers
Pour gagner du temps, j'ai créé un dépôt que vous pouvez cloner :
git clone https://github.com/LudovicARHIMAN/Packer-Templates.git
Voici comment j'ai organisé les fichiers :
Vous ne trouverez pas le fichiercredentials.pkr.hcl
dans le dépôt car il contient des informations sensibles. Je l'ai exclu avec.gitignore
pour des raisons de sécurité.
Créez votre propre fichier credentials.pkr.hcl
avec ce modèle :
proxmox_api_url = "https://0.0.0.0:8006/api2/json" # L'adresse de votre Proxmox
proxmox_api_token_id = "GENERATED_API_TOKEN-ID" # Votre ID de token
proxmox_api_token_secret = "GENERATED_API_Secret"
Configuration du token API dans Proxmox
Pour que Packer puisse communiquer avec Proxmox, il faut créer un token API. Voici comment j'ai fait :
- Dans l'interface web de Proxmox, je suis allé dans Datacenter > Permissions > API Token
- J'ai cliqué sur Add pour créer un nouveau token

Ensuite, j'ai mis à jour mon fichier credentials.pkr.hcl
avec mes informations :
proxmox_api_url = "https://pve.reverse9.xyz:8006/api2/json" # Mon serveur Proxmox
proxmox_api_token_id = "root@pam!packer" # Mon ID de token
proxmox_api_token_secret = "mon-token-secret-ici"
Les fichiers de configuration en détail
Le fichier principal du template
Le fichier ubuntu-server-noble/ubuntu-server-noble.pkr.hcl
est le cœur de l'automatisation. Je vais vous expliquer comment je l'ai configuré :
1. Les variables essentielles
variable "proxmox_api_url" {
type = string
}
variable "proxmox_api_token_id" {
type = string
}
variable "proxmox_api_token_secret" {
type = string
sensitive = true
}
Ces variables sont cruciales pour la connexion à Proxmox.
2. Configuration de la VM
J'ai divisé la configuration en plusieurs parties pour plus de clarté :
a. Connexion à Proxmox
proxmox_url = "${var.proxmox_api_url}"
username = "${var.proxmox_api_token_id}"
token = "${var.proxmox_api_token_secret}"
b. Paramètres de base
node = "pve"
vm_id = "500"
vm_name = "ubuntu-server-noble"
template_description = "Mon image Ubuntu Server Noble"
c. Configuration de l'OS
iso_url = "https://releases.ubuntu.com/noble/ubuntu-24.04.2-live-server-amd64.iso"
iso_checksum = "d6dab0c3a657988501b4bd76f1297c053df710e06e0c3aece60dead24f270b4d"
iso_storage_pool = "ISO"
d. Ressources matérielles
qemu_agent = true
scsi_controller = "virtio-scsi-pci"
disks {
disk_size = "20G"
format = "raw"
storage_pool = "local"
type = "virtio"
}
cores = "2"
memory = "2048"
e. Configuration réseau
network_adapters {
model = "virtio"
bridge = "vmbr0"
firewall = "false"
}
Configuration de Cloud-init
Dans le fichier user-data
, j'ai configuré l'installation automatique :
autoinstall:
version: 1
locale: en_US
keyboard:
layout: fr
ssh:
install-server: true
allow-pw: true
disable_root: true
ssh_quiet_keygen: true
allow_public_ssh_keys: true
packages:
- qemu-guest-agent
- sudo
storage:
layout:
name: direct
swap:
size: 0
user-data:
package_upgrade: false
timezone: Indian/Reunion
users:
- name: admin
groups: [adm, sudo]
lock-passwd: false
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-public-key
Création du template : le moment de vérité !
Vérification de la configuration
Avant de lancer la création, j'ai vérifié que tout était bien configuré :
cd ubuntu-server-noble/
packer validate -var-file='../credentials.pkr.hcl' ./ubuntu-server-noble.pkr.hcl
Si vous voyez "The configuration is valid", c'est parfait !
Lancement de la création
J'ai lancé la création avec cette commande :
packer build -var-file='../credentials.pkr.hcl' ./ubuntu-server-noble.pkr.hcl
Cette commande va :
- Télécharger l'ISO d'Ubuntu
- L'envoyer sur mon serveur Proxmox
- Démarrer une nouvelle VM
- La configurer automatiquement via SSH
- La transformer en template
Le résultat
Et voilà le résultat :
Mon template est bien là dans Proxmox

Avec exactement les spécifications que je voulais

Maintenant, je peux créer autant de VM que je veux à partir de ce template, toutes configurées exactement comme je le souhaite. C'est ça la puissance de l'automatisation !