From 75de595335e6ad8b3f707f13ae72f18e922b9254 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 16 Jan 2022 01:11:39 +0100 Subject: storage/volumes: support nesting --- roles/storage/lvm/volume/defaults/main.yml | 4 +++ roles/storage/lvm/volume/tasks/main.yml | 56 ++++++++++++++++++++---------- roles/storage/zfs/volume/defaults/main.yml | 3 ++ roles/storage/zfs/volume/tasks/main.yml | 23 ++++++++---- 4 files changed, 61 insertions(+), 25 deletions(-) (limited to 'roles') 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) }}" -- cgit v1.2.3