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>
149 lines
5 KiB
YAML
149 lines
5 KiB
YAML
---
|
|
- name: Installer rspamd et Redis
|
|
ansible.builtin.apt:
|
|
name: "{{ serveur_rspamd_paquets }}"
|
|
state: present
|
|
update_cache: true
|
|
|
|
- name: Activer et démarrer Redis (backend rspamd)
|
|
ansible.builtin.systemd:
|
|
name: redis-server
|
|
enabled: true
|
|
state: started
|
|
when: not ansible_check_mode
|
|
|
|
# CE QUE RSPAMD A APPRIS, ET SA CLE DKIM (2026-09-30).
|
|
#
|
|
# La cle DKIM se genere « seulement si absente » : chaque reconstruction en fabriquait
|
|
# donc une NEUVE, et l'enregistrement DNS publie cessait de correspondre — le courriel
|
|
# signe devenait invalide chez les destinataires, sans rien casser chez nous. On la
|
|
# remet AVANT la generation. Le paquet a deja peuple `/var/lib/rspamd` : on le remplace
|
|
# (mis de cote), rspamd arrete.
|
|
- name: Restauration — la cle DKIM existe-t-elle deja ?
|
|
ansible.builtin.stat:
|
|
path: "{{ serveur_rspamd_dkim_repertoire }}/{{ serveur_rspamd_dkim_domaine }}.{{ serveur_rspamd_dkim_selecteur }}.key"
|
|
register: serveur_rspamd_dkim_initiale
|
|
|
|
- name: Restauration — rspamd d'une incarnation precedente ?
|
|
ansible.builtin.include_role:
|
|
name: client_backup
|
|
tasks_from: restaurer.yml
|
|
vars:
|
|
client_backup_restaurer_jeu: serveur_rspamd
|
|
client_backup_restaurer_vierge: "{{ not serveur_rspamd_dkim_initiale.stat.exists }}"
|
|
|
|
- name: Restauration — remettre rspamd
|
|
when: client_backup_restauration.etat == 'a_restaurer'
|
|
block:
|
|
- name: Restauration — arreter rspamd
|
|
ansible.builtin.systemd:
|
|
name: "{{ serveur_rspamd_service }}"
|
|
state: stopped
|
|
|
|
- name: Restauration — remettre son etat et sa cle
|
|
changed_when: true
|
|
ansible.builtin.command:
|
|
argv: >-
|
|
{{ ['/usr/local/sbin/setops-restaurer', 'fichiers', '--remplacer',
|
|
'--instantane', client_backup_restauration.instantane,
|
|
'--proprietaire', '_rspamd:_rspamd']
|
|
+ client_backup_restauration.chemins }}
|
|
|
|
- name: Restauration — relancer rspamd
|
|
ansible.builtin.systemd:
|
|
name: "{{ serveur_rspamd_service }}"
|
|
state: started
|
|
|
|
- name: Restauration — acter rspamd
|
|
ansible.builtin.include_role:
|
|
name: client_backup
|
|
tasks_from: acter.yml
|
|
vars:
|
|
client_backup_acter_etat: restaure
|
|
|
|
# --- Clé DKIM (privée locale ; publique à publier en DNS — Étape B) ---
|
|
- name: Créer le répertoire des clés DKIM
|
|
ansible.builtin.file:
|
|
path: "{{ serveur_rspamd_dkim_repertoire }}"
|
|
state: directory
|
|
owner: _rspamd
|
|
group: _rspamd
|
|
mode: "0750"
|
|
when: serveur_rspamd_dkim_actif | bool
|
|
|
|
- name: Générer la clé DKIM (idempotent — seulement si absente)
|
|
ansible.builtin.command:
|
|
cmd: >-
|
|
rspamadm dkim_keygen
|
|
-s {{ serveur_rspamd_dkim_selecteur }}
|
|
-d {{ serveur_rspamd_dkim_domaine }}
|
|
-k {{ serveur_rspamd_dkim_repertoire }}/{{ serveur_rspamd_dkim_domaine }}.{{ serveur_rspamd_dkim_selecteur }}.key
|
|
creates: "{{ serveur_rspamd_dkim_repertoire }}/{{ serveur_rspamd_dkim_domaine }}.{{ serveur_rspamd_dkim_selecteur }}.key"
|
|
register: serveur_rspamd_dkim_gen
|
|
when:
|
|
- serveur_rspamd_dkim_actif | bool
|
|
- not ansible_check_mode
|
|
notify: Redémarrer rspamd
|
|
|
|
- name: Fixer les droits de la clé DKIM privée
|
|
ansible.builtin.file:
|
|
path: "{{ serveur_rspamd_dkim_repertoire }}/{{ serveur_rspamd_dkim_domaine }}.{{ serveur_rspamd_dkim_selecteur }}.key"
|
|
owner: _rspamd
|
|
group: _rspamd
|
|
mode: "0640"
|
|
when:
|
|
- serveur_rspamd_dkim_actif | bool
|
|
- not ansible_check_mode
|
|
|
|
- name: Afficher l'enregistrement DNS DKIM à publier (Étape B)
|
|
ansible.builtin.debug:
|
|
msg: "{{ serveur_rspamd_dkim_gen.stdout_lines | default(['(clé déjà présente — cf. ' + serveur_rspamd_dkim_repertoire + ')']) }}"
|
|
when: serveur_rspamd_dkim_actif | bool
|
|
|
|
# --- Surcharges de configuration (local.d) ---
|
|
- name: Déployer les surcharges local.d (redis, proxy milter)
|
|
ansible.builtin.template:
|
|
src: "{{ item }}.j2"
|
|
dest: "/etc/rspamd/local.d/{{ item }}"
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
loop:
|
|
- redis.conf
|
|
- worker-proxy.inc
|
|
notify: Redémarrer rspamd
|
|
|
|
- name: Déployer la signature DKIM (local.d)
|
|
ansible.builtin.template:
|
|
src: dkim_signing.conf.j2
|
|
dest: /etc/rspamd/local.d/dkim_signing.conf
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
when: serveur_rspamd_dkim_actif | bool
|
|
notify: Redémarrer rspamd
|
|
|
|
- name: Activer et démarrer rspamd
|
|
when: not ansible_check_mode
|
|
ansible.builtin.systemd:
|
|
name: "{{ serveur_rspamd_service }}"
|
|
enabled: true
|
|
state: started
|
|
|
|
# LE ROLE QUI POSSEDE LA VERITE DEPOSE SA PROPRE SONDE. `client_sante` la fait tourner et
|
|
# pousse le resultat ; les greffons standard, eux, sont poses par le porteur.
|
|
- name: Assurer le repertoire des sondes de supervision
|
|
ansible.builtin.file:
|
|
path: /usr/local/lib/setops/sondes
|
|
state: directory
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
|
|
- name: Deposer la sonde « filtrage »
|
|
ansible.builtin.template:
|
|
src: sonde-filtrage.sh.j2
|
|
dest: /usr/local/lib/setops/sondes/filtrage.sh
|
|
owner: root
|
|
group: root
|
|
mode: "0750"
|