Découverte de Packer

Dans mon parcours d'automatisation d'infrastructure, j'ai découvert Packer, un outil fascinant développé par HashiCorp. C'est un outil gratuit qui m'a permis de créer des images préconstruites pour différentes plateformes comme AWS, Azure, Digital Ocean, VirtualBox, Proxmox et bien d'autres. Dans mon cas, ce sera Proxmox

Ce que j'aime particulièrement avec cet outil en ligne de commande, c'est qu'il me permet de créer des images sur mesure incluant :

J'ai été impressionné par sa puissance pour automatiser le déploiement d'infrastructure. Grâce à Packer, je peux déployer mes environnements de test ou de développement en un rien de temps. Le plus cool ? Il fonctionne sur tous les systèmes : Windows, macOS et Linux !

Comment j'ai fait fonctionner Packer avec Proxmox

En explorant Packer, j'ai découvert qu'il propose deux façons différentes de travailler avec Proxmox :

Les builders Proxmox
Source : Documentation officielle de Packer

Pour ce guide, j'ai choisi d'utiliser proxmox-iso car il s'intègre parfaitement avec les templates VM de Proxmox.

Mon premier template : une expérience pas à pas

Ce que je voulais créer

Je me suis lancé dans la création d'un template basé sur Ubuntu 24.04 (Noble) avec ces caractéristiques :

Mise en place de Packer

Installation

La première chose cool avec Packer, c'est qu'il n'a pas besoin d'être sur la même machine que Proxmox. Pour l'installer, j'ai suivi la documentation officielle.

Sur mon Linux, j'ai utilisé ces commandes :

wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

sudo apt update && sudo apt install packer

Organisation des fichiers

Pour gagner du temps, j'ai créé un dépôt que vous pouvez cloner :

git clone https://github.com/LudovicARHIMAN/Packer-Templates.git

Voici comment j'ai organisé les fichiers :

Vous ne trouverez pas le fichier credentials.pkr.hcl dans le dépôt car il contient des informations sensibles. Je l'ai exclu avec .gitignore pour des raisons de sécurité.

Créez votre propre fichier credentials.pkr.hcl avec ce modèle :

proxmox_api_url = "https://0.0.0.0:8006/api2/json"  # L'adresse de votre Proxmox
proxmox_api_token_id = "GENERATED_API_TOKEN-ID"  # Votre ID de token
proxmox_api_token_secret = "GENERATED_API_Secret"

Configuration du token API dans Proxmox

Pour que Packer puisse communiquer avec Proxmox, il faut créer un token API. Voici comment j'ai fait :

  1. Dans l'interface web de Proxmox, je suis allé dans Datacenter > Permissions > API Token
  2. J'ai cliqué sur Add pour créer un nouveau token
Création du token API

Ensuite, j'ai mis à jour mon fichier credentials.pkr.hcl avec mes informations :

proxmox_api_url = "https://pve.reverse9.xyz:8006/api2/json"  # Mon serveur Proxmox
proxmox_api_token_id = "root@pam!packer"  # Mon ID de token
proxmox_api_token_secret = "mon-token-secret-ici"

Les fichiers de configuration en détail

Le fichier principal du template

Le fichier ubuntu-server-noble/ubuntu-server-noble.pkr.hcl est le cœur de l'automatisation. Je vais vous expliquer comment je l'ai configuré :

1. Les variables essentielles

variable "proxmox_api_url" {
    type = string
}

variable "proxmox_api_token_id" {
    type = string
}

variable "proxmox_api_token_secret" {
    type = string
    sensitive = true
}

Ces variables sont cruciales pour la connexion à Proxmox.

2. Configuration de la VM

J'ai divisé la configuration en plusieurs parties pour plus de clarté :

a. Connexion à Proxmox
proxmox_url = "${var.proxmox_api_url}"
username = "${var.proxmox_api_token_id}"
token = "${var.proxmox_api_token_secret}"
b. Paramètres de base
node = "pve"
vm_id = "500"
vm_name = "ubuntu-server-noble"
template_description = "Mon image Ubuntu Server Noble"
c. Configuration de l'OS
iso_url = "https://releases.ubuntu.com/noble/ubuntu-24.04.2-live-server-amd64.iso"
iso_checksum = "d6dab0c3a657988501b4bd76f1297c053df710e06e0c3aece60dead24f270b4d"
iso_storage_pool = "ISO"
d. Ressources matérielles
qemu_agent = true
scsi_controller = "virtio-scsi-pci"

disks {
    disk_size = "20G"
    format = "raw"
    storage_pool = "local"
    type = "virtio"
}

cores = "2"
memory = "2048"
e. Configuration réseau
network_adapters {
    model = "virtio"
    bridge = "vmbr0"
    firewall = "false"
}

Configuration de Cloud-init

Dans le fichier user-data, j'ai configuré l'installation automatique :

autoinstall:
  version: 1
  locale: en_US
  keyboard:
    layout: fr
  ssh:
    install-server: true
    allow-pw: true
    disable_root: true
    ssh_quiet_keygen: true
    allow_public_ssh_keys: true
  packages:
    - qemu-guest-agent
    - sudo
  storage:
    layout:
      name: direct
    swap:
      size: 0
  user-data:
    package_upgrade: false
    timezone: Indian/Reunion
    users:
      - name: admin
        groups: [adm, sudo]
        lock-passwd: false
        sudo: ALL=(ALL) NOPASSWD:ALL
        shell: /bin/bash
        ssh_authorized_keys:
           - ssh-public-key

Création du template : le moment de vérité !

Vérification de la configuration

Avant de lancer la création, j'ai vérifié que tout était bien configuré :

cd ubuntu-server-noble/
packer validate -var-file='../credentials.pkr.hcl' ./ubuntu-server-noble.pkr.hcl

Si vous voyez "The configuration is valid", c'est parfait !

Lancement de la création

J'ai lancé la création avec cette commande :

packer build -var-file='../credentials.pkr.hcl' ./ubuntu-server-noble.pkr.hcl

Cette commande va :

  1. Télécharger l'ISO d'Ubuntu
  2. L'envoyer sur mon serveur Proxmox
  3. Démarrer une nouvelle VM
  4. La configurer automatiquement via SSH
  5. La transformer en template

Le résultat

Et voilà le résultat :

Mon template est bien là dans Proxmox

Mon template créé

Avec exactement les spécifications que je voulais

Maintenant, je peux créer autant de VM que je veux à partir de ce template, toutes configurées exactement comme je le souhaite. C'est ça la puissance de l'automatisation !

" >

Accélérer le déploiement de VM Proxmox avec Packer

Accélérer le déploiement de VM Proxmox avec Packer

Découverte de Packer

Dans mon parcours d'automatisation d'infrastructure, j'ai découvert Packer, un outil fascinant développé par HashiCorp. C'est un outil gratuit qui m'a permis de créer des images préconstruites pour différentes plateformes comme AWS, Azure, Digital Ocean, VirtualBox, Proxmox et bien d'autres. Dans mon cas, ce sera Proxmox

Ce que j'aime particulièrement avec cet outil en ligne de commande, c'est qu'il me permet de créer des images sur mesure incluant :

  • Mes applications préférées déjà installées
  • Les comptes utilisateurs préconfigurés
  • Les clés SSH
  • La configuration réseau
  • Et plein d'autres personnalisations...

J'ai été impressionné par sa puissance pour automatiser le déploiement d'infrastructure. Grâce à Packer, je peux déployer mes environnements de test ou de développement en un rien de temps. Le plus cool ? Il fonctionne sur tous les systèmes : Windows, macOS et Linux !

Comment j'ai fait fonctionner Packer avec Proxmox

En explorant Packer, j'ai découvert qu'il propose deux façons différentes de travailler avec Proxmox :

  • proxmox-iso
  • proxmox-clone
Les builders Proxmox
Source : Documentation officielle de Packer

Pour ce guide, j'ai choisi d'utiliser proxmox-iso car il s'intègre parfaitement avec les templates VM de Proxmox.

Mon premier template : une expérience pas à pas

Ce que je voulais créer

Je me suis lancé dans la création d'un template basé sur Ubuntu 24.04 (Noble) avec ces caractéristiques :

  • CPU : 2 cœurs (parfait pour mes tests)
  • RAM : 2048 MB (2GB)
  • Disque : 20GB (amplement suffisant pour commencer)
  • OS : Ubuntu 24.04

Mise en place de Packer

Installation

La première chose cool avec Packer, c'est qu'il n'a pas besoin d'être sur la même machine que Proxmox. Pour l'installer, j'ai suivi la documentation officielle.

Sur mon Linux, j'ai utilisé ces commandes :

wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

sudo apt update && sudo apt install packer

Organisation des fichiers

Pour gagner du temps, j'ai créé un dépôt que vous pouvez cloner :

git clone https://github.com/LudovicARHIMAN/Packer-Templates.git

Voici comment j'ai organisé les fichiers :

Vous ne trouverez pas le fichier credentials.pkr.hcl dans le dépôt car il contient des informations sensibles. Je l'ai exclu avec .gitignore pour des raisons de sécurité.

Créez votre propre fichier credentials.pkr.hcl avec ce modèle :

proxmox_api_url = "https://0.0.0.0:8006/api2/json"  # L'adresse de votre Proxmox
proxmox_api_token_id = "GENERATED_API_TOKEN-ID"  # Votre ID de token
proxmox_api_token_secret = "GENERATED_API_Secret"

Configuration du token API dans Proxmox

Pour que Packer puisse communiquer avec Proxmox, il faut créer un token API. Voici comment j'ai fait :

  1. Dans l'interface web de Proxmox, je suis allé dans Datacenter > Permissions > API Token
  2. J'ai cliqué sur Add pour créer un nouveau token
Création du token API

Ensuite, j'ai mis à jour mon fichier credentials.pkr.hcl avec mes informations :

proxmox_api_url = "https://pve.reverse9.xyz:8006/api2/json"  # Mon serveur Proxmox
proxmox_api_token_id = "root@pam!packer"  # Mon ID de token
proxmox_api_token_secret = "mon-token-secret-ici"

Les fichiers de configuration en détail

Le fichier principal du template

Le fichier ubuntu-server-noble/ubuntu-server-noble.pkr.hcl est le cœur de l'automatisation. Je vais vous expliquer comment je l'ai configuré :

1. Les variables essentielles

variable "proxmox_api_url" {
    type = string
}

variable "proxmox_api_token_id" {
    type = string
}

variable "proxmox_api_token_secret" {
    type = string
    sensitive = true
}

Ces variables sont cruciales pour la connexion à Proxmox.

2. Configuration de la VM

J'ai divisé la configuration en plusieurs parties pour plus de clarté :

a. Connexion à Proxmox
proxmox_url = "${var.proxmox_api_url}"
username = "${var.proxmox_api_token_id}"
token = "${var.proxmox_api_token_secret}"
b. Paramètres de base
node = "pve"
vm_id = "500"
vm_name = "ubuntu-server-noble"
template_description = "Mon image Ubuntu Server Noble"
c. Configuration de l'OS
iso_url = "https://releases.ubuntu.com/noble/ubuntu-24.04.2-live-server-amd64.iso"
iso_checksum = "d6dab0c3a657988501b4bd76f1297c053df710e06e0c3aece60dead24f270b4d"
iso_storage_pool = "ISO"
d. Ressources matérielles
qemu_agent = true
scsi_controller = "virtio-scsi-pci"

disks {
    disk_size = "20G"
    format = "raw"
    storage_pool = "local"
    type = "virtio"
}

cores = "2"
memory = "2048"
e. Configuration réseau
network_adapters {
    model = "virtio"
    bridge = "vmbr0"
    firewall = "false"
}

Configuration de Cloud-init

Dans le fichier user-data, j'ai configuré l'installation automatique :

autoinstall:
  version: 1
  locale: en_US
  keyboard:
    layout: fr
  ssh:
    install-server: true
    allow-pw: true
    disable_root: true
    ssh_quiet_keygen: true
    allow_public_ssh_keys: true
  packages:
    - qemu-guest-agent
    - sudo
  storage:
    layout:
      name: direct
    swap:
      size: 0
  user-data:
    package_upgrade: false
    timezone: Indian/Reunion
    users:
      - name: admin
        groups: [adm, sudo]
        lock-passwd: false
        sudo: ALL=(ALL) NOPASSWD:ALL
        shell: /bin/bash
        ssh_authorized_keys:
           - ssh-public-key

Création du template : le moment de vérité !

Vérification de la configuration

Avant de lancer la création, j'ai vérifié que tout était bien configuré :

cd ubuntu-server-noble/
packer validate -var-file='../credentials.pkr.hcl' ./ubuntu-server-noble.pkr.hcl

Si vous voyez "The configuration is valid", c'est parfait !

Lancement de la création

J'ai lancé la création avec cette commande :

packer build -var-file='../credentials.pkr.hcl' ./ubuntu-server-noble.pkr.hcl

Cette commande va :

  1. Télécharger l'ISO d'Ubuntu
  2. L'envoyer sur mon serveur Proxmox
  3. Démarrer une nouvelle VM
  4. La configurer automatiquement via SSH
  5. La transformer en template

Le résultat

Et voilà le résultat :

Mon template est bien là dans Proxmox

Mon template créé

Avec exactement les spécifications que je voulais

Maintenant, je peux créer autant de VM que je veux à partir de ce template, toutes configurées exactement comme je le souhaite. C'est ça la puissance de l'automatisation !