diff --git a/defaults/main.yml b/defaults/main.yml index 2fdc183af3494d184e82de703f6c9e512941a980..93b4e8a006fb8f1cb3b7a6f6fc92b120b5d13172 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,4 +1,14 @@ backups: + jobs: + retention: + enabled: true + OnCalendar: "1:{{ 60|random(seed=(inventory_hostname + 'backups_jobs')) }}" + run: + enabled: true + OnCalendar: "3,11,19:{{ 60|random(seed=(inventory_hostname + 'backups_jobs')) }}" + check: + enabled: true + OnCalendar: "monday 5:{{ 60|random(seed=(inventory_hostname + 'backups_jobs')) }}" backends: restic: url: /var/backup-client/restic diff --git a/handlers/main.yml b/handlers/main.yml index c8e102186a3daffd3caf1734f50976efa4e273a0..0e125d1a6f9769145a712d053a02d32b58c22c4d 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,3 +1,13 @@ - name: reload systemd systemd: daemon_reload: True + +- name: enable timers + loop: + - check + - retention + - run + systemd: + name: "backup-{{ item }}.timer" + enabled: "{{ backups.jobs[item].enabled }}" + state: "{% if backups.jobs[item].enabled %}started{% else %}stopped{% endif %}" diff --git a/tasks/main.yml b/tasks/main.yml index 367465269e91b44b0441564e8ddbcef74aea3d77..713d0c8e9091d02a13c2e26bf3e9f40f9d69002c 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -48,6 +48,7 @@ - backup-full - backup-cronjob - backup-check + - status-email-root template: src: "{{ item }}.j2" dest: "/usr/local/bin/{{ item }}" @@ -62,12 +63,28 @@ - backup-check - backup-retention - backup-run + - status-email-root@ template: src: "{{ item }}.service.j2" dest: "/etc/systemd/system/{{ item }}.service" owner: root group: root mode: 0644 +# validate: /usr/bin/systemd-analyze verify %s + - name: copy timers + notify: + - reload systemd + - enable timers + loop: + - check + - retention + - run + template: + src: "timer.j2" + dest: "/etc/systemd/system/backup-{{ item }}.timer" + owner: root + group: root + mode: 0644 # validate: /usr/bin/systemd-analyze verify %s - name: create data folder file: diff --git a/templates/status-email-root.j2 b/templates/status-email-root.j2 new file mode 100755 index 0000000000000000000000000000000000000000..fe82c1a36ec912e8c9793df2f499b48df94a29cf --- /dev/null +++ b/templates/status-email-root.j2 @@ -0,0 +1,4 @@ +#!/bin/bash +set -euo pipefail + +systemctl status "$1" | mail -s "service $1 failed on $( hostname )" root || true diff --git a/templates/status-email-root@.service.j2 b/templates/status-email-root@.service.j2 new file mode 100644 index 0000000000000000000000000000000000000000..81e82e80a5a1798c7a6baf6202a17a4bb2404015 --- /dev/null +++ b/templates/status-email-root@.service.j2 @@ -0,0 +1,7 @@ +[Unit] +Description=Send a mail to root in case of a service failure + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/status-email-root %i + diff --git a/templates/timer.j2 b/templates/timer.j2 new file mode 100644 index 0000000000000000000000000000000000000000..d1885e51c8a0ed22327d3aa6a81091e4ed68a753 --- /dev/null +++ b/templates/timer.j2 @@ -0,0 +1,11 @@ +[Unit] +Description=Execute backup job + +[Timer] +Persistent=true +{% if "OnCalendar" in backups.jobs[item] %} +OnCalendar={{ backups.jobs[item].OnCalendar }} +{% endif %} + +[Install] +WantedBy=timers.target