From b439a44bc80cac4e8671b776406f4259e8ce06d1 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 11 Jan 2024 23:31:54 +0100 Subject: make generic use of storage/zfs, storage/lvm and storage/directory possible --- roles/storage/zfs/base/defaults/main.yml | 30 +++++++++++++++++++ roles/storage/zfs/base/filter_plugins/zfs.py | 43 ++++++++++++++++++++++++++++ roles/storage/zfs/base/tasks/main.yml | 9 ++++++ 3 files changed, 82 insertions(+) create mode 100644 roles/storage/zfs/base/filter_plugins/zfs.py (limited to 'roles/storage/zfs/base') diff --git a/roles/storage/zfs/base/defaults/main.yml b/roles/storage/zfs/base/defaults/main.yml index 1566890d..df56f0c8 100644 --- a/roles/storage/zfs/base/defaults/main.yml +++ b/roles/storage/zfs/base/defaults/main.yml @@ -17,3 +17,33 @@ zfs_pool_default_properties: # properties: # ashift: 12 # prop: value + +zfs_volumes: {} + +# zfs_volumes: +# storage: +# test: +# properties: +# quota: 1G +# bar: +# properties: +# quota: 4G +# children: +# blub: +# properties: +# quota: 3G +# xattr: sa +# acltype: posix +# hugo: +# properties: +# mountpoint: /var/lib/hugo +# quota: 2G +# children: +# ben: {} +# after: +# properties: +# quota: 100M +# test: +# sub1: +# properties: +# quota: 512M diff --git a/roles/storage/zfs/base/filter_plugins/zfs.py b/roles/storage/zfs/base/filter_plugins/zfs.py new file mode 100644 index 00000000..a336c197 --- /dev/null +++ b/roles/storage/zfs/base/filter_plugins/zfs.py @@ -0,0 +1,43 @@ +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +from functools import partial +from copy import deepcopy + +from ansible import errors + + +def _recurse_pool_volumes(pool, prefix, volumes): + result = [] + if prefix != '': + prefix = prefix + '/' + for name, volume in volumes.items(): + entry = deepcopy(volume) + entry.pop('children', None) + entry['pool'] = pool + entry['name'] = prefix+name + result.append(entry) + if 'children' in volume: + result = result + _recurse_pool_volumes(pool, entry['name'], volume['children']) + + return result + + +def zfs_volume_list(data): + try: + result = [] + for pool, volumes in data.items(): + result = result + _recurse_pool_volumes(pool, '', volumes) + return result + except Exception as e: + raise errors.AnsibleFilterError("zfs_volume_list(): %s" % str(e)) + + +class FilterModule(object): + + filter_map = { + 'zfs_volume_list': zfs_volume_list, + } + + def filters(self): + return self.filter_map diff --git a/roles/storage/zfs/base/tasks/main.yml b/roles/storage/zfs/base/tasks/main.yml index 99b8e228..b731bb1f 100644 --- a/roles/storage/zfs/base/tasks/main.yml +++ b/roles/storage/zfs/base/tasks/main.yml @@ -59,3 +59,12 @@ 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_default_properties)).items() %}-o {{ prop }}={{ value }} {% endfor %}{{ item.key }} {{ item.value.create_vdevs }}" + +- name: create zfs volumes + loop: "{{ zfs_volumes | zfs_volume_list }}" + loop_control: + label: "{{ item.pool }}/{{ item.name }}" + vars: + zfs_volume: "{{ item }}" + include_role: + name: storage/zfs/volume -- cgit v1.2.3