summaryrefslogtreecommitdiff
path: root/roles
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2022-01-16 01:11:39 +0100
committerChristian Pointner <equinox@spreadspace.org>2022-01-16 01:11:39 +0100
commit75de595335e6ad8b3f707f13ae72f18e922b9254 (patch)
treea9b772e9ab780df64ccf7669e7b69c9a4008c4e2 /roles
parent(zfs|lvm)/volume: add handling of owner/group and permissions (diff)
storage/volumes: support nesting
Diffstat (limited to 'roles')
-rw-r--r--roles/storage/lvm/volume/defaults/main.yml4
-rw-r--r--roles/storage/lvm/volume/tasks/main.yml56
-rw-r--r--roles/storage/zfs/volume/defaults/main.yml3
-rw-r--r--roles/storage/zfs/volume/tasks/main.yml23
4 files changed, 61 insertions, 25 deletions
diff --git a/roles/storage/lvm/volume/defaults/main.yml b/roles/storage/lvm/volume/defaults/main.yml
index 89876087..a64a7c86 100644
--- a/roles/storage/lvm/volume/defaults/main.yml
+++ b/roles/storage/lvm/volume/defaults/main.yml
@@ -1,7 +1,11 @@
---
# lvm_volume:
+# parent:
+# type: lvm
+# ...
# vg: foo
# lv: bar
+# thinpool: false
# size: 10G
# fs: ext4
# dest: /srv/foo/bar
diff --git a/roles/storage/lvm/volume/tasks/main.yml b/roles/storage/lvm/volume/tasks/main.yml
index 2537c28c..166d6ff8 100644
--- a/roles/storage/lvm/volume/tasks/main.yml
+++ b/roles/storage/lvm/volume/tasks/main.yml
@@ -1,26 +1,44 @@
---
+- name: check volume parent
+ when: "'parent' in lvm_volume"
+ assert:
+ msg: "the volume parent must be a lvm thinpool"
+ that:
+ - lvm_volume.parent.type == 'lvm'
+ - (lvm_volume.parent.thinpool | default(false))
+
+- name: install thin-provisioning-tools
+ when: (lvm_volume.thinpool | default(false))
+ apt:
+ name: thin-provisioning-tools
+ state: present
+
- name: create logical volume
lvol:
- vg: "{{ lvm_volume.vg }}"
- lv: "{{ lvm_volume.lv }}"
+ vg: "{{ lvm_volume.parent.vg | default(lvm_volume.vg) }}"
+ lv: "{{ (lvm_volume.thinpool | default(false)) | ternary(omit, lvm_volume.lv) }}"
size: "{{ lvm_volume.size }}"
+ thinpool: "{{ (lvm_volume.thinpool | default(false)) | ternary(lvm_volume.lv, (lvm_volume.parent.lv | default(omit))) }}"
-- name: create filesystem
- filesystem:
- fstype: "{{ lvm_volume.fs }}"
- dev: "/dev/mapper/{{ lvm_volume.vg | replace('-', '--') }}-{{ lvm_volume.lv | replace('-', '--') }}"
+- name: create and mount filesystem
+ when: not (lvm_volume.thinpool | default(false))
+ block:
+ - name: create filesystem
+ filesystem:
+ fstype: "{{ lvm_volume.fs }}"
+ dev: "/dev/mapper/{{ lvm_volume.parent.vg | default(lvm_volume.vg) | replace('-', '--') }}-{{ lvm_volume.lv | replace('-', '--') }}"
-- name: mount filesytem
- mount:
- src: "/dev/mapper/{{ lvm_volume.vg | replace('-', '--') }}-{{ lvm_volume.lv | replace('-', '--') }}"
- path: "{{ lvm_volume.dest }}"
- fstype: "{{ lvm_volume.fs }}"
- state: mounted
+ - name: mount filesytem
+ mount:
+ src: "/dev/mapper/{{ lvm_volume.parent.vg | default(lvm_volume.vg) | replace('-', '--') }}-{{ lvm_volume.lv | replace('-', '--') }}"
+ path: "{{ lvm_volume.dest }}"
+ fstype: "{{ lvm_volume.fs }}"
+ state: mounted
-- name: set volume owner/group and mode
- file:
- state: directory
- path: "{{ lvm_volume.dest }}"
- mode: "{{ lvm_volume.mode | default(omit) }}"
- owner: "{{ lvm_volume.owner | default(omit) }}"
- group: "{{ lvm_volume.group | default(omit) }}"
+ - name: set volume owner/group and mode
+ file:
+ state: directory
+ path: "{{ lvm_volume.dest }}"
+ mode: "{{ lvm_volume.mode | default(omit) }}"
+ owner: "{{ lvm_volume.owner | default(omit) }}"
+ group: "{{ lvm_volume.group | default(omit) }}"
diff --git a/roles/storage/zfs/volume/defaults/main.yml b/roles/storage/zfs/volume/defaults/main.yml
index b4df433e..bb1c0c6d 100644
--- a/roles/storage/zfs/volume/defaults/main.yml
+++ b/roles/storage/zfs/volume/defaults/main.yml
@@ -1,5 +1,8 @@
---
# zfs_volume:
+# parent:
+# type: zfs
+# ...
# pool: tank
# name: foo/bar
# properties:
diff --git a/roles/storage/zfs/volume/tasks/main.yml b/roles/storage/zfs/volume/tasks/main.yml
index 1bd198bb..0dc0e82d 100644
--- a/roles/storage/zfs/volume/tasks/main.yml
+++ b/roles/storage/zfs/volume/tasks/main.yml
@@ -1,18 +1,29 @@
---
+ ## TODO: implement recursive nesting
+- name: check volume parent
+ when: "'parent' in zfs_volume"
+ assert:
+ msg: "the volume parent must be of type zfs and must not have a parent"
+ that:
+ - zfs_volume.parent.type == 'zfs'
+ - "'parent' not in zfs_volume.parent"
+
- name: create zfs dataset
zfs:
- name: "{{ zfs_volume.pool }}/{{ zfs_volume.name }}"
+ name: "{{ ('parent' in zfs_volume) | ternary((zfs_volume.parent.pool | default(''))~'/'~(zfs_volume.parent.name | default('')), zfs_volume.pool) }}/{{ zfs_volume.name }}"
extra_zfs_properties: "{{ zfs_volume.properties | dehumanize_zfs_properties | default(omit) }}"
state: present
+- name: compute derivated mountpoint
+ set_fact:
+ zfs_volume_mountpoint: "{{ (zfs_pools[zfs_volume.parent.pool | default(zfs_volume.pool)].mountpoint, ('parent' in zfs_volume) | ternary((zfs_volume.parent.name | default('')), ''), zfs_volume.name) | path_join }}"
+
- name: bind mount filesystem
- vars:
- zfs_mountpoint: "{{ (zfs_pools[zfs_volume.pool].mountpoint, zfs_volume.name) | path_join }}"
when:
- "'dest' in zfs_volume"
- - zfs_volume.dest != zfs_mountpoint
+ - zfs_volume.dest != zfs_volume_mountpoint
mount:
- src: "{{ zfs_mountpoint }}"
+ src: "{{ zfs_volume_mountpoint }}"
path: "{{ zfs_volume.dest }}"
fstype: none
opts: bind,x-systemd.automount,nofail
@@ -21,7 +32,7 @@
- name: set volume owner/group and mode
file:
state: directory
- path: "{{ zfs_volume.dest | default((zfs_pools[zfs_volume.pool].mountpoint, zfs_volume.name) | path_join) }}"
+ path: "{{ zfs_volume.dest | default(zfs_volume_mountpoint) }}"
mode: "{{ zfs_volume.mode | default(omit) }}"
owner: "{{ zfs_volume.owner | default(omit) }}"
group: "{{ zfs_volume.group | default(omit) }}"