Ce document contient les livrables issus de la mise en place du service
OpenTofu. L’objectif est de pouvoir exécuter duOpenTofusur un serveur dédié. On pourrait tout à fait se passer d’un serveur spécifique pour cet usage et utiliser directement la machine d’administraitonadmin-core.
1. Création de la VM
Nous allons utiliser le template debian12-template créé lors du chapitre 4. Sur Proxmox on crée un clone complet à partir de ce template. Voici les caractéristiques de la VM :
| OS | Hostname | Adresse IP | Interface réseau | vCPU | RAM | Stockage |
|---|---|---|---|---|---|---|
| Debian 12.10 | opentofu-core | 192.168.100.246 | vmbr1 (core) | 1 | 2048 | 20Gio |
Il faut également penser à activer la sauvegarde automatique de la VM sur Proxmox en l’ajoutant au niveau de la politique de sauvegarde précédemment créée.
2. Configuration de l’OS via Ansible
Les informations concernant Ansible sont disponibles au niveau des chapitres 7 et 8.
A présent, le playbook et les rôles ayant pour objectif d’appliquer la configuration de base de l’OS sont disponibles. Il faut se connecter en tant que l’utilisateur ansible sur le serveur ansible-core.homelab puis ajouter l’hôte opentofu-core.homelab au niveau du fichier d’inventaire /opt/ansible/envs/100-core/00_inventory.yml avec les éléments suivants
opentofu-core.homelab:
ip: 192.168.100.246
hostname: opentofu-core
Il est nécessaire d’ajouter les droits sudo sur l’utilisateur ansible au niveau du fichier /etc/sudoers.d/ansible avec les éléments ci-dessous. Il s’agit d’un oubli au niveau du template. (À corriger plus tard).
ansible ALL=(ALL) NOPASSWD: ALL
Pour exécuter le playbook, il faut lancer la commande suivante
ansible-playbook -i envs/100-core/00_inventory.yml -l 'opentofu-core.homelab,' playbooks/00_config_vm.yml
Voici le récapitulatif
TASKS RECAP ***************************************************************************************************************
mardi 19 août 2025 14:43:18 +0200 (0:00:00.255) 0:00:15.570 ************
===============================================================================
base_packages : Installation des paquets de base ------------------------------------------------------------------- 3.40s
dns_config : Autoremove et purge ----------------------------------------------------------------------------------- 2.38s
dns_config : Installation du paquet systemd-resolved --------------------------------------------------------------- 2.07s
base_packages : Mise à jour du cache apt --------------------------------------------------------------------------- 1.78s
Gathering Facts ---------------------------------------------------------------------------------------------------- 1.06s
motd : Déploiement du motd ----------------------------------------------------------------------------------------- 0.46s
hostname_config : Modification du hostname ------------------------------------------------------------------------- 0.46s
dns_config : Enable du daemon systemd-resolved --------------------------------------------------------------------- 0.39s
nftables : Activer et démarrer le service nftables ----------------------------------------------------------------- 0.39s
dns_config : Suppression du paquet resolvconf ---------------------------------------------------------------------- 0.38s
nftables : Déploiement de la configuration de nftables ------------------------------------------------------------- 0.31s
dns_config : Resart du daemon systemd-resolved --------------------------------------------------------------------- 0.30s
security_ssh : Restart du daemon sshd ------------------------------------------------------------------------------ 0.26s
nftables : Valider la configuration nftables ----------------------------------------------------------------------- 0.21s
hostname_config : Modification du fichier /etc/hosts --------------------------------------------------------------- 0.20s
ipv6_disable : Désactivation de la prise en charge de l'IPv6 globalement ------------------------------------------- 0.20s
dns_config : Suppression du fichier /etc/resolv.conf --------------------------------------------------------------- 0.19s
dns_config : Configuration du DNS dans /etc/resolved.conf ---------------------------------------------------------- 0.19s
ipv6_disable : Désactivation de la prise en charge de l'IPv6 par défaut -------------------------------------------- 0.14s
dns_config : Création du nouveau lien symbolique vers /etc/resolv.conf --------------------------------------------- 0.14s
3. Installation et configuration de OpenTofu
Mise à jour du cache apt
sudo apt update
Installation des package en prérequis
sudo apt install -y apt-transport-https ca-certificates curl gnupg
Ajout des dépôts de OpenTofu
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://get.opentofu.org/opentofu.gpg | sudo tee /etc/apt/keyrings/opentofu.gpg >/dev/null
curl -fsSL https://packages.opentofu.org/opentofu/tofu/gpgkey | sudo gpg --no-tty --batch --dearmor -o /etc/apt/keyrings/opentofu-repo.gpg >/dev/null
sudo chmod a+r /etc/apt/keyrings/opentofu.gpg /etc/apt/keyrings/opentofu-repo.gpg
Ajout du dépôt dans la source list apt
echo \
"deb [signed-by=/etc/apt/keyrings/opentofu.gpg,/etc/apt/keyrings/opentofu-repo.gpg] https://packages.opentofu.org/opentofu/tofu/any/ any main
deb-src [signed-by=/etc/apt/keyrings/opentofu.gpg,/etc/apt/keyrings/opentofu-repo.gpg] https://packages.opentofu.org/opentofu/tofu/any/ any main" | \
sudo tee /etc/apt/sources.list.d/opentofu.list > /dev/null
sudo chmod a+r /etc/apt/sources.list.d/opentofu.list
Mise à jour du cache apt
sudo apt update
Installation du paquet tofu
sudo apt install -y tofu
Vérification de l’installation et de la version
tofu --version
OpenTofu v1.10.5
on linux_amd64
4. Lien avec Proxmox VE
Afin de pouvoir interagir avec notre Proxmox VE, un compte utilisateur est nécessaire. La bonne pratique est de créer un compte utilisateur dédié, basé sur le principe du moindre privilège avec un token.
Les commandes ci-dessous sont à exécutées en tant que root sur le node
pveProxmox VE
Création de l’utilisateur opentofu-deploy
pveum useradd opentofu-deploy@pve --password "MyPassword"
Création du token opentofu-token associé à l’utilisateur opentofu-deploy. On veille à le conserver dans notre coffre fort.
pveum user token add opentofu-deploy@pve opentofu-token --comment "Token OpenTofu" --privsep
Création du rôle Opentofu-role dans lequel on applique les droits nécessaires
pveum roleadd Opentofu-role -privs "VM.Allocate,VM.Audit,VM.Config.CDROM,VM.Config.Disk,VM.Config.Memory,VM.Config.CPU,VM.Config.Network,VM.Config.Options,VM.Monitor,VM.clone,VM.PowerMgmt"
Rattachement de l’utilisateur opentofu-deploy au rôle Opentofu-role
pveum aclmod / -user opentofu-deploy@pve -role Opentofu-role
Les commandes ci-dessous sont à exécutées sur le serveur
opentofu-core
Création du répertoire dédiée pour Opentofu
mkdir -p /opt/opentofu
Initialiser le dépôt Git
git init
Création du fichier .gitignore avec les éléments ci-dessous
*.tfstate
*.tfstate.backup
*.tfvars
.terraform/
variables.tf
Création du fichier de configuration du provider /opt/opentofu/provider.tf
terraform {
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "0.85.1"
}
}
}
provider "proxmox" {
endpoint = "https://pve.ng-hl.com:8006/"
api_token = var.api_token
insecure = false
}
Création du fichier contenant les variables /opt/opentofu/variables.tf. Il est également possible de saisir la valeur du token via une variable d’environnement, cela évite d’avoir un token en clair directement dans un fichier.
variable "api_token" {
description = "Token to connect Proxmox API"
type = string
value = "XXXXXXXXXXXXX"
}
Positionnement au niveau du répertoire du projet et initialisation de Opentofu
tofu init
Tester la communication avec l’instance Proxmox
tofu plan
No changes. Your infrastructure matches the configuration.
OpenTofu has compared your real infrastructure against your configuration and found no differences, so no changes
are needed.
5. Déploiement et destruction d’une ressource
Création du fichier principal /opt/opentofu/main.tf. L’objectif est de déployer une VM de test à partir du template debian12-template