From c99eb0bdbb008c98223dcbe83f1b5160754ebb06 Mon Sep 17 00:00:00 2001 From: Ryan Hamilton Date: Wed, 30 Jul 2025 05:44:16 +0000 Subject: [PATCH] Add playbooks/borgmatic-backup.yml --- playbooks/borgmatic-backup.yml | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 playbooks/borgmatic-backup.yml diff --git a/playbooks/borgmatic-backup.yml b/playbooks/borgmatic-backup.yml new file mode 100644 index 0000000..5848ffa --- /dev/null +++ b/playbooks/borgmatic-backup.yml @@ -0,0 +1,57 @@ +--- +- name: Configure Borgmatic backup with deterministic offset + hosts: all + become: true + + vars: + borgmatic_bin: /usr/local/bin/borgmatic + backup_hour: 2 # Base hour to run backups + backup_window: 1800 # 30 min window (in seconds) + borgmatic_config_dir: /etc/borgmatic + + tasks: + - name: Ensure Borg and dependencies are present + package: + name: + - borgbackup + - python3-pip + state: present + + - name: Ensure borgmatic is installed via pip + pip: + name: borgmatic + executable: pip3 + + - name: Create borgmatic config directory + file: + path: "{{ borgmatic_config_dir }}" + state: directory + owner: root + group: root + mode: '0755' + + - name: Generate deterministic backup offset + set_fact: + backup_offset: >- + {{ (inventory_hostname | hash('md5') | int(base=16)) % backup_window }} + + - name: Split offset into minutes and seconds + set_fact: + backup_offset_minutes: "{{ backup_offset // 60 }}" + backup_offset_seconds: "{{ backup_offset % 60 }}" + + - name: Deploy borgmatic config + template: + src: borgmatic-config.yaml.j2 + dest: "{{ borgmatic_config_dir }}/config.yaml" + owner: root + group: root + mode: '0600' + + - name: Create cron job for borgmatic with offset + cron: + name: "Nightly borgmatic backup" + user: root + hour: "{{ backup_hour }}" + minute: "{{ backup_offset_minutes }}" + job: "sleep {{ backup_offset_seconds }} && {{ borgmatic_bin }} --verbosity 1"