0032 — OpenTofu pour le provisioning des VM cloud
Contexte
Section intitulée « Contexte »Le terrain cloud ARM (ADR 0031) doit créer et
détruire de vraies VM à la demande (free tier monté/démonté souvent). Les fronts
de provisioning locaux existants — Vagrant (bench/multi-node/,
bench/single-node/) et Lima (bench/lima/) — ne couvrent pas le cloud, et
provisionner des VM cloud en CLI impérative est fragile : pas d’idempotence,
pas de destroy fiable → risque de VM orphelines qui coûtent ou saturent un
quota free tier.
Or ADR 0023 pose une implémentation
impérative (Ansible/scripts) et aucune IaC déclarative n’existe dans le
dépôt (pas de .tf). Introduire un outil déclaratif à état est donc une
décision à part entière, avec deux points durs : l’entorse à l’impératif, et le
fichier d’état (qui contient des identités réelles — frontal avec la
généricité 0023).
Décision
Section intitulée « Décision »Adopter OpenTofu (fork libre de Terraform, licence MPL — cohérent avec l’esprit open source du dépôt) pour la seule couche de provisioning IaaS du terrain cloud.
-
Périmètre strictement borné. OpenTofu crée/détruit les VM (et le réseau minimal associé), rien de plus. Le bootstrap Kubernetes et le déploiement applicatif restent impératifs (Ansible/scripts, ADR 0023) : OpenTofu produit des VM Debian + SSH, un script en génère l’inventaire Ansible, et la suite est le bootstrap existant — même aboutissement que Vagrant/Lima (
write_inventory → bootstrap). Le déclaratif ne déborde pas du IaaS. -
Entorse à ADR 0023 cadrée, pas générale. L’impératif reste la règle du dépôt ; le déclaratif est une exception cantonnée au provisioning de VM cloud, là où il est l’outil juste (idempotence,
destroypropre). Aucune brique de plateforme (Ceph, Cilium, CNPG…) ne passe à l’IaC déclarative. -
tfstate: jamais versionné, jamais d’identité réelle committée. L’état contient des IDs/IPs/secrets réels → il est gitignoré et stocké sur un backend distant (chiffré) configuré en local non versionné. Le code OpenTofu versionné n’emploie que des variables ; les valeurs réelles (fournisseur, région, OCID/compte, clés) vivent dans un*.tfvars.exampleversionné générique + un*.tfvarslocal gitignoré — même patron quebootstrap/hosts.example.yaml(ADR 0023). -
Provider générique. Le code cible un fournisseur via variables ; aucun nom de fournisseur/région/instance en dur dans le versionné (terrain « cloud ARM », ADR 0031).
-
Version pinnée. OpenTofu et les providers sont épinglés (
.terraform.lock.hclcommitté + version dans la matrice ADR 0006).
Hors périmètre — le provisioning local reste Lima/Vagrant
Section intitulée « Hors périmètre — le provisioning local reste Lima/Vagrant »OpenTofu ne remplace pas Vagrant ni Lima pour les bancs locaux
(bench/single-node/, bench/multi-node/, bench/lima/). Raisons :
- Lima et Vagrant sont déjà déclaratifs (
Vagrantfile, template Lima) et jetables (vagrant destroy,limactl delete) : les emballer dans du HCL ajoute une indirection sans gagner ni idempotence nidestroy. - Le
tfstaten’a aucun sens en local — il réconcilie un état distant coûteux, absent ici. On hériterait du coût (état à gérer) sans le bénéfice. - Aucun provider OpenTofu natif pour Lima/Vagrant → on tomberait sur du
local-exec(anti-pattern) appelantlimactl/vagrant. - Porter ces bancs validés (runs consignés) en HCL = risque de régression pour zéro gain (ADR 0017 : pas de réécriture opportuniste).
Frontière nette : OpenTofu là où il y a une API et un coût (le cloud) ; les outils natifs pour le local.
Accepted (cadrage). Aucun .tf n’est encore versionné ; cet ADR autorise et
borne leur introduction. L’implémentation (code OpenTofu + *.tfvars.example +
génération d’inventaire + run consigné) fera l’objet d’un ticket dédié.
Conséquences
Section intitulée « Conséquences »- Gain : provisioning cloud idempotent avec
destroyfiable — pas de VM orpheline facturée ; le bon outil pour la couche IaaS. - Prix à payer : un 5ᵉ écosystème (après bash, Ansible, Node, Python) à installer/pinner/maintenir, pour ce seul terrain ; une exception déclarative à documenter face à l’impératif d’ADR 0023.
- Risque : fuite d’identités via un
tfstatemal géré → mitigé par gitignore + backend distant +*.tfvarslocal + revue. Un.tfou un state contenant du réel committé serait un défaut ADR 0023. - Alternative écartée : Terraform classique (licence BSL non libre) ; Pulumi (impératif, mais réintroduit un runtime langage et un service d’état). OpenTofu est le compromis libre + standard HCL.