From fc3a429dc96d52a8923bebd1820d104a710213f9 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 26 Aug 2020 21:03:19 +0200 Subject: improve zfs pool init support --- .../base/tasks/enable-systemd-mount-generator.yml | 4 +-- roles/zfs/base/tasks/main.yml | 32 ++++++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) (limited to 'roles/zfs/base/tasks') 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 }}" -- cgit v1.2.3