Set-OPS-Public/roles/serveur_ops_site/tasks/main.yml
Daniel Allaire 2b55761fba runner : separer le pouvoir de configurer de celui de materialiser
La ligne de partage est celle des voutes. serveur_ops calcule et configure --
voute du tenant, SSH chez lui. serveur_ops_site materialise -- voute du SITE,
API de l'hyperviseur, jamais de SSH chez un tenant.

Un runner par tenant qui materialiserait mettrait la voute du SITE en N
exemplaires. Un runner unique qui ferait tout traverserait le default-deny
inter-tenant et rendrait l'emancipation impossible.

Le role depose la voute CHIFFREE et relit l'en-tete apres avoir ecrit : sans
`decrypt: false`, Ansible dechiffre la source quand il detient le mot de passe
-- constate le jour meme, 776 octets en clair au lieu de 3465. Controle negatif
fait, la garde mord.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 15:30:03 -04:00

64 lines
2.7 KiB
YAML

---
- name: Exiger les intrants du runner de site
ansible.builtin.assert:
that:
- serveur_ops_site_depot | length > 0
- (not (serveur_ops_site_voute_deposer | bool)) or (serveur_ops_site_voute_source | length > 0)
fail_msg: >-
serveur_ops_site exige `serveur_ops_site_depot` (le dossier du dépôt SITE chez le
runner, cloné par serveur_ops) et, si le dépôt de la voûte est demandé,
`serveur_ops_site_voute_source` (le chemin de `underlay.vault.yml` sur le contrôleur).
- name: Le dépôt du SITE est-il bien là ?
ansible.builtin.stat:
path: "{{ serveur_ops_site_racine }}/{{ serveur_ops_site_depot }}/underlay.yml"
register: serveur_ops_site_carte
- name: Refuser si la carte de la fabric manque
ansible.builtin.assert:
that:
- serveur_ops_site_carte.stat.exists
fail_msg: >-
{{ serveur_ops_site_racine }}/{{ serveur_ops_site_depot }}/underlay.yml est absent.
Déclarer ce dépôt dans `serveur_ops_depots` (role: hebergeur) et rejouer serveur_ops :
un runner de site sans carte ne sait pas sur quoi il matérialise.
when: not ansible_check_mode
# LES CLÉS DU MONDE PHYSIQUE, DE DROIT ET NON PAR EMPRUNT.
#
# `decrypt: no` : voir defaults/main.yml. Le fichier reste chiffré ; seul le mot de passe,
# tapé à l'exécution, l'ouvre.
- name: Déposer la voûte du SITE (chiffrée)
ansible.builtin.copy:
src: "{{ serveur_ops_site_voute_source }}"
dest: "{{ serveur_ops_site_racine }}/{{ serveur_ops_site_depot }}/underlay.vault.yml"
owner: "{{ serveur_ops_site_utilisateur }}"
group: "{{ serveur_ops_site_utilisateur }}"
mode: "0600"
decrypt: false
when:
- serveur_ops_site_voute_deposer | bool
- not ansible_check_mode
# ÉCRIRE, PUIS RELIRE (D-68). Une voûte déchiffrée par accident est une fuite silencieuse :
# le fichier existe, le rôle se dit satisfait, et les clés du cluster dorment en clair.
- name: Relire l'en-tête de la voûte déposée
ansible.builtin.command:
cmd: "head -c 21 {{ serveur_ops_site_racine }}/{{ serveur_ops_site_depot }}/underlay.vault.yml"
register: serveur_ops_site_entete
changed_when: false
when:
- serveur_ops_site_voute_deposer | bool
- not ansible_check_mode
- name: Exiger que la voûte déposée soit CHIFFRÉE
ansible.builtin.assert:
that:
- "'$ANSIBLE_VAULT' in serveur_ops_site_entete.stdout"
fail_msg: >-
La voûte déposée n'est PAS chiffrée — elle a été déchiffrée en transit.
Vérifier `decrypt: false` sur la copie. Détruire le fichier au shred et
considérer les justificatifs du cluster comme exposés.
when:
- serveur_ops_site_voute_deposer | bool
- not ansible_check_mode