Merge pull request #86 from corvus-migratorius/role-make_lv

Role make lv
This commit is contained in:
Fogucoco
2026-03-19 12:43:49 +03:00
committed by GitHub
21 changed files with 462 additions and 2 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.ansible
.vscode
server64_with_all_clients_8_3_26_1540.zip
server64_with_all_clients_8_3_26_1540.zip
.DS_Store

View File

@@ -12,9 +12,11 @@
- [dnsmasq](roles/dnsmasq/README.md)
- [docker_ubuntu](roles/docker_ubuntu/README.md)
- [grafana](roles/grafana/README.md)
- [hostname](roles/hostname/README.md)
- [ipmi_exporter](roles/ipmi_exporter/README.md)
- [karma](roles/karma/README.md)
- [loki](roles/loki/README.md)
- [make_lv](roles/make_lv/README.md)
- [metr1c](roles/metr1c/README.md)
- [mkfs](roles/mkfs/README.md)
- [mount_device](roles/mount_device/README.md)

View File

@@ -1,7 +1,7 @@
---
namespace: genlab
name: common
version: 0.33.0
version: 0.35.0
readme: README.md
authors:
- Alexander Gorelyshev (corvus-migratorius@proton.me)

38
roles/hostname/README.md Normal file
View File

@@ -0,0 +1,38 @@
Role Name
=========
Set the node's hostname.
Requirements
------------
None
Role Variables
--------------
`hostname`
Dependencies
------------
Example Playbook
----------------
Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
```yaml
roles:
- role: genlab.common.hostname
hostname: server-hostname
```
License
-------
BSD
Author Information
------------------
corvus-migratorius@proton.me

View File

@@ -0,0 +1,2 @@
---
# defaults file for roles/hostname

View File

@@ -0,0 +1,2 @@
---
# handlers file for roles/hostname

View File

@@ -0,0 +1,16 @@
galaxy_info:
role_name: "hostname"
namespace: genlab
author: "Alexander Gorelyhsev"
description: "Set the hostname of the node"
company: "GenLab LLC"
license: "BSD"
min_ansible_version: "2.1"
platforms:
- name: "Ubuntu"
versions: ["focal", "jammy", "noble"]
galaxy_tags: []
dependencies: []

View File

@@ -0,0 +1,9 @@
---
- name: Converge
hosts: all
pre_tasks:
# Blank task for ignoring CI testing, because you can't change hostname in container
# This role was tested manually
- name: Blank
ansible.builtin.command: echo
changed_when: false

View File

@@ -0,0 +1,22 @@
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: ubuntu
image: geerlingguy/docker-ubuntu2204-ansible:latest
pre_build_image: true
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
cgroupns_mode: host
privileged: true
provisioner:
name: ansible
verifier:
name: ansible
lint: |
set -e
yamllint .
ansible-lint .

View File

@@ -0,0 +1,11 @@
---
- name: Verify
hosts: all
gather_facts: false
tasks:
# Blank task for ignoring CI testing, because you can't change hostname in container
# This role was tested manually
- name: Blank
ansible.builtin.command: echo
changed_when: false

View File

@@ -0,0 +1,6 @@
---
# tasks file for roles/hostname
- name: "Set the hostname to '{{ hostname }}'"
tags: [hostname]
ansible.builtin.hostname:
name: "{{ hostname }}"

View File

@@ -0,0 +1,2 @@
---
# vars file for roles/hostname

68
roles/make_lv/README.md Normal file
View File

@@ -0,0 +1,68 @@
ansible-make-lv
=========
Role for creating simple lv disks with 1 group and 1 volume
Requirements
------------
None
Role Variables
--------------
None
Dependencies
------------
None
Example Playbook
----------------
All variables
```yaml
roles:
- role: genlab.ansible_make_lv
virtual_group: "group"
logical_volume: "volume"
lvm_dev: "/dev/sda"
make_lv_size: 100%FREE
make_lv_fs_type: ext4
make_lv_storage_mountpoint: "/mnt"
make_lv_storage_mountpoint_mode: "0775"
make_lv_mountpoint_owner: root
make_lv_mountpoint_group: root
make_lv_is_container: false # disables udev in LVM if true
```
Minimal variables
```yaml
roles:
- role: genlab.ansible_make_lv
virtual_group: "group"
logical_volume: "volume"
lvm_dev: "/dev/sda"
```
Defaults
```yaml
make_lv_size: 100%FREE
make_lv_fs_type: ext4
make_lv_storage_mountpoint: "/mnt"
make_lv_storage_mountpoint_mode: "0775"
make_lv_mountpoint_owner: root
make_lv_mountpoint_group: root
make_lv_is_container: false # disables udev in LVM if true
```
License
-------
BSD
Author Information
------------------
malyuk.ss@genlab.llc

View File

