Как использовать Ansible для автоматизации диспетчера логических томов LVM в Linux

Ansible – это простой и удобный инструмент автоматизации, который предлагает различные модули для работы с управлением дисками в Linux. Когда вам нужно установить и настроить операционную систему на нескольких машинах с одинаковой конфигурацией, ansible будет очень полезен. В качестве примера я могу привести случай, когда вы создаете кластер, где все серверы имеют одинаковое пространство для хранения данных и нуждаются в одинаковой схеме разделов LVM. Подробнее про установку Ansible писали в этом руководстве.

Создание логического тома вручную включает 4 шага.

  • ШАГ 1: Инициализация диска в качестве физического тома.
  • ШАГ 2: Создание группы томов для физического тома.
  • ШАГ 3: Создание логического тома из группы томов.
  • ШАГ 4: Форматирование логического тома и монтирование файловой системы.

Чтобы узнать, как выполнить эти 4 шага вручную, посмотрите нашу статью Руководство по LVM в Linux для начинающих.

Сбор информации о хранилище из Ansible

В качестве первого шага вам нужно собрать информацию о диске для целевого узла. Это полезно, когда вы хотите динамически решать вопрос о распределении пространства.

Вы можете сделать это вручную или использовать механизм ansible facts, который собирает информацию о дисках. Приведенный ниже плейбук получит информацию о дисках целевого хоста.

---
- name: LVM Setup
 hosts: localhost
 connection: local
 gather_facts: true
 tasks:
   - name: Collect stats for hardware
     ansible.builtin.setup:
       gather_subset:
         - hardware
   - name: Print the stat output for devices
     ansible.builtin.debug:
       var: hostvars[inventory_hostname].ansible_devices

Приведенный выше плейбук сначала соберет информацию об оборудовании с помощью модуля setup. Во второй задаче будет напечатан вывод только ansible_devices.

В дальнейшем вы можете применять всевозможные фильтры в соответствии с вашими требованиями для получения конкретных данных и вычисления динамических значений для создания новых разделов. Например, приведенная ниже задача выведет все устройства, начинающиеся с sd и их размер.

- name: Print the disk size only for sd disks
 ansible.builtin.debug:
   msg: "{{ ansible_devices[item].size }}"
 loop: "{{ ansible_devices.keys() | map('regex_search', 'sd.*') | select('string') | list }}"

Поскольку у меня только один диск, она выведет размер диска sda.

TASK [Print the disk size only for sd disks] **********************************************
ok: [localhost] => (item=sda) => {
    "msg": "931.51 GB"
}

Ansible Playbook для создания LVM

Я буду использовать следующий playbook для демонстрации. Вы можете повторить тот же код, изменив имя диска и размер раздела в соответствии с вашими требованиями.

---
- name: LVM Testing
 hosts: localhost
 become: true
 gather_facts: False
 tasks:
   - name: Partition /dev/sdd disk
     community.general.parted:
       device: /dev/sdd
       number: 1
       flags: [ lvm ]
       state: present
       part_end: 5GiB
   - name: Task for PV and VG
     community.general.lvg:
         vg: ostechnixlab
         pvs: /dev/sdd1
   - name: Logical volume with 1GB size
     community.general.lvol:
       vg: ostechnixlab
       lv: labpart1
       size: 1G
   - name: Format the volume with ext4 fs
     community.general.filesystem:
       fstype: ext4
       dev: /dev/ostechnixlab/labpart1
   - name: Target directory under /opt/
     ansible.builtin.file:
       path: /opt/lvm_test/
       state: directory
       mode: '0755'
   - name: mount the lv on /data1
     ansible.posix.mount:
       path: /opt/lvm_test/
       src: /dev/ostechnixlab/labpart1
       fstype: ext4
       state: mounted

Создание тома с помощью модуля Parted

В качестве первого шага вы должны создать том из необработанного диска с lvm в качестве типа. Вы можете использовать весь диск или дополнительно разбить его на разделы и использовать только этот конкретный раздел для LVM.

Ansible использует модуль parted для создания разделов. Это похоже на команду parted в Linux, которая используется для настройки разделов устройства.

Важно: parted в модуле сообщества, который поставляется с пространством имен community.general. Если у вас не установлены модули сообщества, установите их с помощью следующей команды.

ansible-galaxy collection install community.general

У меня есть диск /dev/sdd размером 15GB.

lsblk /dev/sdd
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd    8:48   0  15G  0 disk 

Я создам раздел /dev/sdd1 размером 5GB. Следующая задача использует модуль parted для создания раздела /dev/sdd1 размером 5GB с lvm в качестве типа.

  • device: Введите имя блочного устройства, например /dev/sda, /dev/sdb и т.д.
  • number: Количество разделов, которые будут созданы. Здесь оно задано как 1.
  • flags: Задает тип раздела. В данном случае это LVM.
  • state: Установка состояния в «present» создаст раздел.
  • part_end: Размер для раздела.
- name: Partition /dev/sdd disk
 community.builtin.parted:
   device: /dev/sdd
   number: 1
   flags: [lvm]
   state: present
   part_end: 5GiB

Следующий вывод для приведенной выше задачи.

Выполните команду lsblk для проверки раздела.

lsblk /dev/sdd
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd      8:48   0  15G  0 disk 
└─sdd1   8:49   0   5G  0 part 

Создание физического тома и группы томов

Следующим шагом будет инициализация /dev/sdd1 как физического тома и добавление его в группу томов. Используйте lvg модуль, который также поддерживается в пространстве имен community.general.

Следующая задача инициализирует /dev/sdd1 как физический том и добавит его в группу томов с именем ostechnixlab.

- name: Task for PV and VG
  lvg:
      vg: ostechnixlab
      pvs: /dev/sdd1

Следующий вывод для приведенной выше задачи.

Вы также можете инициализировать несколько физических томов и добавить их в группу томов.

- name: Task for PV and VG
  lvg:
      vg: ostechnixlab
      pvs: /dev/sdd1, /dev/sdd2, /dev/sdd3

Вы также можете определить размер экстента. По умолчанию он установлен на 4MB.

- name: Task for PV and VG
  lvg:
      vg: ostechnixlab
      pvs: /dev/sdd1, /dev/sdd2, /dev/sdd3
      pesize: 8

Вы можете проверить состояние группы томов, выполнив следующую команду.

sudo vgs ostechnixlab
  VG           #PV #LV #SN Attr   VSize  VFree 
  ostechnixlab   1   0   0 wz--n- <5.00g <5.00g

Создание логического тома

Следующим шагом будет создание логического тома с помощью поддерживаемой сообществом команды lvol module.

В приведенной ниже задаче я создаю логический том под названием lbapart1 из группы томов ostechnixlab. Общий размер группы томов составляет 5 ГБ, а логический том имеет размер 1 ГБ.

- name: Logical volume with 1GB size
  community.general.lvol:
    vg: ostechnixlab
    lv: labpart1
    size: 1G

Следующий вывод для приведенной выше задачи.

Выполните команду lvs, чтобы проверить созданный том.

sudo lvs
   LV       VG            Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  labpart1 ostechnixlab  -wi-a----- 1.00g

Монтирование логического тома

На этом шаге вы смонтируете логический том, чтобы начать его использовать. Сначала необходимо отформатировать том с любым поддерживаемым типом файловой системы и смонтировать том.

Я разделю вышеописанные шаги на 3 задачи.

  1. Первая задача отформатирует том с файловой системой ext4. Для этого следует использовать модуль filesystem, который является частью пространства имен community.general.
  2. Вторая задача будет использовать модуль file для создания каталога с томом, который будет смонтирован. Для этого следует использовать модуль file, который является частью пространства имен ansible.builtin.
  3. Третья задача смонтирует отформатированный том в файловой системе, которую мы создали во второй задаче. Для этого следует использовать модуль mount, который является частью пространства имен ansible.posix.
- name: Format the volume with ext4 fs
  community.general.filesystem:
   fstype: ext4
   dev: /dev/ostechnixlab/labpart1
- name: Target directory under /opt/
  ansible.builtin.file:
   path: /opt/lvm_test/
   state: directory
   mode: '0755'
- name: mount the lv on /data1
 ansible.posix.mount:
   path: /opt/lvm_test/
   src: /dev/ostechnixlab/labpart1
   fstype: ext4
   state: mounted

Следующий вывод для вышеуказанных задач.

Вы можете использовать команду mount или df для проверки типа файловой системы и статуса монтирования.

mount | grep -i labpart1
/dev/mapper/ostechnixlab-labpart1 on /opt/lvm_test type ext4 (rw,relatime)
df -h /opt/lvm_test/
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/ostechnixlab-labpart1  974M   24K  907M   1% /opt/lvm_test

Заключение

В этой статье мы рассмотрели различные модули ansible, которые можно использовать для создания разделов, логического тома и монтирования файловой системы. Вы можете создать специальную роль для LVM и повторно использовать ее в различных средах динамически, просто передавая аргументы.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен ostechnix.com

Похожие статьи

Комментарии (0)