add action to extand LVM based volume with additionall drives

We need ability to extend filesystem on lvm with additional hard drives.

Usecase:

  • Host drives:
    • /dev/sda
    • /dev/sdb
  • LVM Device before run:
    • centos_local/root @ /dev/sda3
  • expected LVM Device after run:
    • centos_local/root @ /dev/sda3,/dev/sdb1

Examples below assume (for testing pourpouses):

  • Partitions used by lvm before run /dev/vdb1
  • Partitions used by lvm after run /dev/vdb1 /dev/vdc1

Bash steps to achive goal (assuming filesystem is xfs)

parted -s /dev/vdc "mklabel gpt unit mib mkpart primary 1% 100% set 1 lvm on" # Create lvm partiton
pvcreate /dev/vdc1                         # init lvm device
vgextend centos_local /dev/vdc1            # add LVM Device to Volume Group
lvextend -l +100%FREE centos_local/root    # Extend LVM volume to maximum available
xfs_growfs /dev/centos_local/root          # Resize filesystem

Example implementation:

- name: "extend LVM backed filesystem"
  hosts: all
  vars: 
    # Action arguemtns
    filesystem_extend_lvm_devices:
      - "vdc"
    filesystem_extend_lvm_vg: "centos_local"
    filesystem_extend_lvm_lv: "root"

    # Action vars
    _filesystem_empty_drives: |-
      [
        {% for device, params in ansible_facts.devices.items() %}
          {% if params.partitions == {} and params.vendor != None %}
            "{{ device }}",
          {% endif %}
        {% endfor %}
      ]
    _filesystem_extend_lvm_partitions: "{{ filesystem_extend_lvm_devices | map('regex_replace', '(.*)', '/dev/\\g<1>1')| list }}"
    _filesystem_lvm_filesystem: |-
      {{ 
        (
          ansible_facts.mounts
          | selectattr('device', 'equalto', '/dev/mapper/' ~ filesystem_extend_lvm_vg ~ '-' ~ filesystem_extend_lvm_lv) 
          | first
        ).fstype
      }}
  tasks:
    - name: "Create partitions"
      become: yes
      parted:
        device: "/dev/{{ item }}"
        number: 1
        flags: 
          - "lvm"
        state: "present"
      loop: "{{ filesystem_extend_lvm_devices | intersect(_filesystem_empty_drives) }}"

    - name: "extend volume group"
      become: yes
      lvg:
        vg: "{{ filesystem_extend_lvm_vg }}"
        pvs: "{{ _filesystem_extend_lvm_partitions | join(',') }}"

    - name: "extend logival volume"
      become: yes
      lvol:
        vg: "{{ filesystem_extend_lvm_vg }}"
        lv: "{{ filesystem_extend_lvm_lv }}"
        size: +100%FREE

    - name: "resize filesystem"
      become: yes
      filesystem:
        fstype: "{{ _filesystem_lvm_filesystem }}"
        dev: "/dev/{{ filesystem_extend_lvm_vg }}/{{ filesystem_extend_lvm_lv }}"
        resizefs: yes

API1:

  • filesystem_extend_lvm_devices - List of devices on which partition should be created and added to LVM
  • filesystem_extend_lvm_vg - name of LVM volume group
  • filesystem_extend_lvm_lv - name of LVM volume
  • filesystem_extend_lvm_size - target size of volume (default: "+100%FREE")

API2:

  • filesystem_extend_lvm_partitions - List of partitions that should be used in volume group
  • filesystem_extend_lvm_vg - name of LVM volume group
  • filesystem_extend_lvm_lv - name of LVM volume
  • filesystem_extend_lvm_size - target size of volume (default: "+100%FREE")

API3:

  • filesystem_lvm_physical_devices - List of partitions that should be used in volume group (partitions need to be created with lvm flag)
  • filesystem_lvm_volume_group - name of LVM volume group
  • filesystem_lvm_volume - name of LVM volume
  • filesystem_lvm_volume_size - target size of volume (default: "+100%FREE")

comments on API1:

  • filesystem_extend_lvm_devices - suggests that list of devices should be calculated before running
  • According to docs module lvg should be given list of all devices that should exist in group
  • There is no nice way to list devices attached to volume group (best found is to use command lvdisplay --maps)

comments on API2:

  • who will create partitions and if this action conversion of partition to device will not be nice

comments on API3:

  • this API is similar to API2 but design assumes that this action will create partitions on LVM not only extend them
Edited by Piotr Korthals