From 7cc6abd942728d5f1716190898e830a3da2a9609 Mon Sep 17 00:00:00 2001 From: Christian Steinle Date: Fri, 25 Apr 2025 11:01:47 +0200 Subject: [PATCH] WIP: Extract backup rotation. --- rotate-backup.yaml | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 rotate-backup.yaml diff --git a/rotate-backup.yaml b/rotate-backup.yaml new file mode 100644 index 0000000..aae4d96 --- /dev/null +++ b/rotate-backup.yaml @@ -0,0 +1,82 @@ + --- +# This playbook rotates backups +- name: Backup Strato Production + hosts: all + gather_facts: true + + tasks: + - name: Register new backup directories + find: + paths: "{{ backup_dir }}" + file_type: directory + recurse: false + register: backup_dirs + + - name: Check logrotate directories + file: + path: "{{ item[0].path }}/{{ item[1] }}" + state: directory + with_nested: + - "{{ backup_dirs.files }}" + - ['daily', 'weekly', 'monthly', 'yearly'] + loop_control: + label: "{{ item[0].path }} {{ item[1] }}" + + - name: Search for the created backups + find: + paths: "{{ item.path }}" + file_type: file + patterns: '*.gz' + recurse: false + register: backup_files + loop: "{{ backup_dirs.files }}" + loop_control: + label: "{{ item.path }}" + + - name: Store the yearly backups + copy: + remote_src: true + src: "{{ item.path }}" + dest: "{{ item.path | dirname }}/yearly/{{ item.path | basename }}" + with_items: "{{ backup_files.results | map(attribute='files') | list }}" + when: (ansible_date_time.day == "01" and ansible_date_time.month == "01") + loop_control: + label: "{{ item.path }}" + + - name: Store the monthly backups + copy: + remote_src: true + src: "{{ item.path }}" + dest: "{{ item.path | dirname }}/monthly/{{ item.path | basename }}" + with_items: "{{ backup_files.results | map(attribute='files') | list }}" + when: (ansible_date_time.day == "01" and ansible_date_time.month != "01") + loop_control: + label: "{{ item.path }}" + + - name: Store the weekly backups + copy: + remote_src: true + src: "{{ item.path }}" + dest: "{{ item.path | dirname }}/weekly/{{ item.path | basename }}" + with_items: "{{ backup_files.results | map(attribute='files') | list }}" + when: (ansible_date_time.weekday_number == "1") + loop_control: + label: "{{ item.path }}" + + - name: Store the daily backup + copy: + remote_src: true + src: "{{ item.path }}" + dest: "{{ item.path | dirname }}/daily/{{ item.path | basename }}" + with_items: "{{ backup_files.results | map(attribute='files') | list }}" + when: (ansible_date_time.weekday_number != "1" and ansible_date_time.day != "01") + loop_control: + label: "{{ item.path }}" + + - name: Cleanup original backup files + file: + path: "{{ item.path }}" + state: absent + with_items: "{{ backup_files.results | map(attribute='files') | list }}" + loop_control: + label: "{{ item.path }}"