LVM через Ansible: тома, группы и расширение

Рейтинг: 67.6% · 8 голосов
Подробный курс по Ansible с прицелом на экзамен RHCE EX294: установка и инвентарь, плейбуки, переменные и факты, Vault, циклы и условия, шаблоны Jinja2, роли и коллекции, Execution Environments и ansible-navigator, управление системами (диски, LVM, cron, SELinux, firewalld). Примеры на RHEL/Fedora. Актуально на 2026.
Ответить
Аватара пользователя
Maksim_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

LVM через Ansible: тома, группы и расширение

Сообщение Maksim_DevOps »

Оглавление курса (47)
  1. Что такое Ansible и зачем он нужен: автоматизация без агентов
  2. Сертификация RHCE и экзамен EX294: что внутри и как готовиться
  3. Архитектура Ansible: control node, узлы, модули и плагины
  4. Установка Ansible на control node: dnf, pip и версии ansible-core
  5. Подготовка управляемых узлов: SSH, пользователь и sudo
  6. Инвентарь Ansible: hosts, группы и переменные
  7. Настройка Ansible: файл ansible.cfg и приоритеты конфигурации
  8. Host patterns и инструменты командной строки Ansible
  9. Ad hoc команды Ansible: быстрые задачи без плейбука
  10. Ansible playbook: что это такое и как устроен
  11. Структура плейбука: play, task, модули и переменные
  12. Запуск плейбуков: проверка, теги, ограничения и отладка
  13. Параллелизм и порядок выполнения: forks, serial, strategy
  14. Факты Ansible: сбор информации об узлах
  15. Переменные Ansible: типы, объявление и приоритет
  16. Регистрация результатов и специальные переменные
  17. Ansible Vault: шифрование паролей и секретов
  18. Организация инвентаря: group_vars, host_vars и вложенные группы
  19. Динамический инвентарь и инвентарные плагины
  20. Циклы в Ansible: loop, списки и словари
  21. Повтор задачи до условия: until, retries и delay
  22. Условия в Ansible: директива when и логика
  23. Jinja2 в Ansible: выражения, фильтры и подстановки
  24. Обработчики Ansible: handlers, notify и flush_handlers
  25. Обработка ошибок: failed_when, changed_when и ignore_errors
  26. Блоки в Ansible: block, rescue и always
  27. Управление файлами: модули file, copy, fetch и stat
  28. Архивы и сборка файлов: archive, unarchive, assemble
  29. Точечное редактирование файлов: lineinfile и blockinfile
  30. Шаблоны Jinja2: модуль template и динамические конфиги
  31. Jinja2 продвинуто: фильтры, циклы, макросы и lookup
  32. Модули Ansible: ansible-doc и поиск нужного модуля
  33. Разработка собственного модуля Ansible на Python
  34. Роли Ansible и Ansible Galaxy: переиспользование
  35. Разработка роли Ansible: создание с нуля
  36. Зависимости ролей и requirements.yml
  37. Коллекции Ansible: ansible.posix, community и своя коллекция
  38. Execution Environments: контейнеры для запуска Ansible
  39. Сборка Execution Environment с ansible-builder
  40. ansible-navigator: запуск плейбуков в Execution Environment
  41. Управление SSH-ключами через Ansible: authorized_key
  42. Управление дисками: filesystem, mount и parted
  43. LVM через Ansible: тома, группы и расширение (вы здесь)
  44. Планировщик задач: cron и systemd timers через Ansible
  45. Безопасность: hardening SSH и репозитории dnf/yum
  46. SELinux через Ansible: булевы, контексты и порты
  47. Сквозной проект и подготовка к экзамену EX294
Зачем вообще автоматизировать LVM

Знакомая боль: на сервере кончилось место под /var, базе нужно срочно расширить раздел, а ты сидишь и в полночь руками гоняешь pvcreate, vgextend, lvextend, resize2fs - и на каждом шаге шанс промахнуться буквой и убить чужие данные. Один сервер - терпимо. Тридцать однотипных нод - уже катастрофа. Именно тут заходит ansible lvm: ты один раз описываешь желаемое состояние диска, и Ansible сам приводит к нему любое количество машин, причём идемпотентно. Прогнал плейбук дважды - второй раз ничего не меняется, потому что состояние уже достигнуто.

Для тех, кто готовится к RHCE (EX294), это не теория, а хлеб с маслом. Сборка LVM (lvg/lvol) на новом диске и расширение тома без простоя - типовая экзаменационная задача. На ней регулярно срезаются: то порядок задач перепутают, то filesystem забудут растянуть, то resize запустят там, где данные жалко. Разберём всю цепочку по косточкам.

Изображение

Механика: из чего собирается LVM и какие модули за это отвечают

