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

Introduction
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.
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.
Prérequis
- 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.
- Privilégiez l’utilisation de tokens à celle de mots de passe.
- Ne jamais utiliser
rootpour les automatisations. - Stockez les informations sensibles dans des variables d’environnement.
Configuration de Proxmox
Créons un utilisateur avec des permissions minimales dans le realm pve pour interfacer avec Packer sans permettre un accès SSH direct.
Étape 1 : Création d’un utilisateur pour packer
pveum useradd packer@pve -password PASSWORDÉtape 2 : Création d’un token API
pveum user token add packer@pve packer --comment "Packer API Token"Pour plus d’information sur les tokens, voir ici.
Étape 3 : Création d’un rôle personnalisé
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.
Étape 4 : Attribution du rôle à l’utilisateur et au token
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’utilisateurpacker@pve.
pveum aclmod / -user packer@pve -role Packer- Cette commande attribue le rôle
Packerau tokenpacker@pve!packer.
pveum aclmod / --roles Packer --token 'packer@pve!packer' --propagate 1Structure des fichiers Packer
Voici l’organisation des fichiers nécessaires :
$ tree
.
├── kickstart_files
│ └── ks.cfg
├── proxmox-rocky.pkr.hcl
└── variables.pkrvar.hclContenu des fichiers
Fichier Kickstart (ks.cfg)
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 :
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
%endVariables pour Packer (variables.pkrvar.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"Variables sensibles (environnement)
Nous allons utiliser ici les informations du token que nous avons créé précédemment.
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"~/.bashrc pour les rendre permanentes.Fichier Packer (proxmox-rocky.pkr.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'"
]
}
}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é.Exécution
Initialisation
Initialisez Packer pour installer les plugins nécessaires :
packer init proxmox-rocky.pkr.hclValidation
Validez la configuration avant l’exécution :
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.hclCréation du Template
Lancez la création avec :
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.hclConclusion
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.