From 3ff4400844a08305e313d2aae058e86c20a74f5b Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 19 Jun 2021 23:14:53 +0200 Subject: add workaround for check-mode of zfs module --- filter_plugins/zfs.py | 34 +++++++++++++++++++++++++++ roles/apps/etherpad-lite/tasks/main.yml | 4 ++-- roles/apps/keycloak/tasks/main.yml | 4 ++-- roles/apps/nextcloud/tasks/main.yml | 4 ++-- roles/apps/onlyoffice/tasks/main.yml | 4 ++-- roles/chaos-at-home/fileserver/tasks/main.yml | 2 +- roles/storage/zfs/volume/tasks/main.yml | 2 +- roles/vm/guest/install/tasks/main.yml | 2 +- roles/ws/base/tasks/main.yml | 2 +- 9 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 filter_plugins/zfs.py diff --git a/filter_plugins/zfs.py b/filter_plugins/zfs.py new file mode 100644 index 00000000..ebdb4dc5 --- /dev/null +++ b/filter_plugins/zfs.py @@ -0,0 +1,34 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from functools import partial + +from ansible import errors +from ansible.module_utils.common.text import formatters + + +def dehumanize_zfs_properties(data): + ''' zfs module sometimes wrongly indicates changed=true in check mode if sizes use human-readable format ''' + try: + from jinja2.runtime import Undefined + + if isinstance(data, Undefined): + return data + + for prop, value in data.items(): + if prop in ['quota', 'refquota', 'reservation', 'refreservation', 'recordsize', 'volsize']: + data[prop] = str(formatters.human_to_bytes(value)) + return data + except Exception as e: + raise errors.AnsibleFilterError("dehumanize_zfs_properties(): %s" % str(e)) + + +class FilterModule(object): + + ''' zfs filters ''' + filter_map = { + 'dehumanize_zfs_properties': dehumanize_zfs_properties, + } + + def filters(self): + return self.filter_map diff --git a/roles/apps/etherpad-lite/tasks/main.yml b/roles/apps/etherpad-lite/tasks/main.yml index ef6a54d4..072a6c09 100644 --- a/roles/apps/etherpad-lite/tasks/main.yml +++ b/roles/apps/etherpad-lite/tasks/main.yml @@ -6,7 +6,7 @@ zfs: name: "{{ etherpad_lite_zfs.pool }}/{{ etherpad_lite_zfs.name }}" state: present - extra_zfs_properties: "{{ etherpad_lite_zfs.properties | default(omit) }}" + extra_zfs_properties: "{{ etherpad_lite_zfs.properties | dehumanize_zfs_properties | default(omit) }}" - name: create zfs volumes for instances loop: "{{ etherpad_lite_instances | dict2items }}" @@ -15,7 +15,7 @@ zfs: name: "{{ etherpad_lite_zfs.pool }}/{{ etherpad_lite_zfs.name }}/{{ item.key }}" state: present - extra_zfs_properties: "{{ item.value.zfs_properties | default(omit) }}" + extra_zfs_properties: "{{ item.value.zfs_properties | dehumanize_zfs_properties | default(omit) }}" - name: configure etherpad_lite base bath set_fact: diff --git a/roles/apps/keycloak/tasks/main.yml b/roles/apps/keycloak/tasks/main.yml index 3df78018..a54f0397 100644 --- a/roles/apps/keycloak/tasks/main.yml +++ b/roles/apps/keycloak/tasks/main.yml @@ -6,7 +6,7 @@ zfs: name: "{{ keycloak_zfs.pool }}/{{ keycloak_zfs.name }}" state: present - extra_zfs_properties: "{{ keycloak_zfs.properties | default(omit) }}" + extra_zfs_properties: "{{ keycloak_zfs.properties | dehumanize_zfs_properties | default(omit) }}" - name: create zfs volumes for instances loop: "{{ keycloak_instances | dict2items }}" @@ -15,7 +15,7 @@ zfs: name: "{{ keycloak_zfs.pool }}/{{ keycloak_zfs.name }}/{{ item.key }}" state: present - extra_zfs_properties: "{{ item.value.zfs_properties | default(omit) }}" + extra_zfs_properties: "{{ item.value.zfs_properties | dehumanize_zfs_properties | default(omit) }}" - name: configure keycloak base bath set_fact: diff --git a/roles/apps/nextcloud/tasks/main.yml b/roles/apps/nextcloud/tasks/main.yml index 8d930b9a..e7a2fe78 100644 --- a/roles/apps/nextcloud/tasks/main.yml +++ b/roles/apps/nextcloud/tasks/main.yml @@ -6,7 +6,7 @@ zfs: name: "{{ nextcloud_zfs.pool }}/{{ nextcloud_zfs.name }}" state: present - extra_zfs_properties: "{{ nextcloud_zfs.properties | default(omit) }}" + extra_zfs_properties: "{{ nextcloud_zfs.properties | dehumanize_zfs_properties | default(omit) }}" - name: create zfs volumes for instances loop: "{{ nextcloud_instances | dict2items }}" @@ -15,7 +15,7 @@ zfs: name: "{{ nextcloud_zfs.pool }}/{{ nextcloud_zfs.name }}/{{ item.key }}" state: present - extra_zfs_properties: "{{ item.value.zfs_properties | default(omit) }}" + extra_zfs_properties: "{{ item.value.zfs_properties | dehumanize_zfs_properties | default(omit) }}" - name: configure nextcloud base bath set_fact: diff --git a/roles/apps/onlyoffice/tasks/main.yml b/roles/apps/onlyoffice/tasks/main.yml index bde60e5b..a41dd96d 100644 --- a/roles/apps/onlyoffice/tasks/main.yml +++ b/roles/apps/onlyoffice/tasks/main.yml @@ -6,7 +6,7 @@ zfs: name: "{{ onlyoffice_zfs.pool }}/{{ onlyoffice_zfs.name }}" state: present - extra_zfs_properties: "{{ onlyoffice_zfs.properties | default(omit) }}" + extra_zfs_properties: "{{ onlyoffice_zfs.properties | dehumanize_zfs_properties | default(omit) }}" - name: create zfs volumes for instances loop: "{{ onlyoffice_instances | dict2items }}" @@ -15,7 +15,7 @@ zfs: name: "{{ onlyoffice_zfs.pool }}/{{ onlyoffice_zfs.name }}/{{ item.key }}" state: present - extra_zfs_properties: "{{ item.value.zfs_properties | default(omit) }}" + extra_zfs_properties: "{{ item.value.zfs_properties | dehumanize_zfs_properties | default(omit) }}" - name: configure onlyoffice base bath set_fact: diff --git a/roles/chaos-at-home/fileserver/tasks/main.yml b/roles/chaos-at-home/fileserver/tasks/main.yml index 936abd89..41a2975c 100644 --- a/roles/chaos-at-home/fileserver/tasks/main.yml +++ b/roles/chaos-at-home/fileserver/tasks/main.yml @@ -6,7 +6,7 @@ zfs: name: "{{ item.pool | default(fileserver_zfs_default_pool) }}/{{ item.name }}" state: present - extra_zfs_properties: "{{ fileserver_zfs_common_properties | combine(item.properties | default({})) }}" + extra_zfs_properties: "{{ fileserver_zfs_common_properties | combine(item.properties | default({})) | dehumanize_zfs_properties }}" - name: install nfs-server and rsync apt: diff --git a/roles/storage/zfs/volume/tasks/main.yml b/roles/storage/zfs/volume/tasks/main.yml index 834bfd18..7c2c27c7 100644 --- a/roles/storage/zfs/volume/tasks/main.yml +++ b/roles/storage/zfs/volume/tasks/main.yml @@ -2,7 +2,7 @@ - name: create zfs dataset zfs: name: "{{ zfs_volume.pool }}/{{ zfs_volume.name }}" - extra_zfs_properties: "{{ zfs_volume.properties | default(omit) }}" + extra_zfs_properties: "{{ zfs_volume.properties | dehumanize_zfs_properties | default(omit) }}" state: present - name: bind mount filesystem diff --git a/roles/vm/guest/install/tasks/main.yml b/roles/vm/guest/install/tasks/main.yml index 32bd9b7b..06987bc3 100644 --- a/roles/vm/guest/install/tasks/main.yml +++ b/roles/vm/guest/install/tasks/main.yml @@ -28,7 +28,7 @@ zfs: name: "{{ vm_host_cooked.zfs[item.value.backend | default('default')].pool }}/{{ vm_host_cooked.zfs[item.value.backend | default('default')].name }}/{{ inventory_hostname }}/{{ item.value.name }}" state: present - extra_zfs_properties: "{{ item.value.properties | default({}) | combine({'volsize': item.value.size}) }}" + extra_zfs_properties: "{{ item.value.properties | default({}) | combine({'volsize': item.value.size}) | dehumanize_zfs_properties }}" - delegate_to: "{{ vm_host_cooked.name }}" diff --git a/roles/ws/base/tasks/main.yml b/roles/ws/base/tasks/main.yml index 6e96eff8..8a1e8bd5 100644 --- a/roles/ws/base/tasks/main.yml +++ b/roles/ws/base/tasks/main.yml @@ -4,7 +4,7 @@ zfs: name: "{{ ws_base_home_zfs.pool }}/{{ ws_base_home_zfs.name }}" state: present - extra_zfs_properties: "{{ ws_base_home_zfs.properties | default({}) | combine({'mountpoint': '/home'}) }}" + extra_zfs_properties: "{{ ws_base_home_zfs.properties | default({}) | combine({'mountpoint': '/home'}) | dehumanize_zfs_properties }}" - name: hide ntfs disks when: ws_base_hide_ntfs_disks is defined -- cgit v1.2.3