Aller au contenu
Infrastructure as Code medium

Packer : concepts et architecture

14 min de lecture

logo packer

Ce guide vous explique les concepts fondamentaux de Packer pour que vous puissiez créer vos premières images machine reproductibles. Vous comprendrez comment Packer automatise la création d'images identiques pour le cloud, les VMs locales ou les conteneurs, le tout à partir d'un simple fichier de configuration.

  • Ce qu'est Packer et pourquoi l'utiliser
  • Les trois composants clés : builders, provisioners, post-processors
  • Le workflow complet : init → validate → build
  • Quand choisir Packer plutôt qu'une autre approche

Prérequis : aucun. Ce guide est une introduction aux concepts.

Packer est un outil open source créé par HashiCorp qui automatise la création d'images machine. Une image machine est un système d'exploitation déjà installé et configuré, enregistré sous une forme réutilisable (AMI Amazon, image Docker, fichier QCOW2 pour KVM, template Proxmox) à partir de laquelle on instancie des machines identiques. Packer produit ces images à partir d'un fichier de configuration en HCL, sans installation manuelle ni clic dans une interface.

L'apport de Packer est la reproductibilité : le contenu de l'image est décrit dans un fichier versionné, et non dans les souvenirs de la personne qui l'a construite. Deux exécutions du même modèle produisent la même image, sur le poste d'un développeur comme dans une chaîne d'intégration.

AspectSans PackerAvec Packer
Création d'imageInstallation manuelle, clics dans l'interfaceUne commande : packer build
Reproductibilité"Ça marchait la dernière fois..."Image identique à chaque build
DocumentationNotes personnelles, wiki obsolèteLe template HCL EST la documentation
Multi-plateformeRefaire le travail pour chaque cibleUn template, plusieurs images
VersioningDifficile à tracerTemplate versionné avec Git

Imaginez que vous devez déployer une application sur 50 serveurs. Sans Packer, vous avez deux options :

  1. Configurer chaque serveur manuellement, long, source d'erreurs, impossible à reproduire
  2. Utiliser un outil de configuration à chaque démarrage, lent, dépendant du réseau

Avec Packer, vous créez une seule fois une image "golden" qui contient tout : système d'exploitation, dépendances, configuration de sécurité. Ensuite, vous déployez cette image sur vos 50 serveurs en quelques minutes.

Construire l'image une seule fois, en amont du déploiement, déplace le travail de configuration hors du démarrage des machines. Chaque serveur démarre alors dans un état déjà validé, ce qui apporte cinq gains mesurables au quotidien.

  • Déploiement rapide : une VM prête en secondes au lieu de minutes de configuration
  • Cohérence : tous les serveurs sont identiques, pas de "configuration drift"
  • Sécurité : les correctifs sont intégrés dans l'image, pas appliqués après coup
  • Audit : le template décrit exactement ce qui est installé
  • Multi-cloud : une même configuration pour AWS, Azure, GCP, on-premise

Packer fonctionne avec trois types de composants qui s'exécutent dans un ordre précis. Comprendre cette architecture est essentiel pour écrire des templates efficaces.

Architecture Packer : Template HCL contenant Builder, Provisioners et Post-processors

Le builder est responsable de créer une machine temporaire et de produire une image à partir de celle-ci. Chaque builder est spécifique à une plateforme :

BuilderPlateformeUsage typique
amazon-ebsAWSAMI pour EC2
azure-armAzureImages managées
googlecomputeGCPImages Compute Engine
qemuKVM/libvirtImages locales Linux
proxmox-isoProxmoxTemplates VM
dockerDockerImages conteneur
virtualbox-isoVirtualBoxImages de dev

Packer supporte plus de 52 builders via son système de plugins. Les builders officiels maintenu par HashiCorp sont téléchargés depuis releases.hashicorp.com.

Les provisioners s'exécutent après que le builder a créé la machine temporaire. Ils configurent le système : installer des paquets, copier des fichiers, exécuter des scripts.

ProvisionerDescriptionCas d'usage
shellExécute des commandes shellScripts bash simples
ansibleExécute des playbooks AnsibleConfiguration complexe
fileCopie des fichiers vers l'imageFichiers de config
powershellScripts PowerShellImages Windows
chef / puppetOutils de configurationÉcosystèmes existants

L'ordre des provisioners dans le template détermine leur ordre d'exécution. Packer les exécute séquentiellement.

Les post-processors s'exécutent après la création de l'image pour effectuer des actions supplémentaires :

Post-ProcessorAction
manifestGénère un fichier JSON avec les métadonnées du build
compressCompresse l'image en archive
docker-pushPousse l'image vers Docker Hub ou un registry
checksumCalcule les checksums (sha256, md5)
vagrantConvertit en box Vagrant

