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 :
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¶
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 |