aboutsummaryrefslogtreecommitdiffstats
path: root/roles/zfs
diff options
context:
space:
mode:
authorStonewall Jackson <stonewall@sacredheartsc.com>2023-02-04 01:23:43 -0500
committerStonewall Jackson <stonewall@sacredheartsc.com>2023-02-04 01:52:13 -0500
commit0261e875679f1bf63c8d689da7fc7e014597885d (patch)
tree3f19cd74a0c1070944f75437f30b098d6ef2ffcb /roles/zfs
downloadselfhosted-0261e875679f1bf63c8d689da7fc7e014597885d.tar.gz
selfhosted-0261e875679f1bf63c8d689da7fc7e014597885d.zip
initial commit
Diffstat (limited to 'roles/zfs')
-rw-r--r--roles/zfs/defaults/main.yml10
-rw-r--r--roles/zfs/handlers/main.yml4
-rw-r--r--roles/zfs/meta/main.yml4
-rw-r--r--roles/zfs/tasks/create_zpool.yml20
-rw-r--r--roles/zfs/tasks/main.yml70
-rw-r--r--roles/zfs/templates/etc/systemd/system/zfs-scrub@.service.j211
-rw-r--r--roles/zfs/templates/etc/systemd/system/zfs-scrub@.timer.j210
-rw-r--r--roles/zfs/templates/etc/systemd/system/zfs-trim@.service.j211
-rw-r--r--roles/zfs/templates/etc/systemd/system/zfs-trim@.timer.j210
-rw-r--r--roles/zfs/templates/etc/zfs/zed.d/zed.rc.j210
-rw-r--r--roles/zfs/vars/main.yml6
11 files changed, 166 insertions, 0 deletions
diff --git a/roles/zfs/defaults/main.yml b/roles/zfs/defaults/main.yml
new file mode 100644
index 0000000..bb080b7
--- /dev/null
+++ b/roles/zfs/defaults/main.yml
@@ -0,0 +1,10 @@
+zfs_pools: []
+zfs_datasets: []
+zfs_trim_on_calendar: monthly
+zfs_scrub_on_calendar: monthly
+
+zfs_zed_email: root
+zfs_zed_verbose: yes
+zfs_zed_notify_interval_sec: 3600
+
+zfs_auto_snapshot_version: master
diff --git a/roles/zfs/handlers/main.yml b/roles/zfs/handlers/main.yml
new file mode 100644
index 0000000..e85164d
--- /dev/null
+++ b/roles/zfs/handlers/main.yml
@@ -0,0 +1,4 @@
+- name: restart zfs-zed
+ systemd:
+ name: zfs-zed
+ state: restarted
diff --git a/roles/zfs/meta/main.yml b/roles/zfs/meta/main.yml
new file mode 100644
index 0000000..08f6bb2
--- /dev/null
+++ b/roles/zfs/meta/main.yml
@@ -0,0 +1,4 @@
+dependencies:
+ - role: yum
+ yum_repositories: zfs-kmod
+ tags: yum
diff --git a/roles/zfs/tasks/create_zpool.yml b/roles/zfs/tasks/create_zpool.yml
new file mode 100644
index 0000000..a99eb75
--- /dev/null
+++ b/roles/zfs/tasks/create_zpool.yml
@@ -0,0 +1,20 @@
+- name: check if zpool exists
+ command: zpool list -Ho name {{ zpool.name }}
+ failed_when: no
+ changed_when: no
+ register: zpool_exists
+
+- name: create zpools
+ command: >
+ zpool create
+ {% for property in (zpool.properties | default({}) | dict2items) %}
+ -o {{ item.key }}={{ item.value }}
+ {% endfor %}
+ {% if zpool.mountpoint is defined %}
+ -m {{ zpool.mountpoint }}
+ {% endif %}
+ {{ zpool.name }}
+ {% for vdev in zpool.vdevs %}
+ {{ vdev.type }} {% if vdev.type == 'log' and vdev.devices | length > 1 %}mirror {% endif %}{{ vdev.devices | join(' ') }}
+ {% endfor %}
+ when: zpool_exists.rc == 1
diff --git a/roles/zfs/tasks/main.yml b/roles/zfs/tasks/main.yml
new file mode 100644
index 0000000..639b6c6
--- /dev/null
+++ b/roles/zfs/tasks/main.yml
@@ -0,0 +1,70 @@
+- name: install packages
+ dnf:
+ name: '{{ zfs_packages }}'
+ state: present
+
+- name: modprobe zfs
+ modprobe:
+ name: zfs
+ state: present
+
+- name: create systemd units
+ template:
+ src: etc/systemd/system/zfs-{{ item[0] }}@.{{ item[1] }}.j2
+ dest: /etc/systemd/system/zfs-{{ item[0] }}@.{{ item[1] }}
+ loop: "{{ ['scrub', 'trim'] | product(['service', 'timer']) }}"
+ register: zfs_units
+
+- name: reload systemd units
+ systemd:
+ daemon-reload: yes
+ when: zfs_units.changed
+
+- name: create zpools
+ include_tasks: create_zpool.yml
+ loop: '{{ zfs_pools }}'
+ loop_control:
+ loop_var: zpool
+ label: '{{ zpool.name }}'
+
+- name: create datasets
+ zfs:
+ name: '{{ item if item is string else item.name }}'
+ state: present
+ extra_zfs_properties: '{{ omit if item is string else (item.properties | default({})) }}'
+ loop: '{{ zfs_datasets }}'
+
+- name: enable periodic trim and scrub
+ systemd:
+ name: zfs-{{ item[1] }}@{{ item[0].name }}.timer
+ state: started
+ enabled: yes
+ loop: "{{ zfs_pools | product(['trim', 'scrub']) }}"
+ loop_control:
+ label: zfs-{{ item[1] }}@{{ item[0].name }}.timer
+
+- name: generate zed config file
+ template:
+ src: etc/zfs/zed.d/zed.rc.j2
+ dest: /etc/zfs/zed.d/zed.rc
+ notify: restart zfs-zed
+
+- name: enable zfs event daemon
+ systemd:
+ name: zfs-zed
+ enabled: yes
+ state: started
+
+- name: clone zfs-auto-snapshot
+ git:
+ repo: '{{ zfs_auto_snapshot_repo }}'
+ update: yes
+ version: '{{ zfs_auto_snapshot_version }}'
+ dest: '{{ zfs_auto_snapshot_dir }}'
+ register: zfs_auto_snapshot_git
+
+- name: install zfs-auto-snapshot
+ command:
+ cmd: make install PREFIX=/usr
+ chdir: '{{ zfs_auto_snapshot_dir }}'
+ when: zfs_auto_snapshot_git.changed
diff --git a/roles/zfs/templates/etc/systemd/system/zfs-scrub@.service.j2 b/roles/zfs/templates/etc/systemd/system/zfs-scrub@.service.j2
new file mode 100644
index 0000000..3dfb199
--- /dev/null
+++ b/roles/zfs/templates/etc/systemd/system/zfs-scrub@.service.j2
@@ -0,0 +1,11 @@
+[Unit]
+Description=zpool scrub for %i
+
+[Service]
+Nice=19
+IOSchedulingClass=idle
+KillSignal=SIGINT
+ExecStart=zpool scrub %i
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/zfs/templates/etc/systemd/system/zfs-scrub@.timer.j2 b/roles/zfs/templates/etc/systemd/system/zfs-scrub@.timer.j2
new file mode 100644
index 0000000..d7b35e2
--- /dev/null
+++ b/roles/zfs/templates/etc/systemd/system/zfs-scrub@.timer.j2
@@ -0,0 +1,10 @@
+[Unit]
+Description=zpool scrub for %i on calendar interval
+
+[Timer]
+OnCalendar={{ zfs_scrub_on_calendar }}
+AccuracySec=1h
+Persistent=true
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/zfs/templates/etc/systemd/system/zfs-trim@.service.j2 b/roles/zfs/templates/etc/systemd/system/zfs-trim@.service.j2
new file mode 100644
index 0000000..ef3ec43
--- /dev/null
+++ b/roles/zfs/templates/etc/systemd/system/zfs-trim@.service.j2
@@ -0,0 +1,11 @@
+[Unit]
+Description=zpool trim for %i
+
+[Service]
+Nice=19
+IOSchedulingClass=idle
+KillSignal=SIGINT
+ExecStart=zpool trim %i
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/zfs/templates/etc/systemd/system/zfs-trim@.timer.j2 b/roles/zfs/templates/etc/systemd/system/zfs-trim@.timer.j2
new file mode 100644
index 0000000..77e5535
--- /dev/null
+++ b/roles/zfs/templates/etc/systemd/system/zfs-trim@.timer.j2
@@ -0,0 +1,10 @@
+[Unit]
+Description=Zpool trim for %i on calendar interval
+
+[Timer]
+OnCalendar={{ zfs_trim_on_calendar }}
+AccuracySec=1h
+Persistent=true
+
+[Install]
+WantedBy=multi-user.target
diff --git a/roles/zfs/templates/etc/zfs/zed.d/zed.rc.j2 b/roles/zfs/templates/etc/zfs/zed.d/zed.rc.j2
new file mode 100644
index 0000000..4a09398
--- /dev/null
+++ b/roles/zfs/templates/etc/zfs/zed.d/zed.rc.j2
@@ -0,0 +1,10 @@
+ZED_EMAIL_ADDR="{{ zfs_zed_email }}"
+ZED_EMAIL_PROG="mail"
+ZED_EMAIL_OPTS="-s '@SUBJECT@' @ADDRESS@"
+
+ZED_NOTIFY_INTERVAL_SECS={{ zfs_zed_notify_interval_sec }}
+ZED_NOTIFY_VERBOSE={{ zfs_zed_verbose | bool | int }}
+
+ZED_USE_ENCLOSURE_LEDS=1
+
+ZED_SYSLOG_SUBCLASS_EXCLUDE="history_event"
diff --git a/roles/zfs/vars/main.yml b/roles/zfs/vars/main.yml
new file mode 100644
index 0000000..e4781f5
--- /dev/null
+++ b/roles/zfs/vars/main.yml
@@ -0,0 +1,6 @@
+zfs_packages:
+ - zfs
+ - git
+ - make
+zfs_auto_snapshot_repo: https://github.com/zfsonlinux/zfs-auto-snapshot
+zfs_auto_snapshot_dir: /usr/local/src/zfs-auto-snapshot