Packer suit un workflow en trois étapes que vous utiliserez systématiquement :

  1. packer init, Télécharge les plugins requis

    Cette commande lit le bloc required_plugins de votre template et télécharge les plugins nécessaires. À exécuter une seule fois par projet (ou quand vous ajoutez un nouveau plugin).

    Fenêtre de terminal
    packer init mon-template.pkr.hcl
  2. packer validate, Vérifie la syntaxe du template

    Valide que le template HCL est syntaxiquement correct et que toutes les références sont valides. Cette commande ne crée rien, elle vérifie simplement.

    Fenêtre de terminal
    packer validate mon-template.pkr.hcl
  3. packer build, Construit l'image

    Exécute le builder, les provisioners et les post-processors pour créer l'image finale.

    Fenêtre de terminal
    packer build mon-template.pkr.hcl

Quand vous lancez packer build, voici ce qui se passe en coulisses :

  1. Création : le builder démarre une machine temporaire (VM, conteneur...)
  2. Connexion : Packer se connecte via SSH ou WinRM
  3. Provisionnement : les provisioners configurent la machine
  4. Capture : le builder crée une image à partir de la machine
  5. Nettoyage : la machine temporaire est détruite
  6. Post-traitement : les post-processors s'exécutent sur l'image

Un template Packer en HCL (HashiCorp Configuration Language) se compose de plusieurs blocs :

# 1. Bloc packer : version et plugins requis
packer {
required_version = ">= 1.15.0"
required_plugins {
docker = {
version = ">= 1.1.0"
source = "github.com/hashicorp/docker"
}
}
}
# 2. Variables : rendent le template configurable
variable "image_name" {
type = string
default = "mon-app"
description = "Nom de l'image finale"
}
# 3. Source : définit le builder et sa configuration
source "docker" "ubuntu" {
image = "ubuntu:22.04"
commit = true
}
# 4. Build : assemble sources, provisioners et post-processors
build {
sources = ["source.docker.ubuntu"]
provisioner "shell" {
inline = ["apt-get update", "apt-get install -y curl"]
}
}

Packer vs Ansible, Chef et Dockerfile : quelles différences ?

Section intitulée « Packer vs Ansible, Chef et Dockerfile : quelles différences ? »

Packer se compare souvent à deux familles d'outils que les débutants confondent avec lui : les gestionnaires de configuration (Ansible, Chef, Puppet) et le Dockerfile. La distinction tient au moment où l'outil agit. Packer configure la machine avant le déploiement et fige le résultat dans une image ; les gestionnaires de configuration agissent pendant ou après le déploiement, sur une machine déjà démarrée. Le Dockerfile, lui, ne produit que des images de conteneur, là où Packer cible aussi les VMs et le cloud.

Packer vs Configuration Management (Ansible, Chef, Puppet)

Section intitulée « Packer vs Configuration Management (Ansible, Chef, Puppet) »
AspectPackerAnsible/Chef/Puppet
QuandAvant le déploiement (build time)Pendant/après le déploiement (run time)
RésultatImage figéeConfiguration dynamique
Temps de démarrageInstantanéDépend de la complexité
Dépendances réseauNonOui (repos, registries)

En pratique : utilisez les deux ensemble. Packer avec Ansible en provisioner pour créer des images, puis Ansible pour les mises à jour légères post-déploiement.

AspectPackerDockerfile
ScopeVMs + conteneursConteneurs uniquement
Multi-plateformeOui (AWS, Azure, QEMU...)Non
ProvisionersShell, Ansible, Chef...Shell uniquement
ÉcosystèmeIntégration Terraform/VaultÉcosystème Docker

En pratique : pour des conteneurs simples, Dockerfile suffit. Pour des VMs ou des images multi-plateformes, utilisez Packer.

Créez une AMI AWS pré-configurée avec vos outils de monitoring, agents de sécurité et configurations réseau. Chaque nouvelle instance démarre avec tout ce qu'il faut.

Automatisez la création de templates Proxmox ou VMware pour votre infrastructure personnelle. Un seul template pour créer des VMs identiques.

Créez des images de base avec vos standards d'entreprise : outils de debug, certificats, configuration réseau.

Produisez des boxes Vagrant cohérentes pour que tous les développeurs travaillent dans le même environnement.

Quatre erreurs reviennent chez presque tous les débutants sur Packer. Elles ne cassent pas toujours le build de façon évidente, et certaines coûtent surtout du temps ou exposent un secret. Les connaître avant le premier packer build évite de les découvrir en production.

  • Packer automatise la création d'images machine reproductibles (VMs, conteneurs)
  • Builders créent la machine temporaire (AWS, Docker, QEMU, Proxmox...)
  • Provisioners configurent l'image (Shell, Ansible, File...)
  • Post-processors finalisent l'artefact (compress, push, manifest...)
  • Workflow : packer initpacker validatepacker build
  • HCL2 est le format de template recommandé depuis v1.7.0
  • Golden images = images de référence pré-configurées et validées

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn