Créer un Template Rocky Linux 8 avec Packer sur Proxmox

Avec l’acquisition de VMware par Broadcom et les changements de politique de licence qui en découlent, il peut être stratégique de réévaluer vos choix technologiques. Dans ce contexte, j’ai migré mon infrastructure de VMware vers Proxmox, une alternative open source robuste pour la virtualisation. Cette migration a été l’occasion d’automatiser entièrement le déploiement et la gestion des machines virtuelles.

Dans ce tutoriel, vous apprendrez à créer un template Rocky Linux 8 en utilisant Packer. Ce template pourra servir de base pour déployer des machines virtuelles via Terraform et être personnalisé avec Ansible.

Info
Bien que Proxmox soit une solution open source remarquable, investir dans une licence support est essentiel en production. Cela garantit une assistance rapide pour éviter les blocages critiques et contribue au financement du développement et à la pérennité de l’outil.

Packer est un outil puissant pour créer des images machines reproductibles. Voici ses principaux avantages :

  • Gain de temps : Une fois configuré, Packer permet de recréer un template en quelques commandes.
  • Standardisation : Garantit des configurations homogènes sur toutes vos machines.
  • Intégration facile : Compatible avec Terraform pour un déploiement rapide.

Dans ce tutoriel, nous créerons un template Rocky Linux 8 prêt à l’emploi.


  • Proxmox : Une instance fonctionnelle.
  • Rocky Linux 8 ISO : Disponible dans votre stockage Proxmox.
  • Packer : Installé sur votre machine locale.
  • Kickstart : Un fichier pour automatiser l’installation de Rocky Linux.
  • Utilisateur API Proxmox : Avec un token pour accéder aux ressources via l’API.
  • Accès Internet : Requis pour l’installation de paquets comme qemu-guest-agent.
Sécurité
  • Privilégiez l’utilisation de tokens à celle de mots de passe.
  • Ne jamais utiliser root pour les automatisations.
  • Stockez les informations sensibles dans des variables d’environnement.

Créons un utilisateur avec des permissions minimales dans le realm pve pour interfacer avec Packer sans permettre un accès SSH direct.

bash

pveum useradd packer@pve -password PASSWORD

bash

pveum user token add packer@pve packer --comment "Packer API Token"

Pour plus d’information sur les tokens, voir ici.

bash

pveum roleadd Packer -privs "VM.Config.Disk VM.Config.CPU VM.Config.Memory Datastore.AllocateSpace Sys.Modify VM.Config.Options VM.Allocate VM.Audit VM.Console VM.Config.CDROM VM.Config.Network VM.PowerMgmt VM.Config.HWType VM.Monitor Datastore.Allocate Datastore.AllocateTemplate Datastore.Audit SDN.Use"

Pour plus d’information sur les permissions, voir ici.

Pour permettre à packer@pve et à son token de disposer des permissions nécessaires, exécutez les commandes suivantes :

  • Cette commande attribue le rôle Packer à l’utilisateur packer@pve.

bash

pveum aclmod / -user packer@pve -role Packer
  • Cette commande attribue le rôle Packer au token packer@pve!packer.

bash

pveum aclmod / --roles Packer --token 'packer@pve!packer' --propagate 1

Voici l’organisation des fichiers nécessaires :

plaintext

$ tree
.
├── kickstart_files
│   └── ks.cfg
├── proxmox-rocky.pkr.hcl
└── variables.pkrvar.hcl

Le fichier kickstart_files/ks.cfg contient les instructions pour automatiser l’installation de Rocky Linux 8. Il répond à toutes les questions posées lors d’une installation classique d’un système d’exploitation basé sur Red Hat.

Si vous disposez d’un compte Red Hat Customer Portal avec un abonnement actif, vous pouvez utiliser leur outil en ligne pour générer ce fichier. Sinon, référez-vous à la documentation officielle pour le créer manuellement.

Voici un exemple que vous pourrez personnaliser selon vos besoins :

plaintext

text
cdrom
lang en_US.UTF-8
keyboard us
timezone UTC
rootpw --iscrypted \$6\$abcdefgh\$encryptedpassword
network --onboot=yes --bootproto=dhcp
zerombr
autopart --type=lvm
selinux --enforcing
firewall --enabled --service=ssh
reboot
%packages
@^minimal-environment
%end

%post --log=/var/log/ks-post.log

# Le package qemu-guest-agent est indispensable pour permettre à Packer de se connecter en SSH et finaliser l'installation.
dnf install -y qemu-guest-agent
systemctl enable qemu-guest-agent
systemctl start qemu-guest-agent
%end

hcl

iso_file            = "local:iso/Rocky-8.10-x86_64-minimal.iso"
vm_id               = 101
vm_name             = "rocky-linux-template"
storage_pool        = "local"
network_bridge      = "vmbr0"

Nous allons utiliser ici les informations du token que nous avons créé précédemment.

bash

export PROXMOX_URL="https://proxmox.example.com:8006/api2/json"
export PROXMOX_NODE="proxmox-node"
export PROXMOX_TOKEN_ID='packer@pam!Packer'
export PROXMOX_TOKEN_SECRET="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
Persistance
Ajoutez ces commandes à votre fichier ~/.bashrc pour les rendre permanentes.

hcl

# Rocky Linux 8
# ---
# Packer Template to create an Rocky Linux on Proxmox

packer {
  required_plugins {
    proxmox = {
      version = ">= 1.2.2"
      source  = "github.com/hashicorp/proxmox"
    }
  }
}

# Variable Definitions
variable "proxmox_url" { type = string }
variable "proxmox_node" { type = string }
variable "proxmox_token_id" { type = string }
variable "proxmox_token_secret" { type = string }
variable "iso_file" { type = string }
variable "vm_id" { type = number }
variable "vm_name" { type = string }
variable "storage_pool" { type = string }
variable "network_bridge" { type = string }

# Resource Definition for the VM Template
source "proxmox-iso" "rocky" {

  proxmox_url               = var.proxmox_url
  username                  = var.proxmox_token_id
  token                     = var.proxmox_token_secret
  insecure_skip_tls_verify  = true

  node                      = var.proxmox_node

  boot_iso {
    type     = "ide"
    iso_file = var.iso_file
    unmount  = true
  }

  disks {
    disk_size    = "20G"
    storage_pool = var.storage_pool
    type         = "virtio"
  }

  network_adapters {
    bridge = var.network_bridge
    model  = "virtio"
  }

  ssh_username = "root"
  ssh_password = "password"
  ssh_timeout  = "10m"

  boot_command = [
    "<up><tab> text inst.ks=hd:sr1:/ks.cfg<enter><wait><enter>"
  ]
  boot_wait    = "10s"

  qemu_agent   = true
}

build {
  name    = "rocky-linux-template"
  sources = ["source.proxmox-iso.rocky"]

  provisioner "shell" {
    inline = [
      "dnf install -y epel-release",
      "dnf install -y vim htop",
      "systemctl disable firewalld",
      "echo 'Customization complete'"
    ]
  }
}
Mot de passe ou clé SSH
Le mot de passe défini par ssh_password doit correspondre au mot de passe chiffré spécifié dans rootpw. À défaut, privilégiez l’utilisation d’une clé SSH avec l’option ssh_private_key_file pour renforcer la sécurité.

Initialisez Packer pour installer les plugins nécessaires :

bash

packer init proxmox-rocky.pkr.hcl

Validez la configuration avant l’exécution :

bash

packer validate -var proxmox_url="$PROXMOX_URL" -var proxmox_node="$PROXMOX_NODE=" -var proxmox_token_id="$PROXMOX_TOKEN_ID" -var proxmox_token_secret="$PROXMOX_TOKEN_SECRET" -var-file=variables.pkrvar.hcl proxmox-rocky.pkr.hcl

Lancez la création avec :

bash

packer build -var proxmox_url="$PROXMOX_URL" -var proxmox_node="$PROXMOX_NODE=" -var proxmox_token_id="$PROXMOX_TOKEN_ID" -var proxmox_token_secret="$PROXMOX_TOKEN_SECRET" -var-file=variables.pkrvar.hcl proxmox-rocky.pkr.hcl

Avec ces étapes, vous avez un processus standardisé et reproductible pour créer des templates Proxmox, ce qui est essentiel pour maintenir une infrastructure fiable et efficace, notamment dans les environnements critiques.

Avec ce tutoriel, vous avez un processus standardisé et reproductible pour créer des templates Rocky Linux 8 sur Proxmox. Associez-le à Terraform et Ansible pour une infrastructure entièrement automatisée. N’oubliez pas de consulter la documentation officielle pour explorer toutes les possibilités offertes par Packer.