diff --git a/README.md b/README.md index ff71cf6..9e81f9c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Role Name +# ansible-manage-lvm -An [Ansible] role to manage LVM Groups/Logical Volumes. +Ansible role to manage LVM Groups/Logical Volumes. > NOTE: Can be used to create, extend or resize LVM Groups and volumes. @@ -9,78 +9,9 @@ An [Ansible] role to manage LVM Groups/Logical Volumes. Devices/disks to be members of the LVM setup **must be** identified prior to using this role. -> NOTE: Ensure that you select the correct devices/disks. -> -> NOTE: To create an LVM VG w/out creating LVM LVOLS...define lvname w/ var as -> `None` as in the below example. - ## Role Variables -```yaml ---- -# defaults file for ansible-manage-lvm -lvm_groups: [] - # - vgname: ubuntu-vg - # disks: - # - /dev/sda5 - # - /dev/sdc - # - /dev/sdd - # # defines if VG should exist or be removed - # # true or false - # create: true - # lvnames: - # - lvname: swap_1 - # # Define size of lvol - # # 100%FREE, 10g, 1024 (megabytes by default) - # size: 5g - # # Defines additional lvcreate options (e.g. stripes, stripesize, etc) - # opts: '' - # # Defines if lvol should exist or be removed - # # true or false - # create: true - # # Defines filesystem to format lvol as - # filesystem: swap - # # Defines if filesystem should be mounted - # mount: false - # # Defines mountpoint for lvol - # mntp: [] - # # Defines additional mount options (e.g. noatime, noexec, etc) - # mopts: '' - # - lvname: root - # size: 40g - # create: true - # filesystem: ext4 - # mount: true - # mntp: / - # - vgname: test-vg - # disks: - # - /dev/sdb - # create: true - # lvnames: - # - lvname: test_1 - # size: 5g - # create: true - # filesystem: ext4 - # mount: true - # mntp: /mnt/test_1 - # - lvname: test_2 - # size: 10g - # create: true - # filesystem: ext4 - # mount: true - # mntp: /mnt/test_2 - # - vgname: cinder-volumes - # disks: - # - /dev/cciss/c0d1 - # create: true - # lvnames: - # # Set to None to only create LVM VG w/out creating LVM LVOLS - # - None - -# Defines if LVM will be managed by role -# default is false to ensure nothing is changed by accident. -manage_lvm: false -``` +[defaults/main.yml](defaults/main.yml) ## Dependencies @@ -88,48 +19,16 @@ None ## Example Playbook -```yaml ---- -- hosts: test-nodes - vars: - lvm_groups: - - vgname: test-vg - disks: - - /dev/sdb - - /dev/sdc - create: true - lvnames: - - lvname: test_1 - size: 5g - create: true - filesystem: ext4 - mount: true - mntp: /mnt/test_1 - - lvname: test_2 - size: 10g - create: true - filesystem: ext4 - mount: true - mntp: /mnt/test_2 - manage_lvm: true - pri_domain_name: 'test.vagrant.local' - roles: - - role: ansible-manage-lvm - tasks: -``` +[playbook.yml](playbook.yml) ## License -BSD +MIT ## Author Information Larry Smith Jr. -- [@mrlesmithjr] -- -- mrlesmithjr [at] gmail.com - -[@mrlesmithjr]: https://www.twitter.com/mrlesmithjr - -[ansible]: https://www.ansible.com +- [@mrlesmithjr](https://twitter.com/mrlesmithjr) +- [mrlesmithjr@gmail.com](mailto:mrlesmithjr@gmail.com) +- [http://everythingshouldbevirtual.com](http://everythingshouldbevirtual.com) diff --git a/meta/main.yml b/meta/main.yml index 91c0dee..6e47f1f 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -1,7 +1,7 @@ --- galaxy_info: author: Larry Smith Jr. - description: Role to manage LVM Groups/Logical Volumes. Can be used to create, extend or resize LVM. + description: Ansible role to manage(create, extend, resize) LVM Groups/Logical Volumes. license: MIT min_ansible_version: 1.2 @@ -12,17 +12,16 @@ galaxy_info: - name: EL versions: - - 6 - - 7 + - all + - name: Fedora + versions: + - all - name: Ubuntu versions: - - precise - - trusty + - all - name: Debian versions: - - jessie - - wheezy - + - all galaxy_tags: - system - lvm diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index a293261..cc232f2 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -5,13 +5,27 @@ driver: name: virtualbox lint: yamllint . && flake8 && ansible-lint platforms: - - name: Fedora-Molecule-LVM - box: fedora/31-cloud-base - cpu: 2 - memory: 2048 + - name: CentOS-Molecule-LVM + box: mrlesmithjr/centos7 provider_override_args: - "persistent_storage.enabled = true" - - "persistent_storage.location = 'molecule-lvm.vdi'" + - "persistent_storage.location = 'centos-molecule-lvm.vdi'" + - "persistent_storage.size = 100" + - "persistent_storage.mount = false" + - "persistent_storage.diskdevice = '/dev/sdb'" + - name: Fedora-Molecule-LVM + box: mrlesmithjr/fedora31 + provider_override_args: + - "persistent_storage.enabled = true" + - "persistent_storage.location = 'fedora-molecule-lvm.vdi'" + - "persistent_storage.size = 100" + - "persistent_storage.mount = false" + - "persistent_storage.diskdevice = '/dev/sdb'" + - name: Ubuntu-Molecule-LVM + box: mrlesmithjr/bionic64 + provider_override_args: + - "persistent_storage.enabled = true" + - "persistent_storage.location = 'ubuntu-molecule-lvm.vdi'" - "persistent_storage.size = 100" - "persistent_storage.mount = false" - "persistent_storage.diskdevice = '/dev/sdb'" diff --git a/playbook.yml b/playbook.yml new file mode 100644 index 0000000..6b69e5a --- /dev/null +++ b/playbook.yml @@ -0,0 +1,27 @@ +--- +- hosts: test-nodes + vars: + lvm_groups: + - vgname: test-vg + disks: + - /dev/sdb + - /dev/sdc + create: true + lvnames: + - lvname: test_1 + size: 5g + create: true + filesystem: ext4 + mount: true + mntp: /mnt/test_1 + - lvname: test_2 + size: 10g + create: true + filesystem: ext4 + mount: true + mntp: /mnt/test_2 + manage_lvm: true + tasks: + - name: Include lvm + include_role: + name: ansible-manage-lvm diff --git a/setup_travis_tests.sh b/setup_travis_tests.sh deleted file mode 100755 index d015baa..0000000 --- a/setup_travis_tests.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -TAR_FILE="v1.6.0.tar.gz" - -# Prompt for Ansible role name -read -p "Enter the Ansible role name: " input - -# Update .travis.yml with Ansible role name -sed -i '' "s/replace_role/${input}/g" ".travis.yml" - -# Update tests/test.yml with Ansible role name -sed -i '' "s/replace_role/${input}/g" "tests/test.yml" - -# Cleanup -if [ -f $TAR_FILE ]; then - rm $TAR_FILE -fi diff --git a/tasks/centos.yml b/tasks/centos.yml index 9ac7eb8..7a5cb94 100644 --- a/tasks/centos.yml +++ b/tasks/centos.yml @@ -1,14 +1,14 @@ --- - name: centos | installing lvm2 package: - name: "lvm2" - state: "present" + name: lvm2 + state: present become: true - name: centos | installing sg3_utils package: - name: "sg3_utils" - state: "present" + name: sg3_utils + state: present become: true - name: centos | debug lvg @@ -36,12 +36,12 @@ - lv.1.create|bool - name: centos | checking for scsi devices - command: "sg_scan" + command: sg_scan become: true - register: "scsi_devices" + register: scsi_devices changed_when: false - name: centos | rescanning for new disks - command: "/usr/bin/rescan-scsi-bus.sh" + command: /usr/bin/rescan-scsi-bus.sh become: true changed_when: false diff --git a/tasks/create_fs.yml b/tasks/create_fs.yml index b905a27..7d95b60 100644 --- a/tasks/create_fs.yml +++ b/tasks/create_fs.yml @@ -1,22 +1,22 @@ --- -- name: manage_lvm | unmounting filesystem(s) +- name: create_fs | unmounting filesystem(s) mount: path: "{{ lv.mntp }}" src: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" fstype: "{{ lv.filesystem | default(omit) }}" - state: "absent" + state: absent become: true loop: "{{ vg.lvnames }}" loop_control: loop_var: lv - when: > - (lv is defined and - lv != 'None') and - (lv.create is defined and - not lv.create and - lv.filesystem != "swap") + when: + - lv is defined + - lv != 'None' + - lv.create is defined + - not lv.create|bool + - lv.filesystem != "swap" -- name: manage_lvm | creating new filesystem on new LVM logical volume(s) +- name: create_fs | creating new filesystem on new LVM logical volume(s) filesystem: fstype: "{{ lv.filesystem }}" dev: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" @@ -25,23 +25,19 @@ loop_control: loop_var: lv become: true - when: > - ( - (vg.create is defined and - vg.create) and - (lv is defined and - lv != 'None') and - (lv.create is defined and - lv.create) and - ( - lv.filesystem is defined and - lv.filesystem != 'None' and - lv.filesystem != 'xfs' - ) - ) - # unable to resize xfs: looks like we've to reference the mountpoint instead of the device + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.filesystem is defined + - lv.filesystem != 'None' + - lv.filesystem != 'xfs' -- name: manage_lvm | check already converted +# unable to resize xfs: looks like we've to reference the mountpoint instead of the device +- name: create_fs | check already converted # at least xfs is executed twice if the partition has changed in the meantime # then it tries to recreate the fs on the mounted fs which indeed fails... shell: "xfs_info {{ lv.mntp }} | grep -c 'ftype=1'" @@ -51,22 +47,15 @@ loop_var: lv register: mountedxfs ignore_errors: true - changed_when: no - when: > - ( - (lv is defined and lv != 'None') and - ( - lv.filesystem is defined and - lv.filesystem == "xfs" - ) - and - ( - lv.create is defined and - lv.create - ) - ) + changed_when: false + when: + - lv is defined and lv != 'None' + - lv.filesystem is defined + - lv.filesystem == "xfs" + - lv.create is defined + - lv.create|bool -- name: manage_lvm | creating new xfs filesystem on new LVM logical volume(s) +- name: create_fs | creating new xfs filesystem on new LVM logical volume(s) filesystem: fstype: "{{ lv.filesystem }}" dev: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" @@ -74,38 +63,34 @@ loop_control: loop_var: lv become: true - when: > - ( - mountedxfs is failed and - (vg.create is defined and - vg.create) and - (lv is defined and - lv != 'None') and - (lv.create is defined and - lv.create) and - ( - lv.filesystem is defined and - lv.filesystem == 'xfs' - ) - ) + when: + - mountedxfs is failed + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.filesystem is defined + - lv.filesystem == 'xfs' -- name: manage_lvm | mounting new filesystem(s) +- name: create_fs | mounting new filesystem(s) mount: path: "{{ lv.mntp }}" src: "/dev/{{ vg.vgname }}/{{ lv.lvname }}" fstype: "{{ lv.filesystem }}" - state: "mounted" + state: mounted opts: "{{ lv.mopts | default('defaults') }}" become: true loop: "{{ vg.lvnames }}" loop_control: loop_var: lv - when: > - ((vg.create is defined and - vg.create) and - (lv is defined and - lv != 'None') and - (lv.create is defined and - lv.create) and - (lv.mount is defined and - lv.mount)) + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool + - lv.mount is defined + - lv.mount|bool diff --git a/tasks/create_lv.yml b/tasks/create_lv.yml index 63eb3fb..ec5a518 100644 --- a/tasks/create_lv.yml +++ b/tasks/create_lv.yml @@ -1,10 +1,10 @@ --- -- name: "debug vg" +- name: create_lv | Display Volume Group debug: var: vg verbosity: 2 -- name: "debug lvm" +- name: create_lv | debug lvm loop: "{{ vg.lvnames | default([]) }}" debug: var: lv @@ -12,23 +12,22 @@ loop_control: loop_var: lv -- name: manage_lvm | creating new LVM logical volume(s) +- name: create_lv | creating new LVM logical volume(s) lvol: vg: "{{ vg.vgname }}" lv: "{{ lv.lvname }}" size: "{{ lv.size }}" - shrink: no + shrink: false opts: "{{ lv.opts | default('') }}" - state: "present" + state: present loop: "{{ vg.lvnames | default([]) }}" loop_control: loop_var: lv become: true - when: > - ( - (vg.create is defined - and vg.create) and - (lv != 'None') and - (lv.create is defined and - lv.create) - ) + when: + - vg.create is defined + - vg.create|bool + - lv is defined + - lv != 'None' + - lv.create is defined + - lv.create|bool diff --git a/tasks/create_vg.yml b/tasks/create_vg.yml index d79f362..231da78 100644 --- a/tasks/create_vg.yml +++ b/tasks/create_vg.yml @@ -1,12 +1,11 @@ --- - -- name: manage_lvm | creating new LVM volume group(s) +- name: create_vg | creating new LVM volume group(s) lvg: vg: "{{ item.vgname }}" pvs: "{{ item.disks | join(',') }}" - state: "present" + state: present become: true loop: "{{ lvm_groups }}" - when: > - item.create is defined and - item.create + when: + - item.create is defined + - item.create|bool diff --git a/tasks/debian.yml b/tasks/debian.yml index cc489f2..05fe1cb 100644 --- a/tasks/debian.yml +++ b/tasks/debian.yml @@ -1,40 +1,40 @@ --- +- name: debian | Updating Apt Cache + apt: + update_cache: true + cache_valid_time: 3600 + become: true + - name: debian | installing pre-reqs - package: + apt: name: - lvm2 - scsitools - state: "present" + state: present become: true - name: debian | install xfs tools - package: - name: "xfsprogs" - state: "present" - become: yes + apt: + name: xfsprogs + state: present + become: true loop: "{{ lvm_groups|subelements('lvnames') }}" - when: > - ( - (item.1 is defined and item.1 != 'None') and - ( - item.1.filesystem is defined and - item.1.filesystem == "xfs" - ) - and - ( - item.1.create is defined and - item.1.create - ) - ) + when: + - item.1 is defined + - item.1 != 'None' + - item.1.filesystem is defined + - item.1.filesystem == "xfs" + - item.1.create is defined + - item.1.create|bool - name: debian | checking for scsi devices - command: "sg_scan" + command: sg_scan become: true - register: "scsi_devices" + register: scsi_devices changed_when: false - name: debian | rescanning for new disks added - command: "/sbin/rescan-scsi-bus" + command: /sbin/rescan-scsi-bus become: true changed_when: false when: scsi_devices['stdout'] | length diff --git a/tasks/main.yml b/tasks/main.yml index 34c5d10..5aaed04 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -7,6 +7,6 @@ when: ansible_os_family == "RedHat" - include_tasks: manage_lvm.yml - when: > - manage_lvm and - lvm_groups is defined + when: + - lvm_groups is defined + - manage_lvm|bool diff --git a/tasks/manage_lvm.yml b/tasks/manage_lvm.yml index 46b0ac0..3fa82dc 100644 --- a/tasks/manage_lvm.yml +++ b/tasks/manage_lvm.yml @@ -18,23 +18,23 @@ lvol: vg: "{{ item.0.vgname }}" lv: "{{ item.1.lvname }}" - state: "absent" - force: yes + state: absent + force: true become: true loop: "{{ lvm_groups|subelements('lvnames', {'skip_missing': true}) }}" - when: > - (item.1 is defined and - item.1 != 'None') and - (item.1.create is defined and - not item.1.create) + when: + - item.1 is defined + - item.1 != 'None' + - item.1.create is defined + - not item.1.create|bool - name: manage_lvm | Removing LVM volume group(s) lvg: vg: "{{ item.vgname }}" pvs: "{{ item.disks | join(',') }}" - state: "absent" + state: absent become: true loop: "{{ lvm_groups }}" - when: > - item.create is defined and - not item.create + when: + - item.create is defined + - not item.create|bool