Aller au contenu

Validation des images Packer

Valider une image Packer garantit que les provisioners ont produit le résultat attendu avant de déployer en production. La validation couvre deux niveaux : la syntaxe du template et le contenu de l'image construite.


Validation du template

Packer fournit trois commandes pour vérifier et inspecter un template avant le build.

# Verifier la syntaxe et la configuration
packer validate .

# Formater les fichiers HCL2 (modifie les fichiers en place)
packer fmt .

# Afficher les sources, variables et builds d'un template
packer inspect .

packer validate résout les variables (depuis les fichiers .pkrvars.hcl ou les variables d'environnement) et vérifié la cohérence de la configuration. Il ne démarré pas de machine.

Validation en CI

Exécuter packer validate et packer fmt -check . en première étape de pipeline pour détecter les erreurs sans consommer de ressources cloud.


Inspec

Inspec est un framework de tests d'infrastructure de Chef. Il permet de vérifier l'état d'un système via des contrôles declaratifs en Ruby.

Installation

# macOS / Linux (Homebrew)
brew install inspec

# ou via le package omnibus
curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec

Structure d'un profil

mon-profil/
├── inspec.yml       # Metadonnees du profil
└── controls/
    └── base.rb      # Controles de validation

Fichier inspec.yml :

name: base-image
title: Validation image de base
version: 1.0.0

Exemple de contrôles

# controls/base.rb

# Verifier que docker-ce est installe
control "docker-installed" do
  impact 1.0
  title "Docker CE doit etre installe"
  desc "Le paquet docker-ce doit etre present sur le systeme"

  describe package("docker-ce") do
    it { should be_installed }
  end
end

# Verifier que le service docker est actif et demarre au boot
control "docker-service" do
  impact 1.0
  title "Service Docker actif"

  describe service("docker") do
    it { should be_enabled }
    it { should be_running }
  end
end

# Verifier qu'un fichier de configuration est present
control "docker-config" do
  impact 0.5
  title "Configuration Docker presente"

  describe file("/etc/docker/daemon.json") do
    it { should exist }
    its("content") { should include "log-driver" }
  end
end

Exécution

# Sur une machine SSH accessible
inspec exec mon-profil -t ssh://ubuntu@<IP> -i ~/.ssh/id_rsa

# Sur la machine locale
inspec exec mon-profil

# En mode reporter JUnit (pour CI)
inspec exec mon-profil --reporter junit:rapport.xml

Goss

Goss est un outil de validation d'infrastructure léger, écrit en Go, base sur des fichiers YAML. Il est plus rapide et plus simple à mettre en œuvre qu'Inspec pour des validations courantes.

Installation

curl -fsSL https://goss.rocks/install | sh
# Installe le binaire dans /usr/local/bin/goss

Fichier de tests YAML

# goss.yaml

package:
  docker-ce:
    installed: true

service:
  docker:
    enabled: true
    running: true

file:
  /etc/docker/daemon.json:
    exists: true
    contains:
      - "log-driver"

command:
  docker version:
    exit-status: 0
    stdout:
      - "Server:"

Exécution

# Validation directe
goss validate

# Mode serveur de sante (HTTP endpoint)
goss serve &
curl http://localhost:8080/healthz

Intégration avec Packer

Le plugin packer-provisioner-goss permet d'exécuter Goss pendant le build, directement dans la machine temporaire :

packer {
  required_plugins {
    goss = {
      source  = "github.com/YaleUniversity/packer-provisioner-goss"
      version = "~> 3"
    }
  }
}

build {
  sources = ["source.googlecompute.base"]

  provisioner "shell" {
    inline = ["apt-get install -y docker-ce"]
  }

  provisioner "goss" {
    tests    = ["goss.yaml"]
    download_path = "/tmp/goss"
  }
}

Si les tests échouent, Packer interrompt le build et ne produit pas d'image. L'image n'est créée que si tous les contrôles passent.


Comparatif Inspec vs Goss

Critère Inspec Goss
Langage de tests Ruby (DSL) YAML
Courbe d'apprentissage Modérée Faible
Richesse des contrôles Très élevée Suffisante pour cas courants
Performance Modérée Élevée (binaire Go)
Intégration Packer Via shell + upload Plugin natif
Rapports CI JUnit, HTML, JSON TAP, JSON
Cas d'usage idéal Audits de conformité complexes Validation rapide post-build