diff --git a/roles/debian_server/files/btrfs-scrub b/roles/debian_server/files/btrfs-scrub deleted file mode 100755 index c20dfdd2e69260dbc416ded4ce6638b78e59ba14..0000000000000000000000000000000000000000 --- a/roles/debian_server/files/btrfs-scrub +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -set -eu - -for mp in $(lsblk --list --noheadings --output fstype,mountpoint | \ - awk '$1 == "btrfs" {print $2}' | \ - sort -u) -do - # In case there are no btrfs volumes, the for loop will execute once with an - # empty string for mp. Validate that indeed we're passed a mountpoint. - [ -d "$mp" ] || continue - status="$(btrfs scrub status "$mp" | awk '$1 == "Status:" {print $2}')" - if [ "$status" = 'running' ] - then - echo "Scrub already running on $mp, skipping." >&2 - continue - fi - btrfs scrub start "$mp" >&2 -done diff --git a/roles/debian_server/files/scrub.service b/roles/debian_server/files/scrub.service deleted file mode 100644 index 62f1c8d1784d0441a3b1f9c2b51fa1356cb597f2..0000000000000000000000000000000000000000 --- a/roles/debian_server/files/scrub.service +++ /dev/null @@ -1,8 +0,0 @@ -[Unit] -Description=Scrub btrfs volumes -ConditionACPower=true -After=local-fs.target - -[Service] -Type=oneshot -ExecStart=btrfs-scrub diff --git a/roles/debian_server/tasks/main.yml b/roles/debian_server/tasks/main.yml index 1c262bf3abaa979a98c619e6dd7619c7a44ad264..2410c419997f2c7b5b40d0f5125df1890e4ef41b 100644 --- a/roles/debian_server/tasks/main.yml +++ b/roles/debian_server/tasks/main.yml @@ -235,23 +235,34 @@ name: update.timer state: started -- name: Copy the btrfs scrub script - ansible.builtin.copy: - dest: /usr/local/sbin/btrfs-scrub - mode: 0o0755 - src: btrfs-scrub +- name: Create btrfs scrub services + # yamllint disable rule:line-length + loop: &btrfs_devices |- + {{ ansible_mounts|selectattr("fstype", "equalto", "btrfs")|map(attribute="device")|unique }} + # yamllint enable rule:line-length + ansible.builtin.template: + dest: /etc/systemd/system/scrub{{ name }}.service + mode: 0o0644 + src: scrub.service.j2 + vars: &btrfs_vars + device: '{{ item }}' + name: '{{ item|replace("/", "_") }}' + tags: [scrub] -- name: Copy btrfs scrub service and timer - loop: - - scrub.service - - scrub.timer - ansible.builtin.copy: - dest: /etc/systemd/system +- name: Create btrfs scrub timers + loop: *btrfs_devices + ansible.builtin.template: + dest: /etc/systemd/system/scrub{{ name }}.timer mode: 0o0644 - src: '{{ item }}' + src: scrub.timer.j2 + vars: *btrfs_vars + tags: [scrub] -- name: Enable the btrfs scrub timer +- name: Enable the btrfs scrub timers + loop: *btrfs_devices ansible.builtin.systemd: enabled: true - name: scrub.timer + name: scrub{{ name }}.timer state: started + vars: *btrfs_vars + tags: [scrub] diff --git a/roles/debian_server/templates/scrub.service.j2 b/roles/debian_server/templates/scrub.service.j2 new file mode 100644 index 0000000000000000000000000000000000000000..363628acf603a2c53f392f0cf969244d09893b8d --- /dev/null +++ b/roles/debian_server/templates/scrub.service.j2 @@ -0,0 +1,9 @@ +# vim: filetype=systemd +[Unit] +Description=Scrub btrfs device {{ device }} +ConditionACPower=true +After=local-fs.target + +[Service] +Type=exec +ExecStart=btrfs scrub start -B {{ device }} diff --git a/roles/debian_server/files/scrub.timer b/roles/debian_server/templates/scrub.timer.j2 similarity index 51% rename from roles/debian_server/files/scrub.timer rename to roles/debian_server/templates/scrub.timer.j2 index 849656575316cc6206698771d3d778fe028d5b5d..88e9a6efe7bee79c369245997cadf45e651c422c 100644 --- a/roles/debian_server/files/scrub.timer +++ b/roles/debian_server/templates/scrub.timer.j2 @@ -1,5 +1,6 @@ +# vim: filetype=systemd [Unit] -Description=Scrub btrfs volumes +Description=Scrub btrfs device {{ device }} [Timer] OnCalendar=weekly