restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00
|
|
|
---
|
|
|
|
|
# L'ETAT D'UNE INCARNATION PRECEDENTE — voir roles/client_backup/templates/restaurer.sh.j2
|
|
|
|
|
#
|
|
|
|
|
# make restauration-etat [HOTE=...]
|
|
|
|
|
# ce qui attend dans le depot, et ce que chaque jeu est devenu (lecture seule) ;
|
|
|
|
|
# make sauvegarder-maintenant [HOTE=...]
|
|
|
|
|
# deposer TOUT DE SUITE, et attendre que ce soit fait. A faire juste avant `raser` :
|
|
|
|
|
# sinon la reconstruction remet l'etat de la derniere nuit, et perd la journee ;
|
2026-10-07 12:48:00 -04:00
|
|
|
# make temoins-etat [HOTE=...] [SOURCE=candidat]
|
|
|
|
|
# l'etat VIVANT est-il celui d'avant le rasage ? Compare a l'instantane etiquete
|
|
|
|
|
# « avant-raser » (lecture seule). Une perte, ou une identite changee (cles de l'AC,
|
|
|
|
|
# DKIM, instanceid, mot de passe d'une entree de l'annuaire), fait echouer le jeu ;
|
restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00
|
|
|
# make restauration-renoncer HOTE=<hote> JEU=<jeu> CONFIRMER=true
|
|
|
|
|
# ECARTER un etat anterieur sans le remettre. La sauvegarde du noeud, qui refusait
|
|
|
|
|
# de deposer pour ne pas le chasser de la retention, reprend — et l'etat d'avant
|
|
|
|
|
# finira par sortir de la retention. C'est une decision, pas une reparation.
|
|
|
|
|
#
|
|
|
|
|
# La REMISE, elle, n'a pas de cible : elle est faite par le role proprietaire de l'etat,
|
|
|
|
|
# au deploiement, au moment ou il le creerait neuf.
|
|
|
|
|
- name: L'etat d'une incarnation precedente
|
|
|
|
|
hosts: client_backup
|
|
|
|
|
become: true
|
|
|
|
|
gather_facts: false
|
|
|
|
|
vars:
|
|
|
|
|
restauration_action: etat
|
|
|
|
|
restauration_jeu: ""
|
2026-10-07 12:48:00 -04:00
|
|
|
restauration_source: avant-raser
|
restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00
|
|
|
tasks:
|
|
|
|
|
- name: Refuser un renoncement sans jeu nomme
|
|
|
|
|
ansible.builtin.assert:
|
|
|
|
|
that:
|
|
|
|
|
- restauration_jeu | length > 0
|
|
|
|
|
fail_msg: "JEU=<jeu> requis (voir `make restauration-etat` pour les noms)."
|
|
|
|
|
when: restauration_action == 'renoncer'
|
|
|
|
|
|
|
|
|
|
- name: Lire ce qui attend, et ce qui a ete tranche
|
|
|
|
|
ansible.builtin.command:
|
|
|
|
|
argv: [/usr/local/sbin/setops-restaurer, etat]
|
|
|
|
|
register: restauration_lue
|
|
|
|
|
changed_when: false
|
|
|
|
|
failed_when: false
|
|
|
|
|
when: restauration_action == 'etat'
|
|
|
|
|
|
|
|
|
|
- name: Etat
|
|
|
|
|
ansible.builtin.debug:
|
|
|
|
|
msg: "{{ (restauration_lue.stdout_lines | default([])) + (restauration_lue.stderr_lines | default([])) }}"
|
|
|
|
|
when: restauration_action == 'etat'
|
|
|
|
|
|
|
|
|
|
# L'unite est `oneshot` : `systemctl start` rend la main quand le depot est fait, et
|
|
|
|
|
# echoue s'il a echoue — y compris quand la garde refuse (etat d'avant non remis).
|
|
|
|
|
- name: Ce noeud a-t-il quelque chose a deposer ?
|
|
|
|
|
ansible.builtin.stat:
|
|
|
|
|
path: /etc/systemd/system/setops-sauvegarde.service
|
|
|
|
|
register: restauration_unite
|
|
|
|
|
when: restauration_action == 'sauvegarder'
|
|
|
|
|
|
2026-10-07 12:48:00 -04:00
|
|
|
# LE DEPOT D'AVANT RASAGE EST ETIQUETE (2026-10-07), et la retention le garde jusqu'a la
|
|
|
|
|
# reconstruction suivante. Un noeud qui n'a pas encore cette unite deposerait SANS
|
|
|
|
|
# etiquette, et la premiere sauvegarde d'apres reconstruction le chasserait : c'est
|
|
|
|
|
# exactement ce qui s'est passe a M4. On refuse plutot que de deposer a moitie.
|
|
|
|
|
- name: L'unite du depot d'avant rasage est-elle deployee ?
|
|
|
|
|
ansible.builtin.stat:
|
|
|
|
|
path: /etc/systemd/system/setops-sauvegarde-avant-raser.service
|
|
|
|
|
register: restauration_unite_avant_raser
|
|
|
|
|
when:
|
|
|
|
|
- restauration_action == 'sauvegarder'
|
|
|
|
|
- restauration_unite.stat.exists
|
|
|
|
|
|
|
|
|
|
- name: Refuser un depot que la retention ne garderait pas
|
|
|
|
|
ansible.builtin.assert:
|
|
|
|
|
that:
|
|
|
|
|
- restauration_unite_avant_raser.stat.exists
|
|
|
|
|
fail_msg: >-
|
|
|
|
|
setops-sauvegarde-avant-raser.service absente : redeployer client_backup
|
|
|
|
|
(make appliquer GROUPE=client_backup) avant de raser.
|
|
|
|
|
when:
|
|
|
|
|
- restauration_action == 'sauvegarder'
|
|
|
|
|
- restauration_unite.stat.exists
|
|
|
|
|
|
|
|
|
|
- name: Deposer maintenant, etiquete avant rasage
|
restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00
|
|
|
ansible.builtin.systemd:
|
2026-10-07 12:48:00 -04:00
|
|
|
name: setops-sauvegarde-avant-raser.service
|
restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00
|
|
|
state: started
|
|
|
|
|
when:
|
|
|
|
|
- restauration_action == 'sauvegarder'
|
|
|
|
|
- restauration_unite.stat.exists
|
|
|
|
|
|
2026-10-07 12:48:00 -04:00
|
|
|
# Code 4 = rien a comparer (aucun etat, ou aucun instantane d'avant rasage) : ce n'est
|
|
|
|
|
# pas un echec. Code 1 = ecart : on affiche d'abord, on echoue ensuite.
|
|
|
|
|
- name: Temoins — l'etat vivant contre l'instantane d'avant rasage
|
|
|
|
|
ansible.builtin.command:
|
|
|
|
|
argv: >-
|
|
|
|
|
{{ ['/usr/local/sbin/setops-restaurer', 'temoins']
|
|
|
|
|
+ (['--candidat'] if restauration_source == 'candidat' else []) }}
|
|
|
|
|
register: restauration_temoins
|
|
|
|
|
changed_when: false
|
|
|
|
|
failed_when: false
|
|
|
|
|
when: restauration_action == 'temoins'
|
|
|
|
|
|
|
|
|
|
- name: Temoins
|
|
|
|
|
ansible.builtin.debug:
|
|
|
|
|
msg: "{{ (restauration_temoins.stdout_lines | default([])) + (restauration_temoins.stderr_lines | default([])) }}"
|
|
|
|
|
when: restauration_action == 'temoins'
|
|
|
|
|
|
|
|
|
|
- name: Temoins — verdict
|
|
|
|
|
ansible.builtin.assert:
|
|
|
|
|
that:
|
|
|
|
|
- restauration_temoins.rc in [0, 4]
|
|
|
|
|
fail_msg: >-
|
|
|
|
|
{{ 'ECART : une perte, ou une identite changee (voir ci-dessus).'
|
|
|
|
|
if restauration_temoins.rc == 1 else
|
|
|
|
|
'setops-restaurer temoins a echoue (code ' ~ restauration_temoins.rc ~ ') : '
|
|
|
|
|
~ 'client_backup est-il deploye ?' }}
|
|
|
|
|
quiet: true
|
|
|
|
|
when: restauration_action == 'temoins'
|
|
|
|
|
|
restauration : la reconstruction remet l'etat de l'incarnation precedente
Chaque role proprietaire (AC, bases, annuaire, Nextcloud, rspamd/DKIM,
courriel, forge, web) remet son etat au moment ou il le creerait neuf,
depuis le dernier instantane anterieur a la naissance de la machine.
La sauvegarde refuse de deposer tant qu'un etat d'avant attend.
Outil de noeud setops-restaurer ; cibles sauvegarder-maintenant,
restauration-etat, restauration-renoncer ; test_restauration.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 02:39:22 -04:00
|
|
|
- name: Ecarter l'etat anterieur de ce jeu
|
|
|
|
|
ansible.builtin.command:
|
|
|
|
|
argv: [/usr/local/sbin/setops-restaurer, acter, "{{ restauration_jeu }}", abandonne]
|
|
|
|
|
changed_when: true
|
|
|
|
|
when: restauration_action == 'renoncer'
|