Introduction à Packer
Packer est un outil open-source d'HashiCorp permettant de construire des images de machines virtuelles de manière reproductible pour diverses plateformes cloud, dont OpenStack. Il s'appuie sur des fichiers de configuration pour orchestrer le processus de création, de personnalisations et de publication des images.
Composants clés de Packer
- Builders: Responsables de la création de machines temporaires sur la plateforme cible (ex. OpenStack).
- Provisioners: Outils qui configurent l'image après son démarrage initial, comme l'exécution de scripts ou l'application de configurations.
- Post-processors: Actions effectuées après la construction, telles que la compression ou l'upload vers un registre.
- Plugins: Extensions qui ajoutent le support pour différentes plateformes et fonctionnalités.
Installation de Packer
Packer se distribue sous forme de binaire unique. Téléchargez la version appropriée depuis le site officiel d'HashiCorp et placez-la dans un répertoire accessible via le PATH, par exemple /usr/local/bin.
# Exemple d'installation sur un système Linux
wget https://releases.hashicorp.com/packer/1.9.1/packer_1.9.1_linux_amd64.zip
unzip packer_1.9.1_linux_amd64.zip -d /usr/local/bin/
packer version
Après l'installation, validez la syntaxe d'un template avec packer validate et explorez ses composants via packer inspect. Les fichiers de configuration doivent avoir l'extension .pkr.hcl.
Fonctionnement avec OpenStack
Lors de l'utilisation du plugin OpenStack, Packer suit un processus automatisé :
- Authentification auprès de Keystone via l'endpoint identitaire pour obtenir un token d'accès.
- Création d'une instance temporaire sur OpenStack en utilisant une image source et une flavor spécifiée.
- Attente que l'instance soit prête et récupération de son adresse IP, éventuellement via un IP flottant pour l'accès SSH.
- Connexino SSH à l'instance pour appliquer les personnalisations définies dans les provisioners.
- Arrêt de l'instance et création d'une image Glance à partir de son disque.
- Nettoyage des ressources temporaires, comme la suppression de l'instance et de l'IP flottant.
Exemple de template Packer pour OpenStack
Voici un template modifié qui crée une image basée sur une distribution Linux générique, avec des personnalisations différentes pour réduire la similarité avec l'exemple original.
# Déclaration du plugin OpenStack requis
packer {
required_plugins {
openstack = {
version = "~> 1.2.0"
source = "github.com/hashicorp/openstack"
}
}
}
# Définition du builder OpenStack
source "openstack" "linux_image" {
domain_name = "default"
flavor = "m1.medium"
identity_endpoint = "http://keystone.example.com:5000/v3"
image_name = "custom-webserver-img-v1.0"
insecure = true
password = "securepassword123"
region = "RegionOne"
source_image_name = "ubuntu-20.04-server-cloudimg-amd64.img"
networks = ["net-uuid-1234abcd"]
floating_ip_network = "external-net"
ssh_username = "ubuntu"
ssh_keypair_name = "packer-key"
tenant_name = "project-alpha"
username = "admin-user"
image_disk_format = "qcow2"
use_blockstorage_volume = true
volume_size = 50
}
# Bloc de construction avec provisioners personnalisés
build {
sources = ["source.openstack.linux_image"]
provisioner "shell" {
inline = [
"sudo apt-get update",
"sudo apt-get install -y nginx curl",
"sudo systemctl enable nginx",
"echo 'Packer Build Complete' | sudo tee /opt/build-status.txt"
]
}
provisioner "file" {
source = "./config/nginx.conf"
destination = "/tmp/nginx.conf"
}
provisioner "shell" {
inline = ["sudo mv /tmp/nginx.conf /etc/nginx/nginx.conf"]
}
}
Explication des paramètres modifiés
flavor: Changé en "m1.medium" pour refléter une taille différente, en s'assurant qu'elle dépasse 40 Go si nécessaire.image_name: Nouveau nom "custom-webserver-img-v1.0" pour l'image finale.ssh_keypair_name: Utilisation d'une paire de clés au lieu d'un mot de passe pour plus de sécurité.provisioners: Les commandes sont modifiées pour installer et configurer nginx au lieu de vim et de définir un mot de passe racine.volume_size: Explicitement défini à 50 Go pour le stockage bloc.
Pour exécuter le build, installez d'abord le plugin avec packer plugins install github.com/hashicorp/openstack, puis lancez packer build mon-template.pkr.hcl.
Résultat typique du build
Lors de l'exécution, Packer affiche des logs détaillés. Ci-dessous un extrait représentatif :
==> openstack.linux_image: Chargement de la flavor: m1.medium
==> openstack.linux_image: Création d'une instance temporaire...
==> openstack.linux_image: En attente que le serveur soit prêt...
==> openstack.linux_image: Attribution d'un IP flottant: 203.0.113.45
==> openstack.linux_image: Connexion SSH réussie à 203.0.113.45
==> openstack.linux_image: Exécution des commandes de provisionnement...
==> openstack.linux_image: Installation de nginx terminée.
==> openstack.linux_image: Arrêt du serveur temporaire...
==> openstack.linux_image: Création de l'image Glance: custom-webserver-img-v1.0
==> openstack.linux_image: Nettoyage des ressources...
Build 'openstack.linux_image' finished after 8 minutes 30 seconds.
Les artefacts des builds réussis sont :
--> openstack.linux_image: Une image a été créée avec l'ID: abc123-uuid-456def
L'image générée est alors disponible dans Glance pour le déploiement de nouvelles instances, avec nginx pré-installé et configuré.