Set-OPS-Public/roles/client_backup/tasks/restaurer.yml
Daniel Allaire 8a9da0c31a 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

98 lines
4.9 KiB
YAML

---
# L'ETAT D'UNE INCARNATION PRECEDENTE ATTEND-IL CE JEU ?
#
# Inclus par le role PROPRIETAIRE de l'etat, au moment precis ou il le creerait neuf :
# l'AC avant `step ca init`, les bases juste creees, l'annuaire une fois son schema pose...
# C'est lui qui sait quand son etat est « vierge » ; ce fichier sait ou est le depot.
#
# entree : client_backup_restaurer_jeu — groupe du catalogue (ex. serveur_step_ca)
# client_backup_restaurer_vierge — le role n'a encore RIEN de cet etat
# sortie : client_backup_restauration — {jeu, etat, instantane, chemins}
#
# etat : `a_restaurer` (au role de le remettre, puis d'inclure `acter.yml`), `acte`
# (deja tranche a une passe precedente), `en_place` (un etat existe : on ne l'ecrase
# jamais d'office), `neuf` (rien d'anterieur), `sans_objet`, `simulation`.
- name: Restauration — le jeu et ce qu'il emporte
ansible.builtin.set_fact:
client_backup_restauration:
jeu: "{{ client_backup_catalogue[client_backup_restaurer_jeu].nom }}"
chemins: "{{ client_backup_catalogue[client_backup_restaurer_jeu].chemins }}"
etat: >-
{{ 'simulation' if ansible_check_mode
else ('sans_objet' if ('client_backup' not in group_names)
else ('desactive' if not (client_backup_restauration_active | bool)
else 'a_decider')) }}
instantane: ""
- name: Restauration — trancher pour ce jeu
when: client_backup_restauration.etat != 'sans_objet' and client_backup_restauration.etat != 'simulation'
block:
- name: Restauration — ce jeu a-t-il deja ete tranche ?
ansible.builtin.slurp:
src: "{{ client_backup_restauration_marques }}/{{ client_backup_restauration.jeu }}"
register: client_backup_marque_lue
failed_when: false
- name: Restauration — deja tranche a une passe precedente
ansible.builtin.set_fact:
client_backup_restauration: >-
{{ client_backup_restauration | combine({'etat': 'acte',
'instantane': ((client_backup_marque_lue.content | b64decode).splitlines()
| select('match', '^instantane=') | first
| default('instantane=')).split('=', 1)[1]}) }}
when: client_backup_marque_lue.content is defined
- name: "Restauration — desactivee, ou un etat existe deja, l'acter tel quel"
ansible.builtin.include_tasks: acter.yml
vars:
client_backup_acter_etat: "{{ 'desactive' if client_backup_restauration.etat == 'desactive' else 'en_place' }}"
when:
- client_backup_marque_lue.content is not defined
- client_backup_restauration.etat == 'desactive' or not (client_backup_restaurer_vierge | bool)
# LA CONDITION D'UN BLOC SE REEVALUE A CHAQUE TACHE. Ecrite sur `etat`, elle se
# fermerait des que le choix le change — et « rien d'anterieur » ne serait jamais acte.
# On la fige donc avant d'entrer.
- name: Restauration — faut-il interroger le depot ?
ansible.builtin.set_fact:
client_backup_interroger: >-
{{ client_backup_marque_lue.content is not defined
and client_backup_restauration.etat == 'a_decider'
and (client_backup_restaurer_vierge | bool) }}
- name: Restauration — interroger le depot
when: client_backup_interroger | bool
block:
- name: Restauration — acces au depot (le role client_backup n'a peut-etre pas encore tourne)
ansible.builtin.include_tasks: acces.yml
# Code 2 = depot ILLISIBLE : on echoue. Conclure « rien a restaurer » faute de
# joindre le depot ferait naitre neuf ce qui attend chez l'hebergeur.
- name: Restauration — l'instantane de l'incarnation precedente
ansible.builtin.command:
argv: >-
{{ ['/usr/local/sbin/setops-restaurer', 'choisir']
+ (['--instantane', client_backup_restauration_instantane]
if client_backup_restauration_instantane | length > 0 else []) }}
register: client_backup_choix
changed_when: false
- name: Restauration — retenir le choix
ansible.builtin.set_fact:
client_backup_restauration: >-
{{ client_backup_restauration | combine({
'etat': ('a_restaurer' if (client_backup_choix.stdout | from_json).instantane else 'neuf'),
'instantane': (client_backup_choix.stdout | from_json).instantane}) }}
- name: "Restauration — rien d'anterieur, naissance"
ansible.builtin.include_tasks: acter.yml
vars:
client_backup_acter_etat: neuf
when: client_backup_restauration.etat == 'neuf'
- name: Restauration — verdict
ansible.builtin.debug:
msg: >-
{{ client_backup_restauration.jeu }} : {{ client_backup_restauration.etat }}{{
(' — instantane ' + client_backup_restauration.instantane)
if client_backup_restauration.instantane | length > 0 else '' }}