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>
98 lines
4.9 KiB
YAML
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 '' }}
|