Depuis Packer 1.7, les templates s’écrivent en HCL2 (.pkr.hcl) — même langage que Terraform. Le format JSON legacy est toujours supporté mais déconseillé pour un nouveau projet.


packer — plugins requis

packer {
  required_plugins {
    googlecompute = {
      source  = "github.com/hashicorp/googlecompute"
      version = ">= 1.1.0"
    }
  }
}

Équivalent du required_providers Terraform : déclare les plugins (builders/provisioners/post-processors non intégrés au binaire packer) et leur version minimale. Installés par packer init.


variable et locals

variable "project_id" {
  type        = string
  description = "ID du projet GCP"
}
 
variable "image_name" {
  type = string
}
 
locals {
  build_date = formatdate("YYYY-MM-DD", timestamp())
}

Mêmes mécaniques que Terraform : variable pour les entrées (passées via -var, -var-file, ou variables d’environnement PKR_VAR_*), locals pour des valeurs calculées réutilisées dans le template.


source — VM de build + métadonnées de l’image

source "googlecompute" "app" {
  project_id           = var.project_id
  source_image_family  = "debian-12"
  image_name           = var.image_name
  image_family         = "app-image"
  machine_type         = "e2-medium"
  ssh_username          = "packer"
}

Un bloc source mélange deux responsabilités : la configuration de la VM temporaire qui sert au build (zone, réseau, machine_type, credentials SSH/WinRM) et les métadonnées de l’image finale publiée (nom, famille, labels, description). Un même source peut être référencé par plusieurs build.


build — enchaîne source, provisioners, post-processors

build {
  name    = "app"
  sources = ["source.googlecompute.app"]
 
  provisioner "shell" {
    script = "scripts/install.sh"
  }
 
  post-processor "manifest" {
    output = "manifest.json"
  }
}

sources peut lister plusieurs builders (ex. googlecompute et amazon-ebs) pour produire des images multi-cloud à partir des mêmes provisioners.


En relation avec