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>
64 lines
2.7 KiB
YAML
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
|