Un petit tour de Packer...

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.