Workspaces
Fonctionnalité en préparation. Cette page décrit l'interface cible pour recueillir vos retours ; rien n'est encore utilisable.
L'exécution de modules OpenTofu est en préparation. Cette page décrit l'interface cible pour recueillir vos retours ; les manifestes ne sont pas encore acceptés.
Un Workspace déclare un module OpenTofu (publié en OCI) et ses entrées. La plateforme
l'exécute pour vous, dans votre tenant, et publie ses outputs dans un secret. Vous n'installez
ni OpenTofu, ni backend de state, ni credentials sur un poste.
Ce que ça change par rapport à tofu apply en local
| En local | Avec un Workspace |
|---|---|
| Le state est sur votre machine ou dans un bucket que vous gérez | Le state est tenu par la plateforme, verrouillé, par Workspace |
| Les credentials des providers sont dans votre environnement | Ils sont dans des secrets du tenant, injectés dans le run |
Vous relancez plan pour voir la dérive | refresh.interval la détecte et l'expose dans le status |
| Les dépendances entre racines se gèrent à la main ou avec terragrunt | dependsOn et workspaceOutputRef enchaînent les Workspaces |
Exemple
apiVersion: tofu.stackngo.io/v1alpha1
kind: Workspace
metadata:
name: network
spec:
module:
source: oci://ovh-gra-0.registry.dev.stackngo.fr/acme/ovh-network
tag: 1.4.0
providers: [{name: ovh-gra}]
vars:
cidr: 10.20.0.0/16
refresh: {interval: 30m, mode: plan}
apiVersion: tofu.stackngo.io/v1alpha1
kind: Workspace
metadata:
name: app
spec:
module:
source: oci://ovh-gra-0.registry.dev.stackngo.fr/acme/ovh-instance
digest: sha256:9f1c… # digest plutôt que tag pour une version figée
providers: [{name: ovh-gra}]
dependsOn: [{name: network}]
vars: {size: s1-2}
varsFrom:
- workspaceOutputRef: {name: network, output: subnet_id}
default: subnet-mock # permet un plan avant que network ait publié
- secretRef: {name: app-secrets, key: ssh-key}
varName: ssh_public_key
refresh: {interval: 1h, mode: apply}
approval: manual
deletionPolicy: Orphan
Entrées
module.source: une référenceoci://…, avectagoudigest(jamais les deux ; ni l'un ni l'autre =latest).pullSecretRefsi le registre exige une authentification.vars: un objet libre, écrit tel quel enterraform.tfvars.json.varsFrom: une variable alimentée par une clé de secret (secretRef), ou par un output d'un autre Workspace du tenant (workspaceOutputRef).varNamerenomme ;defaultdonne une valeur de secours pour planifier avant que le parent ait publié (jamais pour appliquer).providers: lesProviderdu tenant à utiliser, par nom.imports: adopter des ressources existantes (to= adresse dans le module,idouidFromun secret).
Sorties
Les outputs du module sont écrits dans un secret du tenant, <nom>-outputs par défaut
(spec.outputs.secretName), une clé par output. Un output non textuel est encodé en JSON.
C'est ce secret qu'un autre Workspace lit via workspaceOutputRef, et qu'une App peut
injecter en variable d'environnement.
Rafraîchissement et dérive
refresh.interval (au moins 1m) relance un run périodique :
mode: plan: détecte la dérive sans rien changer ; la conditionDriftedpasse àTrueet lestatus.lastPlancompte les ajouts, modifications et destructions.mode: apply: réapplique pour corriger la dérive.
Un run est aussi déclenché par tout changement d'entrée : spec, secret référencé, Provider, output d'un parent.
Approbation manuelle
Avec approval: manual, un plan qui contient des changements s'arrête et attend. La condition
AwaitingApproval donne l'identifiant du plan (status.lastPlan.id) ; approuvez-le depuis la console ou avec l'API. L'apply re-planifie et refuse si le résultat a changé entre-temps
(PlanChangedSinceApproval).
Un verrou de state tenu par un tiers bloque les runs (StateLocked, détenteur dans
status.lock) ; s'il est orphelin, contactez le support.
Dépendances
dependsOn impose l'ordre ; workspaceOutputRef crée en plus un lien de données. Un enfant
attend que ses parents soient Ready. Quand les outputs d'un parent changent, ses enfants
rejouent. Les cycles sont détectés (DependencyCycle). Avec deletionPolicy: Destroy, la
destruction se fait dans l'ordre inverse : un parent attend la disparition de ses enfants.
Suppression
deletionPolicy | Effet de sng kind delete Workspace app |
|---|---|
Orphan (défaut) | Le manifeste et le state sont retirés ; les ressources créées restent en place |
Destroy | tofu destroy est exécuté d'abord ; refusé s'il reste des imports, sauf autorisation explicite (prévue) |
Lire l'état
L'état d'un Workspace sera affiché par sng. Il portera lastPlan (identifiant, compteurs, hash), lastApply (date, résultat
Succeeded, Failed, Rejected, Interrupted, StateLocked), nextRunAt,
consecutiveFailures, et lock si un verrou tiers bloque.