101 lines
4.2 KiB
Markdown
101 lines
4.2 KiB
Markdown
|
|
# serveur_ops
|
||
|
|
|
||
|
|
**Poste d'exploitation** : la machine depuis laquelle l'écosystème se reconstruit
|
||
|
|
lui-même. Ansible épinglé, le génome cloné depuis **sa propre forge**, et une clé SSH
|
||
|
|
qui n'appartient qu'à lui.
|
||
|
|
|
||
|
|
## Principe
|
||
|
|
|
||
|
|
Un écosystème pouvait jusqu'ici **détenir** son génome sans savoir l'exécuter. Les cinq
|
||
|
|
dépôts vivaient sur sa forge — moteur, plans, modèles, étiquette signée — mais Set-OPS
|
||
|
|
ne tournait que depuis le poste de son mainteneur. L'écosystème possédait le livre ;
|
||
|
|
personne, chez lui, ne savait le lire à voix haute.
|
||
|
|
|
||
|
|
`serveur_ops` est la différence entre une **archive** et une **matrice**.
|
||
|
|
|
||
|
|
## Ce que le poste emporte
|
||
|
|
|
||
|
|
```text
|
||
|
|
/opt/setops/
|
||
|
|
Set-OPS-public/ le moteur ← cloné depuis genome/set-ops-public
|
||
|
|
OPS-<instance>/ le plan ← cloné depuis genome/ops-<instance>
|
||
|
|
venv/ ansible-core 2.18 (épinglé)
|
||
|
|
.ssh/id_ed25519 la clé du poste
|
||
|
|
LISEZ-MOI.md mode d'emploi, généré
|
||
|
|
```
|
||
|
|
|
||
|
|
Le moteur et les instances sont des **dossiers frères**, comme sur le poste du
|
||
|
|
mainteneur : c'est cette fraternité que `scripts/instances.py` découvre pour proposer
|
||
|
|
les instances pilotables. Le lien `instance` désigne celle qu'on pilote.
|
||
|
|
|
||
|
|
## D'où vient le génome : de sa propre forge
|
||
|
|
|
||
|
|
Le poste clone depuis `https://forge.<domaine>/genome/…`, **pas** depuis la forge
|
||
|
|
parente. Les dépôts y sont des miroirs, resynchronisés toutes les huit heures : la copie
|
||
|
|
est vivante, et l'écosystème se reconstruit depuis **lui-même**.
|
||
|
|
|
||
|
|
Le clone est **anonyme** — les dépôts du génome sont lisibles sur la forge interne. Un
|
||
|
|
secret de moins sur une machine qui en concentre déjà beaucoup.
|
||
|
|
|
||
|
|
La confiance TLS vient de `client_pki` (racine step-ca dans le magasin système). Sans
|
||
|
|
elle, `git clone` refuse le certificat de la forge, et il a raison de refuser.
|
||
|
|
|
||
|
|
## Les deux choses qu'il n'a PAS
|
||
|
|
|
||
|
|
**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 serait compromettre l'écosystème entier.
|
||
|
|
|
||
|
|
**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**.
|
||
|
|
|
||
|
|
Conséquence à connaître, et qui n'est pas un défaut mais une conception :
|
||
|
|
|
||
|
|
```text
|
||
|
|
la STRUCTURE de l'écosystème se reconstruit depuis la forge
|
||
|
|
les SECRETS se restaurent depuis la sauvegarde (restic)
|
||
|
|
```
|
||
|
|
|
||
|
|
Deux sources distinctes, qu'un même incident n'atteint pas ensemble.
|
||
|
|
|
||
|
|
## Sa clé doit être autorisée
|
||
|
|
|
||
|
|
Le poste fabrique sa propre paire, distincte de celle du mainteneur : deux exploitants,
|
||
|
|
deux révocations possibles, et l'accès du poste se lit dans les `authorized_keys` de la
|
||
|
|
flotte au lieu de se confondre avec celui d'un humain.
|
||
|
|
|
||
|
|
Tant que cette clé publique n'est pas portée aux intrants SSH du plan, **le poste ne
|
||
|
|
joint aucun hôte**. Le rôle l'affiche au déploiement ; elle se relit à tout moment :
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cat /opt/setops/.ssh/id_ed25519.pub
|
||
|
|
```
|
||
|
|
|
||
|
|
C'est volontairement un geste humain : donner à une machine le droit d'entrer partout
|
||
|
|
mérite une décision, pas un effet de bord.
|
||
|
|
|
||
|
|
## Variables principales
|
||
|
|
|
||
|
|
| Variable | Défaut | Rôle |
|
||
|
|
|---|---|---|
|
||
|
|
| `serveur_ops_utilisateur` | `setops` | compte d'exploitation |
|
||
|
|
| `serveur_ops_racine` | `/opt/setops` | racine du poste |
|
||
|
|
| `serveur_ops_ansible` | `ansible-core>=2.18,<2.19` | version **épinglée** |
|
||
|
|
| `serveur_ops_forge_url` | `https://forge.<domaine>` | source du génome |
|
||
|
|
| `serveur_ops_depots` | moteur + instance | quoi cloner, et où |
|
||
|
|
| `serveur_ops_instance` | l'instance du plan | cible du lien `instance` |
|
||
|
|
| `serveur_ops_cle_generer` | `true` | fabriquer la clé du poste |
|
||
|
|
|
||
|
|
## Dépendances
|
||
|
|
|
||
|
|
`serveur_forgejo` (la source du génome) — déclaré dans `docs/dependances-groupes.yml`,
|
||
|
|
avec `sauf_si serveur_ops_forge_externe` pour l'écosystème qui lit son génome ailleurs.
|
||
|
|
`serveur_step_ca` est **utilisé si présent** : sans confiance PKI, le clone échoue sur
|
||
|
|
le certificat.
|
||
|
|
|
||
|
|
## Ce que ce rôle ne fait pas
|
||
|
|
|
||
|
|
Il n'ouvre aucun service, n'écoute sur aucun port, ne publie rien à l'edge. Il ne
|
||
|
|
sauvegarde rien non plus : tout ce qu'il contient se recompose depuis la forge.
|