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
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$