commit f4b4201902b0dc727f68f0c3ee4e2c301b548fe2 Author: Nils Cant Date: Wed Aug 28 11:53:32 2019 +0200 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..862dc9c --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,6 @@ +borgbackup_borg_repo: "" +borgbackup_borg_passphrase: "" +borgbackup_backup_dirs: [] +borgbackup_prune_keep_daily: 7 +borgbackup_prune_keep_weekly: 4 +borgbackup_prune_keep_monthly: 6 diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..8165833 --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,2 @@ +galaxy_info: + author: Nils Cant diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..d820522 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,16 @@ +- name: Install borgbackup + apt: + name: borgbackup + +- name: Generate ssh keypair for root user + command: ssh-keygen -b 4096 -t rsa -q -N "" -f /root/.ssh/id_rsa + args: + creates: /root/.ssh/id_rsa + +- name: Backup script + template: + src: borgbackup-run.j2 + dest: /usr/local/sbin/borgbackup-run + owner: root + group: root + mode: 0700 diff --git a/templates/borgbackup-run.j2 b/templates/borgbackup-run.j2 new file mode 100644 index 0000000..7fa4864 --- /dev/null +++ b/templates/borgbackup-run.j2 @@ -0,0 +1,66 @@ +#!/bin/bash + +# Setting this, so the repo does not need to be given on the commandline: +export BORG_REPO="{{ borgbackup_borg_repo }}" + +# Setting this, so you won't be asked for your repository passphrase: +export BORG_PASSPHRASE='{{ borgbackup_borg_passphrase }}' +# or this to ask an external program to supply the passphrase: +#export BORG_PASSCOMMAND='pass show backup' + +# some helpers and error handling: +info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; } +trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM + +info "Starting backup" + +# Backup the most important directories into an archive named after +# the machine this script is currently running on: + +borg create \ + --verbose \ + --filter AME \ + --list \ + --stats \ + --show-rc \ + --compression lz4 \ + --exclude-caches \ + \ + ::'{hostname}-{now}' \ +{% for directory in borgbackup_backup_dirs %} + {{ directory }} \ +{% endfor %} + + backup_exit=$? + +info "Pruning repository" + +# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly +# archives of THIS machine. The '{hostname}-' prefix is very important to +# limit prune's operation to this machine's archives and not apply to +# other machines' archives also: + +borg prune \ + --list \ + --prefix '{hostname}-' \ + --show-rc \ + --keep-daily {{ borgbackup_prune_keep_daily }} \ + --keep-weekly {{ borgbackup_prune_keep_weekly }} \ + --keep-monthly {{ borgbackup_prune_keep_monthly }} \ + + prune_exit=$? + +# use highest exit code as global exit code +global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit )) + +if [ ${global_exit} -eq 1 ]; +then + info "Backup and/or Prune finished with a warning" +fi + +if [ ${global_exit} -gt 1 ]; +then + info "Backup and/or Prune finished with an error" +fi + +exit ${global_exit}