Напомню физику в трёх словах. LVM - это слой абстракции между блочным устройством и файловой системой. Снизу вверх:
  • PV (physical volume) - физический том, то есть размеченный раздел диска или весь диск.
  • VG (volume group) - группа томов, общий "пул" места, собранный из одного или нескольких PV.
  • LV (logical volume) - логический том, который нарезается из пула VG. Вот на нём уже живёт файловая система.
Кайф LVM в том, что границы LV не привязаны к физике диска. Закончилось место - добавил ещё один PV в группу и растянул нужный том. Без переразбивки, часто без размонтирования и простоя.

В Ansible этим заведуют модули из коллекции community.general (она входит в стандартный ansible пакет, отдельно ставить обычно не надо):
  • community.general.parted - размечает диск, создаёт раздел с флагом lvm.
  • community.general.lvg - создаёт и расширяет volume group из физических томов. PV он создаёт сам неявно из указанных в pvs устройств - отдельного модуля под pvcreate в типовом сценарии не нужно.
  • community.general.lvol - создаёт логический том, задаёт его размер, расширяет (в том числе на +100%FREE) и при желании растягивает ФС параметром resizefs.
  • community.general.filesystem - кладёт на LV файловую систему (xfs, ext4 и т.д.).
  • ansible.posix.mount - монтирует и прописывает запись в /etc/fstab.
Это и есть полная цепочка: parted раздел -> lvg -> lvol -> filesystem -> mount. Порядок не косметический, это жёсткая зависимость: нельзя собрать VG из раздела, которого ещё нет, и нельзя нарезать LV из несуществующей группы.

Практика: ansible lvg и ansible lvol - собираем LVM на новом диске

Допустим, в систему воткнули чистый диск /dev/sdb. Хотим: раздел под LVM, группу vg_data, том lv_app на 5 ГиБ с XFS, смонтированный в /opt/app. Вот рабочий ansible lvm пример целиком.

Код: Выделить всё

---
- name: Собрать LVM на новом диске
  hosts: storage
  become: true
  tasks:

    - name: Создать GPT-раздел под LVM на /dev/sdb
      community.general.parted:
        device: /dev/sdb
        number: 1
        label: gpt
        flags: [lvm]
        part_start: 0%
        part_end: 100%
        state: present

    - name: Создать volume group из раздела
      community.general.lvg:
        vg: vg_data
        pvs:
          - /dev/sdb1
        state: present

    - name: Создать логический том на 5 ГиБ
      community.general.lvol:
        vg: vg_data
        lv: lv_app
        size: 5g
        state: present

    - name: Положить XFS на логический том
      community.general.filesystem:
        fstype: xfs
        dev: /dev/vg_data/lv_app

    - name: Смонтировать и прописать в fstab
      ansible.posix.mount:
        path: /opt/app
        src: /dev/vg_data/lv_app
        fstype: xfs
        state: mounted
Запускаешь - и на всех нодах группы storage появляется готовый смонтированный том. Прогоняешь второй раз - все задачи зелёные и ok, ничего не пересоздаётся. Это и есть идемпотентность, которую так любят гонять на экзамене.

Короткая пометка по дистрибутивам. Команды и пути выше - для RHEL/Fedora/RED OS/Astra, то есть всего systemd-семейства; модули LVM от дистрибутива не зависят, потому что под капотом вызывают одни и те же утилиты lvm2. Разница лишь в имени файловой системы: на RHEL по умолчанию принято брать xfs, на Debian/Ubuntu чаще ext4 - но fstype в модуле ты задаёшь явно, так что плейбук переносим как есть. Учти только, что xfs физически нельзя уменьшить, его можно лишь растить.

Расширение тома без простоя - то, ради чего всё затевалось

Самый частый реальный кейс: место кончилось, надо добавить, не выгоняя сервис. Тут модуль ansible lvol раскрывается в полную силу. Конструкция size с плюсом означает "добавить к текущему размеру", а 100%FREE - "забрать всё свободное место группы".

Код: Выделить всё

    - name: Растянуть том на всё свободное место VG и расширить ФС
      community.general.lvol:
        vg: vg_data
        lv: lv_app
        size: +100%FREE
        resizefs: true
Ключевой параметр здесь - resizefs: true. Без него ты увеличишь только логический том, а файловая система останется прежнего размера, и df -h покажет старые цифры. Классическая ловушка новичка: "LV вырос, а места нет". resizefs сам подберёт нужную утилиту - xfs_growfs для XFS, resize2fs для ext4 - и сделает это онлайн, на смонтированном томе, без остановки сервиса.

А что если ты сначала увеличил сам диск (например, расширил виртуальный диск в гипервизоре или облаке)? Тогда раздел и PV не знают, что под ними стало больше места. На этот случай у lvg есть параметр pvresize: он перечитывает размер физических томов и подтягивает группу.

