diff options
Diffstat (limited to 'roles/zfs')
-rw-r--r-- | roles/zfs/defaults/main.yml | 10 | ||||
-rw-r--r-- | roles/zfs/handlers/main.yml | 4 | ||||
-rw-r--r-- | roles/zfs/meta/main.yml | 4 | ||||
-rw-r--r-- | roles/zfs/tasks/create_zpool.yml | 20 | ||||
-rw-r--r-- | roles/zfs/tasks/main.yml | 70 | ||||
-rw-r--r-- | roles/zfs/templates/etc/systemd/system/zfs-scrub@.service.j2 | 11 | ||||
-rw-r--r-- | roles/zfs/templates/etc/systemd/system/zfs-scrub@.timer.j2 | 10 | ||||
-rw-r--r-- | roles/zfs/templates/etc/systemd/system/zfs-trim@.service.j2 | 11 | ||||
-rw-r--r-- | roles/zfs/templates/etc/systemd/system/zfs-trim@.timer.j2 | 10 | ||||
-rw-r--r-- | roles/zfs/templates/etc/zfs/zed.d/zed.rc.j2 | 10 | ||||
-rw-r--r-- | roles/zfs/vars/main.yml | 6 |
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 |