Set-OPS-Public/roles/serveur_ops_tenant/defaults/main.yml
Daniel Allaire be06def899 armement : le runner retrouve son identite SSH depuis la voute
Le runner fabriquait sa paire a sa naissance : reconstruit, il avait une identite que la
flotte ne connaissait pas (refuse sur les 13 machines de Technolibre). La cle privee vit
dans la voute du locataire ; serveur_ops_tenant la remet et exige que sa cle publique soit
declaree au plan (garde eprouvee en defaut).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 00:23:49 -04:00

104 lines
5.9 KiB
YAML

---
# LE RUNNER D'UN TENANT — celui qui CONFIGURE.
#
# Le travail d'un runner se divise en trois portées, et chacune a son rôle :
#
# calculer plan -> inventaire aucune voûte `serveur_ops`
# configurer rôles sur ses machines voûte du TENANT CE RÔLE
# matérialiser créer/détruire des VM voûte du SITE `serveur_ops_site`
#
# CE QUI MANQUAIT (2026-08-26). La portée « configurer » était attribuée à `serveur_ops`
# dans la doctrine — mais rien ne déposait jamais la voûte du tenant sur son runner. Un
# runner pouvait donc dériver son inventaire et ne rien pouvoir en faire : chaque rôle qui
# demande un secret échouait sur son assertion, et l'échec ne disait pas qu'il manquait un
# FICHIER, seulement que les valeurs étaient vides.
#
# Découvert en préparant la reconstruction de Chezlepro : le runner du SITE peut
# matérialiser ses quinze machines, mais ne peut pas les configurer — Chezlepro a sa
# PROPRE autorité de certification, donc `client_pki` y réclame un secret de Chezlepro.
# Le runner du site ne l'a pas, et ne doit pas l'avoir : c'est la ligne qui rend
# l'hébergement mutualisé défendable.
#
# POURQUOI UN RÔLE À PART, et non une option de `serveur_ops`. Donner sa voûte à un runner
# est un POUVOIR, pas un réglage. Le déclarer explicitement au plan force à répondre à la
# question « cette machine a-t-elle le droit de configurer cet écosystème ? » — alors
# qu'une option activée par défaut y répondrait à notre place. C'est le même patron que
# `serveur_artefacts` + `serveur_cache_site` : un installateur, puis un marqueur qui
# ajoute un pouvoir.
#
# QUI PEUT LE DÉCLARER : l'écosystème lui-même, pour SA machine. Un runner de SITE ne le
# déclare jamais — il porte les plans des tenants en `role: tenant` précisément pour dire
# qu'il prépare leur terrain sans les piloter.
serveur_ops_tenant_utilisateur: "setops"
serveur_ops_tenant_racine: "/opt/setops"
# Le dossier du dépôt de CET écosystème chez le runner, cloné par `serveur_ops`
# (entrée `role: instance` de `serveur_ops_depots`). Par défaut : celui que le lien
# `instance` désigne déjà — le pilote et sa voûte ne peuvent pas viser deux écosystèmes.
serveur_ops_tenant_depot: "{{ serveur_ops_instance | default('') }}"
# --- LA VOÛTE DU TENANT ------------------------------------------------------
#
# Déposée CHIFFRÉE, jamais en clair. Le mot de passe n'est pas stocké : l'exploitant le
# tape au moment d'agir.
#
# `decrypt: false` EST OBLIGATOIRE sur la copie. Sans lui, Ansible DÉCHIFFRE la source
# quand il détient le mot de passe — mesuré le 2026-08-24 sur la voûte du site, 776 octets
# en clair au lieu de 3465 chiffrés, sur une machine où ils n'avaient rien à faire.
serveur_ops_tenant_voute_source: ""
serveur_ops_tenant_voute_deposer: true
# LE DOSSIER D'INVENTAIRE SE DÉCOUVRE, il ne s'écrit pas. Le dépôt en connaît deux noms
# — `principal` et `production` — et l'ordre de préférence est celui de
# `inventory_rules.dossier_inventaire`. Écrire le nom en dur ici le ferait mentir pour
# l'écosystème qui emploie l'autre.
serveur_ops_tenant_inventaires_connus:
- principal
- production
# --- ARMER LE RUNNER : LA CLE DE SA VOUTE ------------------------------------
#
# UN RUNNER MAITRE DE SA VOUTE (decision de l'exploitant, 2026-08-28). Deposer le chiffre
# sans la cle laisse un runner qui calcule son inventaire et ne peut rien en faire : chaque
# role reclamant un secret echoue sur son assertion, et l'echec ne dit pas qu'il manque un
# FICHIER — seulement que les valeurs sont vides.
#
# `false` PAR DEFAUT, ET CE N'EST PAS DE LA PRUDENCE DECORATIVE. Armer est un ACTE, pas un
# reglage : c'est le moment ou un humain remet la cle, et c'est le seul geste que la
# reproduction exige de lui (cf. docs/filiation-emancipation.md). Un defaut a `true`
# armerait des machines sans que personne ne l'ait decide.
#
# LA SOURCE EST UN POINTEUR, JAMAIS UNE VALEUR : le chemin du fichier de mot de passe sur
# le poste de l'exploitant. Il ne vit dans aucun depot, et rien ici n'en lit le contenu.
#
# DESTINATION : `<racine>/.config/setops-vault-<depot-en-minuscules>`, la meme convention
# que `scripts/voutes.py` — le runner derive donc sa propre liste d'identites sans qu'on
# ait a la lui ecrire. Hors de tout depot git, en 0600.
serveur_ops_tenant_cle_deposer: false
serveur_ops_tenant_cle_source: ""
serveur_ops_tenant_cle_destination: >-
{{ serveur_ops_tenant_racine }}/.config/setops-vault-{{ serveur_ops_tenant_depot | lower }}
# --- Sonde de supervision -----------------------------------------------------------
# Le chemin ou le RUNNER lit la voute de son ecosysteme.
# LE DEPOT VIENT DU ROLE, PAS D'UNE SUPPOSITION : `serveur_ops_tenant_depot` designe
# deja le dossier clone sur le runner.
serveur_ops_tenant_sonde_depot: "{{ serveur_ops_tenant_depot }}"
serveur_ops_tenant_sonde_voute: >-
/opt/setops/{{ serveur_ops_tenant_sonde_depot }}/inventories/principal/group_vars/all/vault.yml
# --- L'IDENTITE SSH DU RUNNER, CONSERVEE DANS LA VOUTE (2026-09-30) ------------------------
#
# Le runner fabriquait sa paire de cles a sa naissance (`serveur_ops`). Chaque reconstruction
# de sa VM lui donnait donc une identite NEUVE, que le plan ne connaissait pas : les machines
# du locataire, clonees avec la cle DECLAREE (`ssh_baseline_cles_admin`), le refusaient
# toutes — « Permission denied (publickey) » sur les treize, a la reconstruction de
# Technolibre du 2026-09-30. Chez Chezlepro, la cle declaree etait deja celle d'un runner
# disparu.
#
# La cle privee vit donc dans la voute du locataire ; l'armement — le geste de l'humain —
# la remet au runner neuf, qui retrouve l'identite que la flotte attend. Vide = le runner
# garde la paire qu'il s'est fabriquee (et l'armement le dit).
serveur_ops_tenant_ssh_cle: "{{ vault_runner_cle_ssh | default('') }}"
serveur_ops_tenant_ssh_chemin: "{{ serveur_ops_tenant_racine }}/.ssh/id_ed25519"