mirror of
https://github.com/mrlesmithjr/ansible-manage-lvm.git
synced 2026-02-04 08:49:13 +03:00
117
README.md
117
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]
|
||||
- <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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
27
playbook.yml
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user