diff --git a/ansible/environments/home/host_vars/homeserver b/ansible/environments/home/host_vars/homeserver index 1d0b6d9..d29acc3 100644 --- a/ansible/environments/home/host_vars/homeserver +++ b/ansible/environments/home/host_vars/homeserver @@ -1 +1,3 @@ os_flavor: "freebsd" +zfs_snapshot_datasets: + - zroot/freebsd/computer/be/default diff --git a/ansible/environments/laptop/host_vars/odolinux b/ansible/environments/laptop/host_vars/odolinux index 49d0ac4..9342780 100644 --- a/ansible/environments/laptop/host_vars/odolinux +++ b/ansible/environments/laptop/host_vars/odolinux @@ -10,3 +10,6 @@ users: - name: users - name: docker - name: libvirt +zfs_snapshot_datasets: + - zroot/linux/archmain/home + - zroot/linux/archmain/be diff --git a/ansible/playbook.yaml b/ansible/playbook.yaml index d627f4a..2eee7bd 100644 --- a/ansible/playbook.yaml +++ b/ansible/playbook.yaml @@ -4,3 +4,4 @@ roles: - sudo - users + - zrepl diff --git a/ansible/roles/zrepl/handlers/main.yml b/ansible/roles/zrepl/handlers/main.yml new file mode 100644 index 0000000..0fb3dee --- /dev/null +++ b/ansible/roles/zrepl/handlers/main.yml @@ -0,0 +1,4 @@ +- name: restart zrepl + service: + name: zrepl + state: restarted diff --git a/ansible/roles/zrepl/meta/main.yaml b/ansible/roles/zrepl/meta/main.yaml new file mode 100644 index 0000000..655446a --- /dev/null +++ b/ansible/roles/zrepl/meta/main.yaml @@ -0,0 +1,2 @@ +dependencies: + - users diff --git a/ansible/roles/zrepl/tasks/common.yaml b/ansible/roles/zrepl/tasks/common.yaml new file mode 100644 index 0000000..3cb4183 --- /dev/null +++ b/ansible/roles/zrepl/tasks/common.yaml @@ -0,0 +1,31 @@ +- name: Install packages + package: + name: + - zrepl + state: present + +- name: Create directories + file: + name: "{{ item }}" + state: directory + mode: 0750 + owner: root + group: wheel + loop: + - /usr/local/etc/zrepl + +- name: Configure zrepl + template: + src: templates/zrepl.yml.j2 + dest: /usr/local/etc/zrepl/zrepl.yml + mode: 0440 + owner: root + group: wheel + validate: "zrepl configcheck --config %s" + notify: "restart zrepl" + +- include: tasks/freebsd.yaml + when: 'os_flavor == "freebsd"' + +- include: tasks/linux.yaml + when: 'os_flavor == "linux"' diff --git a/ansible/roles/zrepl/tasks/freebsd.yaml b/ansible/roles/zrepl/tasks/freebsd.yaml new file mode 100644 index 0000000..e69de29 diff --git a/ansible/roles/zrepl/tasks/linux.yaml b/ansible/roles/zrepl/tasks/linux.yaml new file mode 100644 index 0000000..e69de29 diff --git a/ansible/roles/zrepl/tasks/main.yaml b/ansible/roles/zrepl/tasks/main.yaml new file mode 100644 index 0000000..459f178 --- /dev/null +++ b/ansible/roles/zrepl/tasks/main.yaml @@ -0,0 +1,2 @@ +- include: tasks/common.yaml + when: zfs_snapshot_datasets is defined diff --git a/ansible/roles/zrepl/templates/zrepl.yml.j2 b/ansible/roles/zrepl/templates/zrepl.yml.j2 new file mode 100644 index 0000000..e05dc2c --- /dev/null +++ b/ansible/roles/zrepl/templates/zrepl.yml.j2 @@ -0,0 +1,29 @@ +jobs: + +# this job takes care of snapshot creation + pruning +- name: snapjob + type: snap + filesystems: { +{% for dataset in zfs_snapshot_datasets %} + "{{dataset}}<": true, +{% endfor %} + } + # create snapshots with prefix `zrepl_` every 15 minutes + snapshotting: + type: periodic + interval: 15m + prefix: zrepl_ + pruning: + keep: + # fade-out scheme for snapshots starting with `zrepl_` + # - keep all created in the last hour + # - then destroy snapshots such that we keep 24 each 1 hour apart + # - then destroy snapshots such that we keep 14 each 1 day apart + # - then destroy all older snapshots + - type: grid + grid: 1x1h(keep=all) | 24x1h | 14x1d + regex: "^zrepl_.*" + # keep all snapshots that don't have the `zrepl_` prefix + - type: regex + negate: true + regex: "^zrepl_.*"