Set-OPS-Public/roles/serveur_ops/templates/LISEZ-MOI.md.j2
Daniel Allaire 665b07ba82
Some checks are pending
verifier / verifier (push) Waiting to run
serveur_ops : la difference entre une archive et une matrice
Un ecosysteme pouvait DETENIR son genome sans savoir l'executer. Le poste
d'exploitation porte Ansible epingle, le genome clone depuis SA PROPRE forge, et
une cle SSH qui n'appartient qu'a lui. Il n'emporte ni la voute ni son mot de
passe : la structure se reconstruit depuis la forge, les secrets depuis la
sauvegarde. Deux sources qu'un meme incident n'atteint pas ensemble.

Une machine neuve traverse tout le moteur sans rien heriter, et revele ce qu'un
etat anterieur masquait. Deux defauts silencieux en sont sortis.

setops_plan_dir pointait le lien `instance` en dur : neuf roles lisaient donc le
plan d'une AUTRE instance. Le plancher de patient 0 portait les FQDN de
Chezlepro, et son edge publiait server_name forge.chezlepro.internal. La
variable suit desormais l'inventaire reellement charge.

Trois instances sur quatre declaraient les SAN d'exposition de leur edge ; la
quatrieme et le modele public ne les avaient pas. La forge de patient 0 etait
donc publiee derriere le certificat auto-signe de Debian, sans que rien ne le
signale -- `git clone` fut le premier a refuser, a juste titre. P42 le reclame
maintenant pour tout ecosysteme qui declare un edge.

Le harnais a ecrit la moitie de ce role : 5 echecs sur la piece neuve, aucun
n'empechait le code de tourner, tous la rendaient invisible a la carte, au
graphe et au lecteur. 42 preuves, 0 echec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 11:58:10 -04:00

58 lines
2.5 KiB
Django/Jinja

# Poste d'exploitation de {{ organisation | default('cet écosystème') }}
> Fichier **généré** par le rôle `serveur_ops`. Ne pas éditer à la main.
Cette machine sait reconstruire l'écosystème. Elle porte le moteur Set-OPS, le plan, et
un Ansible épinglé sur la même famille que celle qui a servi à le construire.
## Ce qu'elle contient
```text
{{ serveur_ops_racine }}/
{% for d in serveur_ops_depots %}
{{ "%-22s" | format(d.dest) }} {{ d.role }} — cloné depuis {{ serveur_ops_forge_url }}/{{ serveur_ops_forge_organisation }}/{{ d.depot }}.git
{% endfor %}
venv/ Ansible {{ serveur_ops_ansible }}
.ssh/id_{{ serveur_ops_cle_type }} la clé propre au poste
```
Le génome vient de **la forge de cet écosystème**, pas de son parent. Ces dépôts y sont
des miroirs, resynchronisés automatiquement : le poste lit donc une copie vivante.
## S'en servir
```bash
sudo -iu {{ serveur_ops_utilisateur }}
cd {{ serveur_ops_racine }}/{{ (serveur_ops_depots | selectattr('role', 'eq', 'moteur') | first).dest }}
export PATH={{ serveur_ops_venv }}/bin:$PATH
export ANSIBLE_COLLECTIONS_PATH={{ serveur_ops_racine }}/.ansible/collections
make aide
```
L'instance pilotée est désignée par le lien `instance` → actuellement
`{{ serveur_ops_instance }}`. On la bascule comme sur n'importe quel poste Set-OPS.
## Les deux choses qu'il n'a PAS, et pourquoi
**Le mot de passe de la voûte.** Il se saisit à l'exécution. Une machine qui détiendrait
à la fois le plan, l'accès SSH à toute la flotte et la clé des secrets n'aurait plus
aucune profondeur : la compromettre, ce serait compromettre l'écosystème entier. Le mot
de passe reste dans une tête, ou dans un coffre hors de cette machine.
**Le fichier de voûte lui-même.** Les dépôts d'instance excluent `vault.yml` de git —
c'est la règle « aucun secret en clair ». Le génome cloné ici porte donc le plan **sans
les secrets**. Pour un déploiement réel, la voûte se restaure depuis la sauvegarde
(`restic`), pas depuis la forge.
Autrement dit : ce poste reproduit la **structure** de l'écosystème de mémoire, et ses
**secrets** depuis la sauvegarde. Deux sources distinctes, et c'est voulu.
## Sa clé doit être autorisée
Le poste s'est fabriqué sa propre paire SSH, distincte de celle du mainteneur — deux
exploitants, deux révocations possibles. Tant que sa clé publique n'est pas dans les
intrants SSH du plan, il ne joint aucun hôte. La clé publique :
```bash
cat {{ serveur_ops_racine }}/.ssh/id_{{ serveur_ops_cle_type }}.pub
```