Proxmox, création d'un template packer
Le but de mon HomeLab est d'être orienté IaC et DevSecOps, le but est donc de configurer un maximum de choses de manière automatisée. Pour cela je vais utiliser Packer, Terraform et Ansible. Dans ce guide je vais vous présenter comment automatiser la création d'un template Ubuntu sur Proxmox avec Packer.
Toute les commandes seront lancés depuis ma VM de déploiement (Deploy) c'est à partir d'elle que je vais ensuite déployer le reste de mon Home-Lab.
Installation packer et terraform
Pour installer packer et terraform voici les commandes :
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [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 terraform
On peut vérifier l'installation de packer avec la commande :
packer -v
On peut vérifier l'installation de terraform avec la commande :
terraform -v
Arborescence
Je ne suis pas fan de tout mettre dans le même fichier c'est pourquoi j'utilise l'arborescence suivante :
template-ubuntu-24.04/
├── packer
│ ├── build.pkr.hcl
│ ├── http
│ │ ├── meta-data
│ │ └── user-data
│ ├── packer.pkr.hcl
│ ├── source.pkr.hcl
│ ├── variables.auto.pkrvars.hcl
│ ├── variables.pkr.hcl
│ └── variables.pkrvars.hcl
└── terraform
├── main.tf
├── modules
│ └── vm-test
│ ├── main.tf
│ ├── terraform.tf
│ └── variables.tf
├── module.tf
├── terraform.tf
├── terraform.tfvars
└── variables.tf
Le dossier racine template-ubuntu-24.04 correspond au nom de la VM / du template. Puis on retrouve les dossier packer, ansible ou terraform suivant la technologie utilisée.
Pour packer, on retrouve les fichiers habituels build, packer, source et variables.pkr.hcl Le fichier variables.auto.pkrvars.hcl est automatiquement lu par packer lors du build et contient toute les variables non sensibles. Le fichier variables.pkvars.hcl contient les variables sensibles (token, password, etc.) Enfin le dossier http contient les fichiers nécessaires pour cloud-init.
Pour terraform, on retrouve les fichiers habituels main, terraform, module et variables.tf Le fichier terraform.tfvars contient les variables spécifique à notre projet. Le dossier modules contient les ressources que l'on veut créer séparées par modules.
Token API
Pour pouvoir utiliser packer pour communiquer avec Proxmox, il faut qu'il puisse s'y connecter. Pour cela, il est fortement recommandé d'utiliser un token dédié avec des permissions plus faibles que le compte root.
Pour créer ce token il suffit de suivre la méthode suivante :
Sur le Datacenter, je commence par créer un groupe. Cela me permettra de donner les mêmes permissions à d'autres utilisateurs si nécessaires. Mon groupe s'appel NodeAdmin. Je crée ensuite un utilisateur packer que je viens lier au groupe NodeAdmin. Pour attribuer les permissions nécessaires à packer, je rajouter dans l'onglet permissions une permission sur "/" attribuée au groupe NodeAdmin avec le rôle Administrator.
Il ne reste plus qu'à créer les tokens, pour cela dans l'onglet API Tokens, je créer un nouveau token pour le user packer que je nome deploy (le nom de la VM) et je décoche bien la case "Privilege Separation" afin que le token ai les mêmes droits que le user.
Le token devrait avoir des droits qui ressemblent à cela :
J'en profite aussi pour créer un second token pour terraform.
Template Packer
Le template packer que j'utilise est disponible ici. // TODO: Lien Github
Il utilise le plugin proxmox-iso afin de construire un template packer à partir d'un iso.
Pour l'utiliser, il suffit de le télécharger et de configurer les fichiers suivants :
variables.auto.pkrvars.hcl
Comme indiqué plus haut, ce fichier contient les variables principales du fichier de config qui permettent de configurer le template :
proxmox_url = "https://192.168.1.200:8006/api2/json"
proxmox_username = "packer@pam!deploy"
proxmox_node = "proxmox"
template_cores = 2
template_disk_size = "10G"
template_memory_size = 2048
template_default_user = "user"
template_id = 998
variables.pkrvars.hcl
Ce fichier contient les variables sensibles. Pour ma part un token et le mot de passe SSH du template
Ce fichier contient des informations sensibles. Attention à ne pas l'ajouter vos commits.
proxmox_token = ""
template_default_password = ""
Deploy
Pour valider les fichiers de configurations :
packer validate -var-file=variables.pkrvars.hcl .
Pour créer le template :
packer build -var-file=variables.pkrvars.hcl .
Si tout fonctionne, un template a du être créé sur proxmox.
Template terraform
Maintenant que le template packer est prêt je vais me servir de terraform pour déployer des VMs.
Pour cela j'utilise le provider proxmox de Telmate
Le template terraform que j'utilise est disponible ici. // TODO: Lien Github
Pour l'utiliser, il suffit de le télécharger et de configurer le fichier suivant :
terraform.tfvars
pm_api_url = "https://proxmox.home:8006/api2/json"
pm_api_token_id = ""
pm_api_token_secret = ""
vm_name = ""
vm_target_node = "proxmox"
vm_vmid = 10
vm_desc = ""
vm_onboot = true
vm_startup = ""
vm_vm_state = "running"
vm_agent = 1
vm_clone = "Template-Ubuntu-24.04"
vm_memory = 2048
vm_cores = 2
vm_size = "10G"
vm_storage = "SSD"
Le template terraform est prêt. Pour déployer une VM il suffit de copier le template, de mettre à jour le fichier terraform.tfvars puis de déployer la VM avec les commandes :
terraform plan
terraform apply