Код: Выделить всё

    - name: Подтянуть размер PV после роста диска
      community.general.lvg:
        vg: vg_data
        pvs:
          - /dev/sdb1
        pvresize: true
Полная цепочка "вырос диск -> вырос сервис без простоя" получается такая: расширил раздел (parted) -> pvresize в lvg -> +100%FREE с resizefs в lvol. Три задачи, ноль ручных команд, ноль downtime.

Типичные грабли
  • Перепутан порядок задач. lvol до lvg, lvg до parted - и плейбук падает с "volume group not found" или "device not found". Зависимость линейная, не ленись держать её в правильной последовательности.
  • Забыт resizefs. Том вырос, ФС нет. Симптом - df показывает старый объём при том, что lvs показывает новый. Лечится повторным проходом lvol с resizefs: true.
  • Уменьшение тома. Расширение онлайн безопасно, а вот сжатие - нет. XFS уменьшить вообще нельзя в принципе. ext4 можно, но только на размонтированном томе и заранее ужав ФС. Модуль lvol по умолчанию не даст ужать LV без явного shrink: true именно потому, что это операция с риском потери данных. Не сжимай боевые тома на автопилоте.
  • parted на диске с данными. Модуль управляет таблицей разделов. Промахнулся device-ом, указал диск с живой разметкой - и снёс чужие данные. На проде всегда сверяй имя устройства, а лучше прогоняй в режиме --check на тестовой машине.
  • Имена устройств "плавают". /dev/sdb сегодня может стать /dev/sdc после перезагрузки или добавления контроллера. Для критичных вещей опирайся на стабильные идентификаторы (by-id, by-path), а не на короткие имена.
Мини-лаба: повтори руками

Возьми тестовую виртуалку RHEL/Fedora (или RED OS) и добавь ей второй чистый диск.
  • Напиши плейбук, который проходит всю цепочку parted -> lvg -> lvol -> filesystem -> mount и монтирует том на 2 ГиБ в /srv/lab.
  • Прогони его дважды. Убедись, что второй прогон полностью идемпотентен (changed=0).
  • Расширь том на +100%FREE с resizefs: true и проверь результат через df -h и lvs - цифры должны совпасть.
  • Добавь в группу второй PV (ещё один раздел), снова растяни том и убедись, что место пришло из нового диска.
  • Для самопроверки глянь lsblk, vgdisplay и cat /etc/fstab - запись о монтировании должна быть на месте.
Контрольные вопросы
  • В каком порядке должны идти задачи parted, lvg, lvol, filesystem, mount и почему этот порядок нельзя менять?
  • Что делает size: +100%FREE и зачем рядом обязателен resizefs: true?
  • Чем pvresize в модуле lvg отличается от расширения через lvol и когда он нужен?
  • Почему расширение тома Ansible делает безопасно онлайн, а уменьшение требует осторожности и отдельного флага?
Итог

LVM в Ansible - это пять модулей community.general и ansible.posix, выстроенных в строгую цепочку parted -> lvg -> lvol -> filesystem -> mount. Создание описывается декларативно и идемпотентно, расширение тома делается онлайн без простоя через +100%FREE и resizefs, а pvresize подтягивает группу после роста физического диска. Держи в голове порядок задач, не забывай растягивать ФС и трижды думай перед уменьшением - и LVM-задача на EX294 перестанет быть проблемой.
👍2 ❤️3 🔥1 😄 🤔5
Аватара пользователя
miamiheat
Сообщения: 1
Зарегистрирован: 24 май 2026, 23:57

Re: LVM через Ansible: тома, группы и расширение

Сообщение miamiheat »

Спасибо, наконец дошло про resizefs. Сидел и не понимал почему lvs показывает 20 гигов а df все равно 10. Прогнал второй раз с resizefs true и все встало.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
joevanni
Сообщения: 1
Зарегистрирован: 24 май 2026, 01:47

Re: LVM через Ansible: тома, группы и расширение

Сообщение joevanni »

А если диск в облаке расширили прямо на ходу, parted надо part_end снова 100% гонять или сразу к pvresize переходить? У меня sdb1 уже на весь диск был.
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Управление дисками: filesystem, mount и parted
Следующая глава →
Планировщик задач: cron и systemd timers через Ansible

Все главы курса «Ansible: автоматизация и подготовка к RHCE (EX294)»

Поделиться темой: ✈ Telegram VK
Похожие запросы: ansible для начинающих с чего начатьустановка ansible на linuxпеременные ansible приоритет какая важнеециклы ansible loop по списку и словарюколлекции ansible posix и community установка через galaxy и fqcn модулейчто такое execution environment и зачем нужен ansible-navigator

Вернуться в «Ansible: автоматизация и подготовка к RHCE (EX294)»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость