depot hors site : trois pieges payes en une manoeuvre
Some checks are pending
verifier / verifier (push) Waiting to run

1. ansible -e cle=valeur DECOUPE SUR LES BLANCS — c est ainsi qu on passe
   plusieurs variables. Un chemin avec une espace y perd tout ce qui suit le
   premier blanc, et l erreur parle d un repertoire introuvable au nom tronque.
   Passage en JSON. Le depot avait deja appris ca pour le clonage de VM ; la
   lecon ne s etait pas propagee. Quatrieme fois.

2. /srv/restic est en 0711 — traversable, NON listable, pour qu un locataire
   n apprenne pas qui d autre depose ici. La consequence tombe sur rsync :
   opendir Permission denied, un message qui accuse un droit sans dire lequel.
   --rsync-path=sudo rsync fait lire la SOURCE en root.

3. rsync_opts ne protege pas ses elements : le shell coupait
   --rsync-path=sudo rsync en deux. Guillemets internes.

Resultat mesure : COPIE FIDELE, 233 fichiers, 95,7 Mo, empreintes identiques
une a une — comparees entre la source et la copie, pas supposees.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
This commit is contained in:
Daniel Allaire 2026-09-05 16:33:26 -04:00
parent 9a823a5ea2
commit 00cee67f02
2 changed files with 30 additions and 2 deletions

View file

@ -583,8 +583,14 @@ depot-hors-site: ## Copie le depot de sauvegarde du site HORS du site — VERS=<
@if [ -z "$(VERS)" ]; then \
printf 'Refus: relancer avec VERS=<repertoire de destination>.\n'; \
printf 'Ex. make depot-hors-site VERS=/media/danallaire/setops-coffre\n'; exit 2; fi
@# EN JSON, PAS EN `-e cle=valeur` (2026-09-05). La forme `cle=valeur` DECOUPE SUR
@# LES BLANCS — c'est ainsi qu'on passe plusieurs variables d'un coup. Un chemin
@# contenant une espace y perd donc tout ce qui suit le premier blanc, et l'erreur
@# parle d'un repertoire introuvable au nom tronque : « /media/danallaire/Cle ».
@# Le depot avait deja appris ca pour le clonage de VM ; la lecon ne s'etait pas
@# propagee ici. Quatrieme fois que ce piege est paye.
ansible-playbook -i scripts/site_inventaire.py \
playbooks/maintenance/depot-hors-site.yml -e vers="$(VERS)"
playbooks/maintenance/depot-hors-site.yml -e '{"vers": "$(VERS)"}'
.PHONY: depot-hors-site
cles-compagnons: ## Depose le script de restauration sur une cle DEJA faite — VERS=<repertoire>

View file

@ -87,6 +87,19 @@
register: taille_source
changed_when: false
# RSYNC LIT LA SOURCE EN ROOT, ET C'EST LA GARDE QUI L'EXIGE.
#
# `/srv/restic` est en 0711 : traversable, NON LISTABLE. C'est voulu — un locataire
# atteint son propre depot sans pouvoir apprendre qui d'autre depose ici. La liste
# des voisins est deja une information.
#
# La consequence tombe ici : le compte `ansible` ne peut pas ENUMERER la racine, et
# rsync echoue sur `opendir "/srv/restic/." failed: Permission denied`. Le message
# accuse un droit sans dire lequel, et on cherche du cote du compte alors que c'est
# la politique du repertoire.
#
# `--rsync-path=sudo rsync` fait lire la SOURCE en root, sans que la copie locale
# ait besoin de privileges. `become: false` reste donc juste pour le cote poste.
- name: Copier vers la destination
ansible.posix.synchronize:
src: "{{ racine }}/"
@ -94,14 +107,23 @@
mode: pull
archive: true
delete: true
rsync_opts:
# Les guillemets INTERNES sont necessaires : `rsync_opts` ne protege pas ses
# elements, et le shell local coupait `--rsync-path=sudo rsync` en deux.
- "--rsync-path='sudo rsync'"
become: false
# LE CHEMIN EST ENTRE GUILLEMETS, ET CE N'EST PAS DU ZELE. Ce depot vit sous
# « Espace Chezlepro » et les supports de l'exploitant portent des noms avec des
# blancs. Un chemin nu atteignant un shell se coupe au premier espace, et l'erreur
# parle d'un fichier introuvable au nom tronque — ce qui n'oriente vers rien.
# Quatrieme fois que ce depot paie ce piege.
- name: Empreinte de ce qui est arrive
ansible.builtin.shell:
executable: /bin/bash
cmd: >-
set -o pipefail;
find {{ vers }}/depot-du-site -type f -print0 | sort -z |
find "{{ vers }}/depot-du-site" -type f -print0 | sort -z |
xargs -0 sha256sum | sed 's| {{ vers }}/depot-du-site/| |'
delegate_to: localhost
become: false