22 Commits

Author SHA1 Message Date
Larry Smith Jr.
6d0feecec7 docs: add Galaxy role name clarification and historical stats
As of December 2025, this role is available on Galaxy as
mrlesmithjr.manage_lvm (underscore). The previous hyphenated
variant (manage-lvm) was consolidated.

Added historical download statistics:
- manage_lvm: 697,492 downloads
- manage-lvm: 494,517 downloads
- Combined: 1,192,009 downloads

This role is used by OpenStack Kayobe for LVM management.
2025-12-18 15:11:16 -05:00
Larry Smith Jr.
416e840eea fix: specify Python 3.9 for Galaxy workflow
- Remove undefined matrix.python-version reference
- Use Python 3.9 to match molecule workflow and requirements
2025-11-03 07:29:16 -05:00
Larry Smith Jr.
850d571313 fix: update GitHub Actions to use current versions
- Update actions/checkout to v4
- Update actions/setup-python to v5
- Update actions/cache to v4 (fixes deprecation failures)
- Fix ansible-lint role-name rule violations
2025-11-03 07:28:15 -05:00
Spirit-act
ff13947aaf fix: use explicit boolean check for Ansible 2.19+ compatibility
Fixes implicit truthy conditional that fails in Ansible 2.19+.

Changes `when: scsi_devices['stdout'] | length` to `when: scsi_devices['stdout'] | length > 0` to return an explicit boolean value instead of an integer.

Closes #146 (duplicate PR)
2025-11-01 15:55:35 -04:00
Larry Smith Jr.
26246c7160 Merge pull request #128 from stackhpc/remove-symlinks
Remove symlinks for molecule tests
2024-07-17 17:12:38 -04:00
Matt Crees
5540f7fda5 Remove symlinks for molecule tests
We are seeing failures with newer versions of Ansible due to the
presence of symlinks. For example:

```
error: can't copy 'ansible/roles/mrlesmithjr.manage_lvm/molecule/kvm/tests': doesn't exist or not a regular file
```
2024-05-21 17:16:05 +01:00
Larry Smith Jr
433b7ca1a9 Merge pull request #121 from mrlesmithjr/dependabot/pip/cryptography-42.0.2
Bump cryptography from 42.0.0 to 42.0.2
2024-02-16 22:55:08 -05:00
dependabot[bot]
9404a780c5 Bump cryptography from 42.0.0 to 42.0.2
Bumps [cryptography](https://github.com/pyca/cryptography) from 42.0.0 to 42.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/42.0.0...42.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-17 00:09:34 +00:00
Larry Smith Jr
c0184492d5 Merge pull request #120 from mrlesmithjr/dependabot/pip/ansible-core-2.15.9
Bump ansible-core from 2.15.8 to 2.15.9
2024-02-06 23:51:00 -05:00
Larry Smith Jr
60e08852ea Merge pull request #119 from mrlesmithjr/dependabot/pip/cryptography-42.0.0
Bump cryptography from 41.0.6 to 42.0.0
2024-02-06 23:49:52 -05:00
dependabot[bot]
42cc915582 Bump ansible-core from 2.15.8 to 2.15.9
Bumps [ansible-core](https://github.com/ansible/ansible) from 2.15.8 to 2.15.9.
- [Release notes](https://github.com/ansible/ansible/releases)
- [Commits](https://github.com/ansible/ansible/compare/v2.15.8...v2.15.9)

---
updated-dependencies:
- dependency-name: ansible-core
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-06 20:34:35 +00:00
dependabot[bot]
49edca9134 Bump cryptography from 41.0.6 to 42.0.0
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.6 to 42.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.6...42.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-02-06 02:23:10 +00:00
Larry Smith Jr
ee1e3d051b Merge pull request #118 from genaumann/pvresize_from_module
Add pvresize option
2024-01-17 00:21:19 -05:00
Gino Naumann
91f8cfca5d Add pvresize option
You can now define the pvresize per vg.

To avoid a breaking change, the global option pvresize_to_max is set as default
2024-01-16 12:50:12 +01:00
Larry Smith Jr
3ac9669088 Merge pull request #115 from mrlesmithjr/dependabot/pip/jinja2-3.1.3
Bump jinja2 from 3.1.2 to 3.1.3
2024-01-16 00:30:35 -05:00
Larry Smith Jr
4219da5423 Merge pull request #117 from jcox10/fix-module-names
fix commuity.general module names
2024-01-16 00:30:17 -05:00
Jason Cox
683c617265 fix commuity.general module names 2024-01-15 11:00:08 -07:00
dependabot[bot]
b41ffc5e58 Bump jinja2 from 3.1.2 to 3.1.3
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-11 21:01:26 +00:00
Larry Smith Jr
564d3d1f6f Merge pull request #114 from mrlesmithjr/dependabot/pip/ansible-8.5.0
Bump ansible from 6.6.0 to 8.5.0
2023-12-31 15:51:01 -05:00
dependabot[bot]
1d0fa70d66 Bump ansible from 6.6.0 to 8.5.0
Bumps [ansible](https://github.com/ansible-community/ansible-build-data) from 6.6.0 to 8.5.0.
- [Changelog](https://github.com/ansible-community/ansible-build-data/blob/main/docs/release-process.md)
- [Commits](https://github.com/ansible-community/ansible-build-data/compare/6.6.0...8.5.0)

---
updated-dependencies:
- dependency-name: ansible
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-29 18:31:56 +00:00
Larry Smith Jr
8c3bca39ec Merge pull request #113 from mrlesmithjr/dependabot/pip/cryptography-41.0.6 2023-11-30 19:40:06 -05:00
dependabot[bot]
4fbcf1cd19 Bump cryptography from 41.0.1 to 41.0.6
Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.1 to 41.0.6.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/41.0.1...41.0.6)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-28 23:43:00 +00:00
18 changed files with 984 additions and 911 deletions

View File

@@ -1,2 +1,3 @@
skip_list:
- name[casing]
- role-name

View File

@@ -20,14 +20,14 @@ jobs:
python-version: [3.9]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- uses: actions/cache@v2
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}

View File

@@ -13,14 +13,14 @@ jobs:
galaxy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
- name: Set up Python 3.9
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- uses: actions/cache@v2
python-version: '3.9'
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}

View File

@@ -4,6 +4,34 @@ Ansible role to manage LVM Groups/Logical Volumes.
> NOTE: Can be used to create, extend or resize LVM Groups and volumes.
## ⚠️ Important: Ansible Galaxy Role Name
**As of December 2025**, this role is available on Ansible Galaxy as:
```yaml
- src: mrlesmithjr.manage_lvm # Note: underscore, not hyphen
```
The previous role names (`mrlesmithjr.manage-lvm` and `mrlesmithjr.manage_lvm`) were
consolidated into a single role. If you were using `mrlesmithjr.manage-lvm`, please
update your `requirements.yml` to use `mrlesmithjr.manage_lvm`.
**Note:** This role is used by [OpenStack Kayobe](https://docs.openstack.org/kayobe/latest/)
for LVM management. The `manage_lvm` name was preserved to maintain compatibility.
### Historical Download Statistics
Prior to consolidation, this role had accumulated significant usage:
| Role Name | Downloads (as of Dec 2025) |
|-----------|---------------------------|
| `mrlesmithjr.manage_lvm` | 697,492 |
| `mrlesmithjr.manage-lvm` | 494,517 |
| **Combined Total** | **1,192,009** |
Due to Ansible Galaxy limitations, download counts reset when roles are re-imported.
The historical data above represents the actual community usage of this role.
## Requirements
Devices/disks to be members of the LVM setup **must be** identified prior to

View File

@@ -9,6 +9,8 @@ lvm_groups: []
# # defines if VG should exist or be removed
# # true or false
# create: true
# # defines if PV should be resized to max size
# pvresize: false
# lvnames:
# - lvname: swap_1
# # Define size of lvol
@@ -86,8 +88,5 @@ ebsnvme_binary_helper_path: '/sbin/go-ebsnvme'
### nvme to scsi device name map script helper
ebsnvme_scrip_helper_path: '/usr/local/bin/ebsnvme-id'
### auto pvresize (waiting until ansible 2.10 or above as collections have new lvg with integrated pvresize)
### waiting for new module in collection set to true or run pvresize manually on remote systems
### https://docs.ansible.com/ansible/3/collections/community/general/lvg_module.html
###
### resize all pv's to max size
pvresize_to_max: false

View File

@@ -3,7 +3,7 @@ galaxy_info:
author: Larry Smith Jr.
description: Ansible role to manage(create, extend, resize) LVM Groups/Logical Volumes.
namespace: mrlesmithjr
role_name: manage_lvm
role_name: manage-lvm
license: MIT
min_ansible_version: "1.2"

View File

@@ -1 +0,0 @@
../default/tests

View File

@@ -0,0 +1,20 @@
"""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
)

View File

@@ -0,0 +1,33 @@
"""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_mylv_logical_volume2_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
def test_volume2_is_mounted(host):
host.file("/var/lib/mountpoint2").mode == 0o731

View File

@@ -1 +0,0 @@
../../default/tests/conftest.py

View File

@@ -0,0 +1,20 @@
"""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
)

View File

@@ -1 +0,0 @@
../../default/tests/conftest.py

View File

@@ -0,0 +1,20 @@
"""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
)

1715
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@ authors = ["Larry Smith Jr. <mrlesmithjr@gmail.com>"]
[tool.poetry.dependencies]
python = ">=3.9,<4.0"
ansible = "6.6.0"
ansible = "8.5.0"
[tool.poetry.group.dev.dependencies]
ansible-lint = "6.8.7"

View File

@@ -30,7 +30,7 @@
- lv.filesystem != "swap"
- name: create_fs | creating new filesystem on new LVM logical volume(s)
community.general.system.filesystem:
community.general.filesystem:
fstype: "{{ lv.filesystem }}"
dev: "/dev/{{ vg.vgname }}/{{ lv.lvname }}"
resizefs: yes
@@ -48,7 +48,7 @@
- lv.filesystem != 'xfs'
- name: create_fs | creating new xfs filesystem on new LVM logical volume(s)
community.general.system.filesystem:
community.general.filesystem:
fstype: "{{ lv.filesystem }}"
dev: "/dev/{{ vg.vgname }}/{{ lv.lvname }}"
opts: "{{ lv.fsopts | default(omit) }}"

View File

@@ -5,7 +5,7 @@
verbosity: 2
- name: create_lv | creating new LVM logical volume(s)
community.general.system.lvol:
community.general.lvol:
vg: "{{ vg.vgname }}"
lv: "{{ lv.lvname }}"
size: "{{ lv.size }}"

View File

@@ -1,27 +1,15 @@
---
- name: create_vg | creating new LVM volume group(s)
community.general.system.lvg:
community.general.lvg:
vg: "{{ vg.vgname }}"
pvs: "{{ vg.disks | join(',') }}"
state: present
pvresize: "{{ vg.pvresize | default(pvresize_to_max) }}"
become: true
when:
- vg.create is defined
- vg.create|bool
### workaround: auto pvresize waiting for upgrade to new module supporting integrated pvresize
### ref: https://docs.ansible.com/ansible/3/collections/community/general/lvg_module.html
- name: create_vg | pvresize to max available free space
ansible.builtin.command: "pvresize {{ pv }}"
loop: "{{ vg.disks | default([]) }}"
loop_control:
loop_var: pv
changed_when: false
when:
- vg.create is defined
- vg.create|bool
- pvresize_to_max|bool
- name: manage_lvm | loop over logical volume group(s) to create logical volumes
ansible.builtin.include_tasks: create_lv.yml
loop: "{{ vg.lvnames | default([]) }}"

View File

@@ -37,4 +37,4 @@
ansible.builtin.command: "{{ rescan_scsi_command }}"
become: true
changed_when: false
when: scsi_devices['stdout'] | length
when: scsi_devices['stdout'] | length > 0

View File

@@ -6,7 +6,7 @@
loop_var: vg
- name: manage_lvm | Removing LVM logical volume(s)
community.general.system.lvol:
community.general.lvol:
vg: "{{ item.0.vgname }}"
lv: "{{ item.1.lvname }}"
state: absent
@@ -20,7 +20,7 @@
- not item.1.create|bool
- name: manage_lvm | Removing LVM volume group(s)
community.general.system.lvg:
community.general.lvg:
vg: "{{ item.vgname }}"
pvs: "{{ item.disks | join(',') }}"
state: absent