Pour des raisons de sécurité (principe de moindre privilège), il n’est pas souhaitable d’utiliser avec Terraform le compte root@pam de notre Proxmox VE mais un utilisateur terraform-prov@pve à qui nous allons attribuer un rôle plus limité mais suffisant pour administrer des conteneurs LXC.

Utilisateur Proxmox VE pour déploiement via Terraform

Nous allons créer dans Proxmox VE un utilisateur nommé terraform-prov@pve qui aura un rôle TerraformRole avec des permissions adaptées à Terraform.

Pour cela je me suis appuyé de l’excellent site https://blog.stephane-robert.info/docs/virtualiser/type1/proxmox/terraform/

Création du rôle TerraformRole

root@opti-7010:~# pveum role add TerraformProv -privs "Datastore.Allocate Datastore.AllocateSpace 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.Console VM.Migrate VM.Monitor VM.PowerMgmt SDN.Use"

Création de l’utilisateur terraform-prov@pve

root@opti-7010:~# pveum user add terraform-prov@pve
root@opti-7010:~# pveum passwd terraform-prov@pve
Enter new password: **********
Retype new password: **********
root@opti-7010:~#pveum passwd

Attribution du rôle TerraformRole à l’utilisateur PVE terraform-prov@pve

root@opti-7010:~# pveum aclmod / -user terraform-prov@pve -role TerraformProv

Génération d’un token

Nous n’utiliserons pas directement dans Terraform le login et le mot de passe de l’utilisateur terraform-prov@pve mais un jeton d’API (token) que nous allons créer ainsi.

root@opti-7010:~# pveum user token add terraform-prov@pve terraform -expire 0 -privsep 0 -comment "Terraform token"

On obtient alors le token demandé qui nous servira pour provisionner via Terraform sous la forme

┌──────────────┬──────────────────────────────────────────────────────────┐
│ key          │ value                                                    │
╞══════════════╪══════════════════════════════════════════════════════════╡
│ full-tokenid │ terraform-prov@pve!terraform                             │
├──────────────┼──────────────────────────────────────────────────────────┤
│ info         │ {"comment":"Terraform token","expire":"0","privsep":"0"} │
├──────────────┼──────────────────────────────────────────────────────────┤
│ value        │ 69ffadcc-9eb8-4735-ba92-8f55f59698d4                     │
└──────────────┴──────────────────────────────────────────────────────────┘

Vérifications

Dans l’interface web de Proxmox VE, déconnectez vous. Effectuez les vérifications suivantes avant d’aller plus loin :

  • tentez de vous connecter avec terraform-prov (Royaume : Proxmox VE authentification server) à l’interface web de Proxmox VE
  • tentez de créer un nouveau conteneur via l’interface graphique

Si l’ensemble de ces vérifications vous permettent d’obtenir un résultat positif, nous allons pouvoir envisager le déploiement de conteneur via Terraform.

Retour sur la machine de déploiement

Retournons maintenant sur la machine de déploiement

> ssh deployer@192.168.1.83
Enter passphrase for key 'C:\Users\Admin/.ssh/id_ed25519':
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.12-2-pve x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro
Last login: Tue Oct 22 13:18:54 2024 from 192.168.1.51
deployer@ubuntu-deploy:~$

(ou avec Visual Studio Code comme montré précédemment)

Création d’un répertoire pour le projet

Créons un dossier pour notre projet

deployer@ubuntu-deploy:~$ mkdir homelab_julia_pve_tf_ansible
deployer@ubuntu-deploy:~$ cd homelab_julia_pve_tf_ansible/
deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$

Nous allons d’abord créer une variable d’environnement TF_VAR_api_token qui contient le nom d’utilisateur et le token précédemment obtenu. Cette variable d’environnement sera automatiquement chargée à l’aide d’un outil nomme Direnv.

Pour cela il faut mettre dans un fichier .envrc dans notre répertoire de projet homelab_julia_pve_tf_ansible le contenu suivant

export TF_VAR_api_token='terraform-prov@pve!terraform=69ffadcc-9eb8-4735-ba92-8f55f59698d4'

(à adapter avec VOTRE token)

Direnv va permettre que notre interpréteur Bash ait le comportement suivant :

  • Lorsqu’on rentre dans le répertoire dans lequel le fichier .envrc est présent cela charge la / les variables d’environnement
  • Lorsqu’on sort du répertoire dans lequel le fichier .envrc est présent cela décharge la / les variables d’environnement

Installation de Direnv

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ asdf plugin add direnv
deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ asdf install direnv latest
deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ asdf global direnv latest
updating plugin repository...HEAD is now at 00af419 feat: adding plugin for avalanchego (#1058)
∗ Downloading and installing direnv...
The installation was successful!
deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ direnv
direnv v2.35.0

Il faut ajouter un hook dans ~/.bashrc permettant le charger / décharger le fichier .envrc pour cela il suffit d’ajouter la commande suivante à la fin de ~/.bashrc

eval "$(direnv hook bash)" # Remplacez 'bash' par 'zsh' ou 'fish' si nécessaire

et faire bien entendu une relecture du fichier .bashrc

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ source ~/.bashrc

Vérification du fonctionnement de Direnv

On doit absolument autoriser Direnv à charger le fichier .envrc présent dans notre répertoire de projet à l’aide de

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ direnv allow .

cela affiche

direnv: loading ~/homelab_julia_pve_tf_ansible/.envrc
direnv: export +TF_VAR_api_token

qui signifie que le contenu de .envrc est bien lu et mis dans la variable d’environnement TF_VAR_api_token.

On peut vérifier que lorsque l’on sort du répertoire la variable est bien déchargée.

deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$ cd ..
direnv: unloading

et que lorsque l’on réentre dans le répertoire du projet, elle est à nouveau chargée.

deployer@ubuntu-deploy:~$ cd homelab_julia_pve_tf_ansible/
direnv: loading ~/homelab_julia_pve_tf_ansible/.envrc
direnv: export +TF_VAR_api_token
deployer@ubuntu-deploy:~/homelab_julia_pve_tf_ansible$

proxmoxveterraform