@@ -0,0 +1,8 @@
---
make_lv_size: 100%FREE
make_lv_fs_type: ext4
make_lv_storage_mountpoint: "/mnt"
make_lv_storage_mountpoint_mode: "0775"
make_lv_mountpoint_owner: root
make_lv_mountpoint_group: root
make_lv_is_container: false

View File

@@ -0,0 +1 @@
---

View File

@@ -0,0 +1,17 @@
---
galaxy_info:
role_name: "make_lv"
namespace: genlab
author: "Sergey Malyuk"
company: "Genlab, LLC"
description: ""
license: "MIT"
min_ansible_version: "2.1"
platforms:
- name: "Ubuntu"
versions: ["focal", "jammy", "noble"]
galaxy_tags: []
dependencies: []

View File

@@ -0,0 +1,60 @@
---
- name: Converge
hosts: all
pre_tasks:
- name: Get /root/image.img stats
ansible.builtin.stat:
path: /root/image.img
register: make_lv_img_stat
- name: Create image file
when: not make_lv_img_stat.stat.exists
ansible.builtin.command: dd if=/dev/zero of=/root/image.img bs=1M count=128
register: make_lv_dd_result
changed_when: make_lv_dd_result.rc == 0
- name: Get linked loop devices
ansible.builtin.command: losetup -a
changed_when: false
register: make_lv_loop_devs
- name: Link image to loop device
when: "'/root/image.img' not in make_lv_loop_devs.stdout"
ansible.builtin.command: losetup --find --show -P /root/image.img
register: make_lv_loop_device
changed_when: "'/dev/loop' in make_lv_loop_device.stdout"
- name: Get all loop devices
ansible.builtin.command: losetup -a
register: make_lv_losetup_out
changed_when: false
- name: Find line with /root/image.img
ansible.builtin.set_fact:
make_lv_matched_line: "{{ make_lv_losetup_out.stdout_lines
| select('search', '/root/image.img')
| list
| first
| default('') }}"
- name: Extract loop device name (/dev/loopN)
ansible.builtin.set_fact:
make_lv_loop_dev: "{{ make_lv_matched_line | regex_search('(/dev/loop[0-9]+)', '\\1') | default('') }}"
- name: Debug result
ansible.builtin.debug:
msg: "/root/image.img is linked to {{ make_lv_loop_dev[0] }}"
when: make_lv_loop_dev != ''
roles:
- role: genlab.common.make_lv
virtual_group: "group"
logical_volume: "volume"
lvm_dev: "{{ make_lv_loop_dev[0] }}"
make_lv_size: 100%FREE
make_lv_fs_type: ext4
make_lv_storage_mountpoint: "/mnt"
make_lv_storage_mountpoint_mode: "0755"
make_lv_mountpoint_owner: root
make_lv_mountpoint_group: root
make_lv_is_container: true

View File

@@ -0,0 +1,27 @@
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: ubuntu
image: geerlingguy/docker-${MOLECULE_DISTRO:-ubuntu2404}-ansible:latest
pre_build_image: true
command: ${MOLECULE_DOCKER_COMMAND:-""}
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:rw
cgroupns_mode: host
privileged: true
provisioner:
name: ansible
verifier:
name: ansible
lint: |
set -e
yamllint .
ansible-lint .

View File

@@ -0,0 +1,65 @@
---
- name: Verify
hosts: all
gather_facts: false
any_errors_fatal: true
vars:
virtual_group: "group"
logical_volume: "volume"
lvm_dev: "/dev/loop0"
make_lv_fs_type: ext4
make_lv_storage_mountpoint: "/mnt"
tasks:
- name: Get volume group list
ansible.builtin.shell:
cmd: "set -o pipefail ; pvs | grep {{ lvm_dev }}"
executable: /bin/bash
changed_when: false
failed_when: false
register: make_lv_vg_list
- name: Assert that volume group exists
ansible.builtin.assert:
that: virtual_group in make_lv_vg_list.stdout
success_msg: "{{ lvm_dev }} has {{ virtual_group }} group"
fail_msg: "{{ lvm_dev }} DOES NOT have {{ virtual_group }} group"
- name: Get logical volume list
ansible.builtin.shell:
cmd: "set -o pipefail ; lvs | grep {{ virtual_group }} | grep {{ logical_volume }}"
executable: /bin/bash
changed_when: false
failed_when: false
register: make_lv_lv_list
- name: Assert that logical volume exists
ansible.builtin.assert:
that: logical_volume in make_lv_lv_list.stdout
success_msg: "{{ virtual_group }} has {{ logical_volume }} volume"
fail_msg: "{{ virtual_group }} DOES NOT have {{ logical_volume }} volume"
- name: Get filesystem type
ansible.builtin.command: "blkid /dev/mapper/{{ virtual_group }}-{{ logical_volume }} -o value -s TYPE"
changed_when: false
failed_when: false
register: make_lv_current_fs
- name: Assert that current filesystem is the required one
ansible.builtin.assert:
that: make_lv_current_fs.stdout == make_lv_fs_type
success_msg: "{{ virtual_group }} - {{ logical_volume }} has {{ make_lv_fs_type }} filesystem"
fail_msg: "{{ virtual_group }} - {{ logical_volume }} DOES NOT have {{ make_lv_fs_type }} filesystem"
- name: Get logical volume mount info # noqa: command-instead-of-module — tells ansible-lint to ignore the error, because you can't actually
# do it with ansible.builtin.mount as the linter begs me to do
ansible.builtin.shell: "mount | grep -w '{{ virtual_group }}-{{ logical_volume }}'"
register: make_lv_mount_check
ignore_errors: true
changed_when: false
- name: Assert that volume is mounted
ansible.builtin.assert:
that: make_lv_mount_check.rc == 0
success_msg: "{{ virtual_group }}-{{ logical_volume }} is mounted at {{ make_lv_storage_mountpoint }}"
fail_msg: "{{ virtual_group }}-{{ logical_volume }} IS NOT mounted at {{ make_lv_storage_mountpoint }}"

