summaryrefslogtreecommitdiff
path: root/roles/zfs
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2020-08-26 21:03:19 +0200
committerChristian Pointner <equinox@spreadspace.org>2020-08-26 21:05:08 +0200
commitfc3a429dc96d52a8923bebd1820d104a710213f9 (patch)
treeab9ebd81ca8284371ce02dc7bcf4f1f1fd878ae4 /roles/zfs
parentfix installer prompts (diff)
improve zfs pool init support
Diffstat (limited to 'roles/zfs')
-rw-r--r--roles/zfs/base/defaults/main.yml8
-rw-r--r--roles/zfs/base/tasks/enable-systemd-mount-generator.yml4
-rw-r--r--roles/zfs/base/tasks/main.yml32
3 files changed, 32 insertions, 12 deletions
diff --git a/roles/zfs/base/defaults/main.yml b/roles/zfs/base/defaults/main.yml
index c275b981..55dabc59 100644
--- a/roles/zfs/base/defaults/main.yml
+++ b/roles/zfs/base/defaults/main.yml
@@ -4,16 +4,16 @@ zfs_use_systemd_mount_generator: yes
# min: {{ 2 * 1024 * 1024 * 1024 }}
# max: {{ 8 * 1024 * 1024 * 1024 }}
-zfs_zpool_properties:
+zfs_pool_properties:
ashift: 12
-# zfs_zpools:
+# zfs_pools:
# storage:
# mountpoint: /srv/storage
-# create_vdevs: mirror sda sdb mirror sdc sdd log mirror nvme0n1p3 nvme1n1p3 cache nvme0n1p4 nvme1n1p4
+# create_vdevs: mirror /dev/sda /dev/sdb mirror /dev/sdc /dev/sdd log mirror /dev/nvme0n1p3 /dev/nvme1n1p3 cache /dev/nvme0n1p4 /dev/nvme1n1p4
# test:
# mountpoint: /srv/storage
-# create_vdevs: raidz sda sdb sdc sdd
+# create_vdevs: raidz /dev/sda /dev/sdb /dev/sdc /dev/sdd
# properties:
# ashift: 12
# prop: value
diff --git a/roles/zfs/base/tasks/enable-systemd-mount-generator.yml b/roles/zfs/base/tasks/enable-systemd-mount-generator.yml
index 46e709da..eaa3cebe 100644
--- a/roles/zfs/base/tasks/enable-systemd-mount-generator.yml
+++ b/roles/zfs/base/tasks/enable-systemd-mount-generator.yml
@@ -10,8 +10,8 @@
path: /etc/zfs/zfs-list.cache/
state: directory
-- name: create zfs-list.cache file for zpools
- loop: "{{ zfs_zpools | dict2items }}"
+- name: create zfs-list.cache file for all pools
+ loop: "{{ zfs_pools | dict2items }}"
loop_control:
label: "{{ item.key }}"
copy:
diff --git a/roles/zfs/base/tasks/main.yml b/roles/zfs/base/tasks/main.yml
index 54e716a6..e3783ad5 100644
--- a/roles/zfs/base/tasks/main.yml
+++ b/roles/zfs/base/tasks/main.yml
@@ -29,13 +29,33 @@
- name: gather zpool facts
zpool_facts:
-- name: generate list of existing zpools
+- name: generate list of existing pools
set_fact:
- zfs_existing_zpools: "{{ ansible_zfs_pools | map(attribute='name') | list }}"
+ zfs_existing_pools: "{{ ansible_zfs_pools | map(attribute='name') | list }}"
-- name: create zpools
- loop: "{{ zfs_zpools | dict2items }}"
+- name: try to import existing pools
+ loop: "{{ zfs_pools | dict2items }}"
loop_control:
label: "{{ item.key }}"
- when: item.key not in zfs_existing_zpools
- command: "zpool create -m {{ item.value.mountpoint }} {% for prop, value in (item.value.properties | default(zfs_zpool_properties)).items() %}-o {{ prop }}={{ value }} {% endfor %}{{ item.key }} {{ item.value.create_vdevs }}"
+ when: item.key not in zfs_existing_pools
+ command: "zpool import{% for dev in (item.value.create_vdevs.split(' ') | select('match', '^/dev/') ) %} -d {{ dev }}{% endfor %} -f {{ item.key }}"
+ register: zfs_import_result
+ failed_when:
+ - zfs_import_result.rc == 0
+ - (zfs_import_result.stderr_lines | reject("regex", " no such pool available$") | list | length) > 0
+ changed_when:
+ - (zfs_import_result.stderr_lines | length) == 0
+
+- name: gather zpool facts (again)
+ zpool_facts:
+
+- name: generate list of existing pools (again)
+ set_fact:
+ zfs_existing_pools: "{{ ansible_zfs_pools | map(attribute='name') | list }}"
+
+- name: create pools
+ loop: "{{ zfs_pools | dict2items }}"
+ loop_control:
+ label: "{{ item.key }}"
+ when: item.key not in zfs_existing_pools
+ command: "zpool create -m {{ item.value.mountpoint }} {% for prop, value in (item.value.properties | default(zfs_pool_properties)).items() %}-o {{ prop }}={{ value }} {% endfor %}{{ item.key }} {{ item.value.create_vdevs }}"