Page cover

Terraform + Proxmox

Déploiement de VMs sur proxmox avec terraform à partir d'un template CloudInit

Cette doc permet le déploiement automatisé de machines virtuelles (VM) sur un cluster Proxmox VE à l’aide de Terraform et du provider bpg/proxmoxarrow-up-right. Bonus : Petite configuration Ansible

Prérequis

  • Un serveur Proxmox VE en version 8.x

  • Une machine Linux avec Terraform (>= 1.5) ou OpenTofu (>= 1.6) installé

  • Un utilisateur dédié sur Proxmox avec un API Token configuré

  • Un templaye de vm

  • Les accès SSH configurés si nécessaire pour la provision des VM

Création du rôle et de l'utilisateur Proxmox pour Terraform (via CLI)

Docs officielle : https://registry.terraform.io/providers/bpg/proxmox/latest/docs#api-token-authenticationarrow-up-right

Créer un rôle Terraform avec les droits nécessaires

pveum role add TerraformProv -privs "Datastore.AllocateSpace Datastore.AllocateTemplate Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt SDN.Use"

Ce rôle regroupe toutes les permissions recommandées pour piloter des VM, disques, réseaux, cloud-init, migration, etc.

Créer l'utilisateur Terraform

pveum user add terraform-prov@pve --password <votre_mot_de_passe>

Remplacer <votre_mot_de_passe> par un mot de passe fort.

Associer le rôle à l'utilisateur sur tout le cluster

circle-check

Créer un token API pour l’utilisateur

circle-check

Génération du Token API

Créer un token API pour l’utilisateur (ici nommé terraform) et accorder les roles necessaire au token :

triangle-exclamation

Configuration des variables d’environnement

Ajouter ces variables à votre shell avant d’utiliser Terraform  :

circle-exclamation

Création du template cloudinit:

  • ID : 9000

  • nom de la VM : debian-cloudinit

  • RAM : 2Go

  • Interface réseau : vmbr1

✅1. Télécharger une ISO Debian Cloud-Init Ready

Utiliser une ISO minimale, par exemple via netinst, ou directement une image cloud-init-ready comme :

✅ 2. Créer une VM dans Proxmox (sans ISO) en CLI

✅ 3. Importer l’image disque téléchargée

local représente le nom du Datastore. Ensuite, attacher le disque au contrôleur :

✅ 4. Ajouter le disque Cloud-Init

circle-info

Sur Proxmox, le disque Cloud-Init est un volume virtuel ajouté à une machine virtuelle pour automatiser sa configuration lors du premier démarrage. Ce disque contient les paramètres essentiels définis par l’administrateur, tels que le nom d’hôte, la configuration réseau, les utilisateurs, les mots de passe ou encore les clés SSH. Lors du boot initial, l’agent Cloud-Init présent dans l’image de la VM détecte ce disque et applique automatiquement toutes les configurations fournies, ce qui permet de déployer rapidement et de façon standardisée des machines virtuelles personnalisées sans intervention manuelle répétitive. Cette méthode est particulièrement utile pour le clonage de templates, le déploiement en masse ou l’intégration à des infrastructures cloud, car elle garantit que chaque VM démarre avec les bons paramètres dès la première utilisation.

✅ 5. Configurer le boot & autres options

✅ 6. Convertir en template

🔁 Ensuite dans Terraform

On pourra directement l’utiliser comme vm_id = 9000 dans ta config clone.

🧼 Bonus : nettoyage au besoin

Création d'une clé ssh

Cette clé ssh sera déployée sur les vms qu'on créera

Cela génèrera deux fichiers :

  • id_rsa → Clé privée (à garder secrète).

  • id_rsa.pub → Clé publique (à injecter dans les VMs).

Place la clé publique dans le dossier Terraform : Le fichier id_rsa.pub doit se trouver dans le dossier contenant ton projet Terraform.

Création des fichiers de configs terraform

proxmox-bpg-terraform/ ├── README.md ├── main.tf ├── data.tf ├── variables.tf ├── outputs.tf ├── vm.tf Tout ça est disponible sur mon repo Githubarrow-up-right

main.tf

circle-check

data.tf

circle-check
  • local_file est un data source qui lit le contenu d’un fichier local.

  • trimspace(...) est utilisé ensuite dans le vm.tf pour s'assurer qu'aucun saut de ligne inutile ne soit injecté dans le cloud-init.

circle-exclamation

variables.tf

circle-check
circle-check
triangle-exclamation

outputs.tf

circle-check

vm.tf

circle-check

Dans Terraform, le mot de passe fourni à user_account doit être hashé .

  • Génération du mot de passe chiffré

  • Exemple de résultat

Le mot de passe haché est à utiliser dans :

circle-info

Avec keys = [trimspace(data.local_file.ssh_public_key.content)] qui représente la clé public récupéré en data source dans data.tf et username le nom d'utilisateur des vms qui seront déployés

Le fichier vm.tf devrait ressembler à ca

circle-check

Déploiement

  • terraform init → Prépare l’environnement

  • terraform fmt → Formate le code

  • terraform validate → Vérifie la validité de la configuration

  • terraform plan → Prévisualise les changements

  • terraform apply → Applique les changements sur l’infrastructure

Pour ajouter de nouvelles VMs à défaut de modifier le fichier variables.tf :

Une fois les Vms créées on peut leur appliquer des configs spécifiques avec ansible. ICI

Last updated