Un petit tour de Packer...
2/May 2023
Cela faisait très longtemps que je n’avais pas publié d’article sur Packer, et pour cause…Je n’y avais plus touché depuis 2019, bien que mon dernier article sur le sujet date de 2016.
Loin de moi l’idée de vous proposer un article de type lab, au contraire ce sera plutôt un retour d’expérience de l’outil.
Packer ?
Distribué par Hashicorp, au même titre que Terraform, Vault, Vagrant ou Consul, Packer fait partie des technologies qui sont devenues des standards en ce qui concerne les outils orientés DevOps relatif à l’infrastructure et à la création de machines virtuelles à l’aide d’un fichier de configuration.
Au départ en json, le langage de configuration des images créées à l’aide de Packer a évolué vers le HCL2 (certainement afin de gagner en homogénéité par rapport à Terraform ou Consul), bien que le json soit toujours compatible.
Si vous avez toujours des fichiers de configuration en json, il est également possible de les convertir en HCL2 à l’aide de la commande suivante : packer hcl2_upgrade -with-annotations <file_name>.pkr.hcl
Entre les deux, mon coeur balance
Je ne vais pas revenir sur chaque blocs, tout est déjà relativement bien expliqué sur la documentation officielle.
Néanmoins ce qui est un peu moins documenté, c’est la possibilité d’utiliser certains mécanismes propres à Terraform tels que :
- les blocs dynamiques,
- les variables de type list,
- les variables de type map,
- les variables de type object.
Les blocs dynamiques
Ce type de bloc, que l’on pourra utiliser au sein d’un bloc source pour définir une ou plusieurs options de même nature, telles que network_adapters ou storage (par exemple).
source "vsphere-iso" "linux" {
CPUs = var.CPUs
RAM = var.RAM
RAM_reserve_all = true
[...]
dynamic "network_adapters" {
for_each = var.NETWORK_ADAPTERS
content {
network_card = network_adapters.value
}
}
dynamic "storage" {
for_each = var.STORAGE
content {
disk_size = tonumber(storage.value.disk_size)
disk_thin_provisioned = tobool(storage.value.disk_thin_provisioned)
}
}
}
Les variables de type list, map ou object
Tout comme Terraform, Packer vous permet de définir des variables de type list, map ou object, grâce auxquelles vous pourrez enchainer la création d’images serveur.
variable "NETWORK_ADAPTERS" {
type = list
}
variable "STORAGE" {
type = list(object({
disk_size = string
disk_thin_provisioned = string
}))
}
variable "IMAGE" {
type = map(object({
CPUs = string
RAM = string
}))
}
Et la suite ?
L’idée de cet article ? Un simple update d’un viel article.
Depuis la version 1.5.0 de Packer, de nouvelles possibilités ont été ajoutées, dont des plugins…Et ce sera peut être l’objet d’un prochain article.