View File

@@ -0,0 +1,102 @@
---
- name: Install LVM tools
ansible.builtin.apt:
name: lvm2
state: present
update_cache: true
cache_valid_time: 3600
- name: Check lvm storage exists
block:
- name: Get volume group list
ansible.builtin.shell:
cmd: "set -o pipefail ; pvs | grep {{ lvm_dev }}"
executable: /bin/bash
changed_when: false
failed_when: false
register: make_lv_vg_list
- name: Assert that volume group exists
ansible.builtin.assert:
that: virtual_group in make_lv_vg_list.stdout
success_msg: "{{ lvm_dev }} has {{ virtual_group }} group"
fail_msg: "{{ lvm_dev }} DOES NOT have {{ virtual_group }} group"
- name: Get logical volume list
ansible.builtin.shell:
cmd: "set -o pipefail ; lvs | grep {{ virtual_group }} | grep {{ logical_volume }}"
executable: /bin/bash
changed_when: false
failed_when: false
register: make_lv_lv_list
- name: Assert that logical volume exists
ansible.builtin.assert:
that: logical_volume in make_lv_lv_list.stdout
success_msg: "{{ virtual_group }} has {{ logical_volume }} volume"
fail_msg: "{{ virtual_group }} DOES NOT have {{ logical_volume }} volume"
- name: Get filesystem type
ansible.builtin.command: "blkid /dev/mapper/{{ virtual_group }}-{{ logical_volume }} -o value -s TYPE"
changed_when: false
failed_when: false
register: make_lv_current_fs
- name: Assert that current filesystem is the required one
ansible.builtin.assert:
that: make_lv_current_fs.stdout == make_lv_fs_type
success_msg: "{{ virtual_group }} - {{ logical_volume }} has {{ make_lv_fs_type }} filesystem"
fail_msg: "{{ virtual_group }} - {{ logical_volume }} DOES NOT have {{ make_lv_fs_type }} filesystem"
rescue:
- name: Unmount the main storage
ansible.posix.mount:
src: "/dev/{{ virtual_group }}/{{ logical_volume }}"
path: "{{ make_lv_storage_mountpoint }}"
state: absent
- name: Wipe disk signatures
ansible.builtin.command: "wipefs -af {{ lvm_dev }}"
register: make_lv_wipefs_result
changed_when: make_lv_wipefs_result.rc == 0
- name: Create a volume group for the storage
community.general.lvg:
pvs: "{{ lvm_dev }}"
vg: "{{ virtual_group }}"
force: true
- name: Create a logical volume for the storage
when: make_lv_is_container
community.general.lvol:
vg: "{{ virtual_group }}"
lv: "{{ logical_volume }}"
size: "{{ make_lv_size }}"
opts: "--config 'activation/udev_rules=0'"
- name: Create a logical volume for the storage
when: not make_lv_is_container
community.general.lvol:
vg: "{{ virtual_group }}"
lv: "{{ logical_volume }}"
size: "{{ make_lv_size }}"
opts: "--config 'activation/udev_rules=1'"
- name: Create a filesystem for the storage
community.general.filesystem:
dev: "/dev/{{ virtual_group }}/{{ logical_volume }}"
fstype: "{{ make_lv_fs_type }}"
- name: Create a mountpoint for the storage
ansible.builtin.file:
path: "{{ make_lv_storage_mountpoint }}"
state: directory
owner: "{{ make_lv_mountpoint_owner }}"
group: "{{ make_lv_mountpoint_group }}"
mode: "{{ make_lv_storage_mountpoint_mode }}"
- name: Mount the main storage
ansible.posix.mount:
src: "/dev/{{ virtual_group }}/{{ logical_volume }}"
path: "{{ make_lv_storage_mountpoint }}"
fstype: "{{ make_lv_fs_type }}"
state: mounted

View File

@@ -0,0 +1 @@
---