From b731c201001e415033f96e4f082b57e98543198f Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 13:51:45 +0200 Subject: [PATCH 01/11] rename manage_lvm.yml due to recursive parsing error --- tasks/main.yml | 2 +- tasks/{manage_lvm.yml => managelvm.yml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename tasks/{manage_lvm.yml => managelvm.yml} (100%) diff --git a/tasks/main.yml b/tasks/main.yml index 34c5d10..83cf1aa 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -6,7 +6,7 @@ - include_tasks: centos.yml when: ansible_os_family == "RedHat" -- include_tasks: manage_lvm.yml +- include_tasks: managelvm.yml when: > manage_lvm and lvm_groups is defined diff --git a/tasks/manage_lvm.yml b/tasks/managelvm.yml similarity index 100% rename from tasks/manage_lvm.yml rename to tasks/managelvm.yml From 976ff31d001f726184d739cd2689aca98a934b53 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 14:21:02 +0200 Subject: [PATCH 02/11] avoid error when lv not defined --- tasks/create_lv.yml | 7 +++---- tasks/main.yml | 2 +- tasks/{managelvm.yml => manage_lvm.yml} | 0 3 files changed, 4 insertions(+), 5 deletions(-) rename tasks/{managelvm.yml => manage_lvm.yml} (100%) diff --git a/tasks/create_lv.yml b/tasks/create_lv.yml index af33523..63eb3fb 100644 --- a/tasks/create_lv.yml +++ b/tasks/create_lv.yml @@ -5,7 +5,7 @@ verbosity: 2 - name: "debug lvm" - loop: "{{ vg.lvnames }}" + loop: "{{ vg.lvnames | default([]) }}" debug: var: lv verbosity: 1 @@ -20,7 +20,7 @@ shrink: no opts: "{{ lv.opts | default('') }}" state: "present" - loop: "{{ vg.lvnames }}" + loop: "{{ vg.lvnames | default([]) }}" loop_control: loop_var: lv become: true @@ -28,8 +28,7 @@ ( (vg.create is defined and vg.create) and - (lv is defined and - lv != 'None') and + (lv != 'None') and (lv.create is defined and lv.create) ) diff --git a/tasks/main.yml b/tasks/main.yml index 83cf1aa..34c5d10 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -6,7 +6,7 @@ - include_tasks: centos.yml when: ansible_os_family == "RedHat" -- include_tasks: managelvm.yml +- include_tasks: manage_lvm.yml when: > manage_lvm and lvm_groups is defined diff --git a/tasks/managelvm.yml b/tasks/manage_lvm.yml similarity index 100% rename from tasks/managelvm.yml rename to tasks/manage_lvm.yml From 59ffcfac4ae9707102d21f0f6aa74c36d160c538 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 14:23:32 +0200 Subject: [PATCH 03/11] avoid error when lv not defined --- tasks/create_fs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasks/create_fs.yml b/tasks/create_fs.yml index b569f70..abf3770 100644 --- a/tasks/create_fs.yml +++ b/tasks/create_fs.yml @@ -103,7 +103,8 @@ when: > ((vg.create is defined and vg.create) and - lv != 'None' and + (lv is defined and + lv != 'None') and (lv.create is defined and lv.create) and (lv.mount is defined and From b7cef8e3231bba1adba2abe1937f01b334238971 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 14:26:48 +0200 Subject: [PATCH 04/11] avoid error when lv not defined --- tasks/manage_lvm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/manage_lvm.yml b/tasks/manage_lvm.yml index e224bff..8be16f0 100644 --- a/tasks/manage_lvm.yml +++ b/tasks/manage_lvm.yml @@ -21,7 +21,7 @@ state: "absent" force: yes become: true - loop: "{{ lvm_groups|subelements('lvnames') }}" + loop: "{{ lvm_groups|subelements('lvnames') | default([]) }}" when: > (item.1 is defined and item.1 != 'None') and From 0621cadde89220fd77862479c548c3637de4b4ae Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 14:36:04 +0200 Subject: [PATCH 05/11] avoid error when lv not defined --- tasks/manage_lvm.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/manage_lvm.yml b/tasks/manage_lvm.yml index 8be16f0..46b0ac0 100644 --- a/tasks/manage_lvm.yml +++ b/tasks/manage_lvm.yml @@ -21,7 +21,7 @@ state: "absent" force: yes become: true - loop: "{{ lvm_groups|subelements('lvnames') | default([]) }}" + loop: "{{ lvm_groups|subelements('lvnames', {'skip_missing': true}) }}" when: > (item.1 is defined and item.1 != 'None') and From c40f9b7d031f8a7b9eab16aaeb26e54c93425baf Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 16:35:00 +0200 Subject: [PATCH 06/11] testing singl lv and only vg --- .travis.yml | 2 ++ molecule/default/converge.yml | 2 +- molecule/default/tests/test_default.py | 7 ++++++ molecule/kvm/converge.yml | 2 +- molecule/kvmonlyvg/converge.yml | 14 +++++++++++ molecule/kvmonlyvg/molecule.yml | 29 ++++++++++++++++++++++ molecule/kvmonlyvg/tests/conftest.py | 21 ++++++++++++++++ molecule/kvmonlyvg/tests/test_default.py | 11 ++++++++ molecule/kvmsinglelv/converge.yml | 22 ++++++++++++++++ molecule/kvmsinglelv/molecule.yml | 29 ++++++++++++++++++++++ molecule/kvmsinglelv/tests/conftest.py | 21 ++++++++++++++++ molecule/kvmsinglelv/tests/test_default.py | 26 +++++++++++++++++++ tasks/create_fs.yml | 2 +- 13 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 molecule/kvmonlyvg/converge.yml create mode 100644 molecule/kvmonlyvg/molecule.yml create mode 100644 molecule/kvmonlyvg/tests/conftest.py create mode 100644 molecule/kvmonlyvg/tests/test_default.py create mode 100644 molecule/kvmsinglelv/converge.yml create mode 100644 molecule/kvmsinglelv/molecule.yml create mode 100644 molecule/kvmsinglelv/tests/conftest.py create mode 100644 molecule/kvmsinglelv/tests/test_default.py diff --git a/.travis.yml b/.travis.yml index f5114c3..c8e05ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,5 +26,7 @@ before_install: script: - | sudo molecule test --scenario-name kvm + sudo molecule test --scenario-name kvmsinglelv + sudo molecule test --scenario-name kvmonlyvg notifications: webhooks: https://galaxy.ansible.com/api/v1/notifications/ diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml index 3937a13..119de5d 100644 --- a/molecule/default/converge.yml +++ b/molecule/default/converge.yml @@ -15,7 +15,7 @@ filesystem: ext4 mount: true mntp: "/var/lib/mountpoint" - - lvname: my_lv2 + - lvname: my_lw size: 20%VG opts: "--wipesignatures y" mount: true diff --git a/molecule/default/tests/test_default.py b/molecule/default/tests/test_default.py index a97b145..7e75106 100644 --- a/molecule/default/tests/test_default.py +++ b/molecule/default/tests/test_default.py @@ -18,6 +18,13 @@ def test_mylv_logical_volume_is_created(host): assert int(cmd.stdout.rstrip()) >= 1 +def test_mylv_logical_volume_is_created(host): + command = """sudo lvs -o lv_name my_vg --separator='|' --noheadings \ + | grep -c 'my_lw'""" + cmd = host.run(command) + assert int(cmd.stdout.rstrip()) >= 1 + + def test_volume_is_mounted(host): host.file("/var/lib/mountpoint").mode == 0o731 diff --git a/molecule/kvm/converge.yml b/molecule/kvm/converge.yml index ab5315f..ab055c7 100644 --- a/molecule/kvm/converge.yml +++ b/molecule/kvm/converge.yml @@ -15,7 +15,7 @@ filesystem: ext4 mount: true mntp: "/var/lib/mountpoint" - - lvname: my_lv2 + - lvname: my_lw size: 20%VG opts: "--wipesignatures y" mount: true diff --git a/molecule/kvmonlyvg/converge.yml b/molecule/kvmonlyvg/converge.yml new file mode 100644 index 0000000..be123c4 --- /dev/null +++ b/molecule/kvmonlyvg/converge.yml @@ -0,0 +1,14 @@ +--- +- name: Converge + hosts: all + vars: + lvm_groups: + - vgname: my_vg + disks: + - /dev/vdb + create: true + manage_lvm: true + tasks: + - name: "Include lvm" + include_role: + name: "ansible-manage-lvm" diff --git a/molecule/kvmonlyvg/molecule.yml b/molecule/kvmonlyvg/molecule.yml new file mode 100644 index 0000000..225c751 --- /dev/null +++ b/molecule/kvmonlyvg/molecule.yml @@ -0,0 +1,29 @@ +--- +driver: + name: vagrant + provider: + name: libvirt +lint: yamllint . && flake8 && ansible-lint +platforms: + - name: Fedora-Molecule-Volumes-KVM + box: fedora/31-cloud-base + cpu: 2 + memory: 2048 + provider_raw_config_args: + - "storage :file, :size => '1G', :device => 'vdb'" +provisioner: + name: ansible + config_options: + defaults: + forks: 20 + ssh_connection: + pipelining: true + ssh_args: -o ControlMaster=auto -o ControlPersist=600s +verifier: + name: testinfra + env: + PYTHONWARNINGS: "ignore:.*U.*mode is deprecated:DeprecationWarning" + options: + v: 1 +scenario: + name: kvm diff --git a/molecule/kvmonlyvg/tests/conftest.py b/molecule/kvmonlyvg/tests/conftest.py new file mode 100644 index 0000000..7bd2743 --- /dev/null +++ b/molecule/kvmonlyvg/tests/conftest.py @@ -0,0 +1,21 @@ +"""PyTest Fixtures.""" +from __future__ import absolute_import +import os +import pytest + + +def pytest_runtest_setup(item): + """Run tests only when under molecule with testinfra installed.""" + try: + import testinfra + except ImportError: + pytest.skip("Test requires testinfra", allow_module_level=True) + if "MOLECULE_INVENTORY_FILE" in os.environ: + pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ["MOLECULE_INVENTORY_FILE"] + ).get_hosts("all") + else: + pytest.skip( + "Test should run only from inside molecule.", + allow_module_level=True + ) diff --git a/molecule/kvmonlyvg/tests/test_default.py b/molecule/kvmonlyvg/tests/test_default.py new file mode 100644 index 0000000..b03947a --- /dev/null +++ b/molecule/kvmonlyvg/tests/test_default.py @@ -0,0 +1,11 @@ +"""Role testing files using testinfra.""" + + +def test_lvm_package_shall_be_installed(host): + assert host.package("lvm2").is_installed + + +def test_non_persistent_volume_group_is_created(host): + command = """sudo vgdisplay | grep -c 'my_vg'""" + cmd = host.run(command) + assert '1' in cmd.stdout diff --git a/molecule/kvmsinglelv/converge.yml b/molecule/kvmsinglelv/converge.yml new file mode 100644 index 0000000..09d88bd --- /dev/null +++ b/molecule/kvmsinglelv/converge.yml @@ -0,0 +1,22 @@ +--- +- name: Converge + hosts: all + vars: + lvm_groups: + - vgname: my_vg + disks: + - /dev/vdb + create: true + lvnames: + - lvname: my_lv + size: 40%VG + opts: "--wipesignatures y" + create: true + filesystem: ext4 + mount: true + mntp: "/var/lib/mountpoint" + manage_lvm: true + tasks: + - name: "Include lvm" + include_role: + name: "ansible-manage-lvm" diff --git a/molecule/kvmsinglelv/molecule.yml b/molecule/kvmsinglelv/molecule.yml new file mode 100644 index 0000000..225c751 --- /dev/null +++ b/molecule/kvmsinglelv/molecule.yml @@ -0,0 +1,29 @@ +--- +driver: + name: vagrant + provider: + name: libvirt +lint: yamllint . && flake8 && ansible-lint +platforms: + - name: Fedora-Molecule-Volumes-KVM + box: fedora/31-cloud-base + cpu: 2 + memory: 2048 + provider_raw_config_args: + - "storage :file, :size => '1G', :device => 'vdb'" +provisioner: + name: ansible + config_options: + defaults: + forks: 20 + ssh_connection: + pipelining: true + ssh_args: -o ControlMaster=auto -o ControlPersist=600s +verifier: + name: testinfra + env: + PYTHONWARNINGS: "ignore:.*U.*mode is deprecated:DeprecationWarning" + options: + v: 1 +scenario: + name: kvm diff --git a/molecule/kvmsinglelv/tests/conftest.py b/molecule/kvmsinglelv/tests/conftest.py new file mode 100644 index 0000000..7bd2743 --- /dev/null +++ b/molecule/kvmsinglelv/tests/conftest.py @@ -0,0 +1,21 @@ +"""PyTest Fixtures.""" +from __future__ import absolute_import +import os +import pytest + + +def pytest_runtest_setup(item): + """Run tests only when under molecule with testinfra installed.""" + try: + import testinfra + except ImportError: + pytest.skip("Test requires testinfra", allow_module_level=True) + if "MOLECULE_INVENTORY_FILE" in os.environ: + pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ["MOLECULE_INVENTORY_FILE"] + ).get_hosts("all") + else: + pytest.skip( + "Test should run only from inside molecule.", + allow_module_level=True + ) diff --git a/molecule/kvmsinglelv/tests/test_default.py b/molecule/kvmsinglelv/tests/test_default.py new file mode 100644 index 0000000..a97b145 --- /dev/null +++ b/molecule/kvmsinglelv/tests/test_default.py @@ -0,0 +1,26 @@ +"""Role testing files using testinfra.""" + + +def test_lvm_package_shall_be_installed(host): + assert host.package("lvm2").is_installed + + +def test_non_persistent_volume_group_is_created(host): + command = """sudo vgdisplay | grep -c 'my_vg'""" + cmd = host.run(command) + assert '1' in cmd.stdout + + +def test_mylv_logical_volume_is_created(host): + command = """sudo lvs -o lv_name my_vg --separator='|' --noheadings \ + | grep -c 'my_lv'""" + cmd = host.run(command) + assert int(cmd.stdout.rstrip()) >= 1 + + +def test_volume_is_mounted(host): + host.file("/var/lib/mountpoint").mode == 0o731 + + +def test_volume2_is_mounted(host): + host.file("/var/lib/mountpoint2").mode == 0o731 diff --git a/tasks/create_fs.yml b/tasks/create_fs.yml index abf3770..b905a27 100644 --- a/tasks/create_fs.yml +++ b/tasks/create_fs.yml @@ -41,7 +41,7 @@ ) # unable to resize xfs: looks like we've to reference the mountpoint instead of the device -- name: lvm | check already converted +- name: manage_lvm | 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'" From 62fc5a5e2bf00cfc0dc34d72e4ea878b264a8eba Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 16:35:31 +0200 Subject: [PATCH 07/11] testing singl lv and only vg --- molecule/kvmsinglelv/tests/test_default.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/molecule/kvmsinglelv/tests/test_default.py b/molecule/kvmsinglelv/tests/test_default.py index a97b145..ad9e53a 100644 --- a/molecule/kvmsinglelv/tests/test_default.py +++ b/molecule/kvmsinglelv/tests/test_default.py @@ -20,7 +20,3 @@ def test_mylv_logical_volume_is_created(host): def test_volume_is_mounted(host): host.file("/var/lib/mountpoint").mode == 0o731 - - -def test_volume2_is_mounted(host): - host.file("/var/lib/mountpoint2").mode == 0o731 From 69e25effd47167fcf28a73f2b26cc95799d5898d Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 16:56:04 +0200 Subject: [PATCH 08/11] improve tests --- molecule/default/tests/test_default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/molecule/default/tests/test_default.py b/molecule/default/tests/test_default.py index 7e75106..9df90df 100644 --- a/molecule/default/tests/test_default.py +++ b/molecule/default/tests/test_default.py @@ -18,7 +18,7 @@ def test_mylv_logical_volume_is_created(host): assert int(cmd.stdout.rstrip()) >= 1 -def test_mylv_logical_volume_is_created(host): +def test_mylv_logical_volume2_is_created(host): command = """sudo lvs -o lv_name my_vg --separator='|' --noheadings \ | grep -c 'my_lw'""" cmd = host.run(command) From 6ee72799b445901cf334923dda4ac3eb9ffa0dcd Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 17:09:58 +0200 Subject: [PATCH 09/11] improve tests --- molecule/kvmonlyvg/molecule.yml | 2 +- molecule/kvmsinglelv/molecule.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/molecule/kvmonlyvg/molecule.yml b/molecule/kvmonlyvg/molecule.yml index 225c751..c70fec0 100644 --- a/molecule/kvmonlyvg/molecule.yml +++ b/molecule/kvmonlyvg/molecule.yml @@ -26,4 +26,4 @@ verifier: options: v: 1 scenario: - name: kvm + name: kvmonlyvg diff --git a/molecule/kvmsinglelv/molecule.yml b/molecule/kvmsinglelv/molecule.yml index 225c751..0e94bc0 100644 --- a/molecule/kvmsinglelv/molecule.yml +++ b/molecule/kvmsinglelv/molecule.yml @@ -26,4 +26,4 @@ verifier: options: v: 1 scenario: - name: kvm + name: kvmsinglelv From 94582de25de34672e94495254f43452410da60f5 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Mon, 11 May 2020 17:38:02 +0200 Subject: [PATCH 10/11] use symbolic links instead of replicating files --- molecule/kvmonlyvg/tests/conftest.py | 22 +--------------------- molecule/kvmsinglelv/tests/conftest.py | 22 +--------------------- 2 files changed, 2 insertions(+), 42 deletions(-) mode change 100644 => 120000 molecule/kvmonlyvg/tests/conftest.py mode change 100644 => 120000 molecule/kvmsinglelv/tests/conftest.py diff --git a/molecule/kvmonlyvg/tests/conftest.py b/molecule/kvmonlyvg/tests/conftest.py deleted file mode 100644 index 7bd2743..0000000 --- a/molecule/kvmonlyvg/tests/conftest.py +++ /dev/null @@ -1,21 +0,0 @@ -"""PyTest Fixtures.""" -from __future__ import absolute_import -import os -import pytest - - -def pytest_runtest_setup(item): - """Run tests only when under molecule with testinfra installed.""" - try: - import testinfra - except ImportError: - pytest.skip("Test requires testinfra", allow_module_level=True) - if "MOLECULE_INVENTORY_FILE" in os.environ: - pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( - os.environ["MOLECULE_INVENTORY_FILE"] - ).get_hosts("all") - else: - pytest.skip( - "Test should run only from inside molecule.", - allow_module_level=True - ) diff --git a/molecule/kvmonlyvg/tests/conftest.py b/molecule/kvmonlyvg/tests/conftest.py new file mode 120000 index 0000000..add822b --- /dev/null +++ b/molecule/kvmonlyvg/tests/conftest.py @@ -0,0 +1 @@ +../../default/tests/conftest.py \ No newline at end of file diff --git a/molecule/kvmsinglelv/tests/conftest.py b/molecule/kvmsinglelv/tests/conftest.py deleted file mode 100644 index 7bd2743..0000000 --- a/molecule/kvmsinglelv/tests/conftest.py +++ /dev/null @@ -1,21 +0,0 @@ -"""PyTest Fixtures.""" -from __future__ import absolute_import -import os -import pytest - - -def pytest_runtest_setup(item): - """Run tests only when under molecule with testinfra installed.""" - try: - import testinfra - except ImportError: - pytest.skip("Test requires testinfra", allow_module_level=True) - if "MOLECULE_INVENTORY_FILE" in os.environ: - pytest.testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( - os.environ["MOLECULE_INVENTORY_FILE"] - ).get_hosts("all") - else: - pytest.skip( - "Test should run only from inside molecule.", - allow_module_level=True - ) diff --git a/molecule/kvmsinglelv/tests/conftest.py b/molecule/kvmsinglelv/tests/conftest.py new file mode 120000 index 0000000..add822b --- /dev/null +++ b/molecule/kvmsinglelv/tests/conftest.py @@ -0,0 +1 @@ +../../default/tests/conftest.py \ No newline at end of file From 15b2b7b4e0f08531c43b6e36b8d451eebd2f3335 Mon Sep 17 00:00:00 2001 From: Charlie Mordant Date: Thu, 14 May 2020 23:43:59 +0200 Subject: [PATCH 11/11] rebased mrjsmith --- README.md | 117 +++------------------------------- meta/main.yml | 15 ++--- molecule/default/molecule.yml | 24 +++++-- playbook.yml | 27 ++++++++ setup_travis_tests.sh | 17 ----- tasks/centos.yml | 14 ++-- tasks/create_fs.yml | 115 +++++++++++++++------------------ tasks/create_lv.yml | 25 ++++---- tasks/create_vg.yml | 11 ++-- tasks/debian.yml | 44 ++++++------- tasks/main.yml | 6 +- tasks/manage_lvm.yml | 22 +++---- 12 files changed, 171 insertions(+), 266 deletions(-) create mode 100644 playbook.yml delete mode 100755 setup_travis_tests.sh 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