Merge pull request #38 from mrlesmithjr/issue-37

Issue 37
This commit is contained in:
Larry Smith Jr
2020-05-14 09:52:39 -04:00
committed by GitHub
13 changed files with 230 additions and 326 deletions

117
README.md
View File

@@ -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]
- <http://everythingshouldbevirtual.com>
- 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)

View File

@@ -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

View File

@@ -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'"

27
playbook.yml Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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: 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,37 +63,33 @@
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 != '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 != 'None'
- lv.create is defined
- lv.create|bool
- lv.mount is defined
- lv.mount|bool

View File

@@ -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 }}"
debug:
var: lv
@@ -12,24 +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 }}"
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)
)
when:
- vg.create is defined
- vg.create|bool
- lv is defined
- lv != 'None'
- lv.create is defined
- lv.create|bool

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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') }}"
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