Управление дисками: filesystem, mount и parted

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

Управление дисками: filesystem, mount и parted

Сообщение 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
Тебе прислали в кластер десяток новых серверов, к каждому прицеплен пустой диск /dev/vdb под данные. Руками это значит зайти по ssh, вспомнить, что там было - fdisk или parted, потом mkfs, потом дописать строчку в /etc/fstab, потом mount -a и молиться, чтобы не опечататься. На десяти машинах. А на сотне? Вот тут и начинается ansible: один плейбук размечает диск, кладёт файловую систему и монтирует её постоянно - одинаково на всём парке. В этом уроке разберём связку из трёх модулей, которую на экзамене RHCE (EX294) спрашивают почти всегда: parted, filesystem и mount.

Сразу предупреждение, которое нельзя пропускать. Работа с дисками деструктивна. Модуль parted может стереть таблицу разделов, а filesystem - затереть данные на устройстве. Если перепутаешь vdb с vda, ты убьёшь систему, на которой работаешь. Поэтому диски сначала гоняем на тестовой VM или на заведомо пустом устройстве, и только потом в прод.

Из чего состоит дисковый блок: parted, filesystem, mount

Логика тут ровно та же, что и руками, только декларативная. Три шага:
  • Разметка диска - создаём раздел на чистом устройстве. Модуль community.general.parted. Это аналог утилиты parted: задаёт таблицу разделов (msdos или gpt) и нарезает разделы.
  • Файловая система - на готовом разделе создаём ФС: xfs (дефолт в RHEL) или ext4. Здесь работает модуль filesystem. Важная деталь по состоянию на 2025-2026: в актуальных коллекциях канонический путь к нему - community.general.filesystem. Старое имя ansible.posix.filesystem встречается в части материалов, но если у тебя свежий ansible-core 2.16+ и community.general, ставь FQCN community.general.filesystem. На самом RHEL 9 в комплекте AAP идёт именно эта коллекция.
  • Монтирование - подключаем ФС к точке монтирования и прописываем в /etc/fstab, чтобы пережило перезагрузку. Это ansible.posix.mount.
Когда говорят "ansible диски", обычно имеют в виду как раз эту тройку. По отдельности каждый модуль простой, вся соль - в правильном порядке и в идемпотентности.

Изображение

Практика: ansible parted, ansible filesystem и ansible mount по шагам

Возьмём чистый диск /dev/vdb и проведём его через весь цикл. Сначала разметка через ansible parted:

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

- name: Создать GPT-таблицу и один раздел на весь диск
  community.general.parted:
    device: /dev/vdb
    number: 1
    state: present
    label: gpt
    part_start: 0%
    part_end: 100%
Параметр number - это номер раздела, в итоге получится устройство /dev/vdb1. label: gpt задаёт тип таблицы (для старых msdos-разметок - label: msdos). part_start и part_end удобно задавать в процентах, тогда не надо считать секторы вручную. Модуль идемпотентен по факту существования раздела с таким номером: если /dev/vdb1 уже есть, повторный прогон ничего не ломает.

Теперь кладём файловую систему. Это ключевой момент для запроса "ansible filesystem":

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

- name: Создать XFS на разделе
  community.general.filesystem:
    dev: /dev/vdb1
    fstype: xfs
dev - это устройство (раздел), fstype - тип ФС. Для ext4 просто меняешь fstype: ext4. Модуль идемпотентен: он смотрит, есть ли уже ФС на устройстве, и второй раз mkfs не запускает. Если же тебе действительно нужно пересоздать ФС поверх существующей (а это стирание данных), есть параметр force: true - и вот его в проде трогать страшно.

Финальный шаг - постоянное монтирование. Тема "ansible mount" и "ansible fstab" - это один и тот же модуль:

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

- name: Смонтировать XFS и записать в fstab
  ansible.posix.mount:
    path: /data
    src: /dev/vdb1
    fstype: xfs
    opts: defaults
    state: mounted
state: mounted делает сразу две вещи - монтирует прямо сейчас и добавляет строку в /etc/fstab, плюс создаёт каталог точки монтирования, если его нет. Это самое частое состояние. Различай значения state:
  • mounted - смонтировать и записать в fstab (рабочая лошадка).
  • present - только дописать в fstab, без монтирования прямо сейчас.
  • unmounted - размонтировать, но строку в fstab оставить.
  • absent - размонтировать и убрать из fstab.
  • remounted - перемонтировать с новыми опциями.
На экзамене любят src указывать не по имени /dev/vdb1, а по UUID - так надёжнее, потому что имена устройств могут поехать. Тогда src: UUID=xxxx-xxxx, а сам UUID берётся из факта или из вывода blkid.

Swap и сборка всего в один плейбук

Своп - частая подзадача того же блока. Здесь filesystem не используется, swap делается утилитой mkswap, поэтому шаги другие: формат через community.general.filesystem с fstype: swap, потом активация. Но самое чистое - смонтировать своп через тот же mount с особым синтаксисом:

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

- name: Подготовить swap-раздел
  community.general.filesystem:
    dev: /dev/vdb2
    fstype: swap

- name: Прописать swap в fstab и включить
  ansible.posix.mount:
    path: none
    src: /dev/vdb2
    fstype: swap
    opts: sw
    state: present
  notify: swapon all
Для swap точка монтирования логически отсутствует, поэтому path: none, а state обычно present (в fstab пишем, а включаем отдельно через swapon -a в хендлере, потому что mount свопом не управляет). Это тонкость, на которой многие спотыкаются.

Собранный плейбук на новый диск выглядит так:

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

- name: Подготовка диска для данных
  hosts: storage
  become: true
  tasks:
    - name: Раздел на весь диск
      community.general.parted:
        device: /dev/vdb
        number: 1
        state: present
        label: gpt

    - name: Файловая система XFS
      community.general.filesystem:
        dev: /dev/vdb1
        fstype: xfs

    - name: Постоянное монтирование
      ansible.posix.mount:
        path: /data
        src: /dev/vdb1
        fstype: xfs
        opts: defaults
        state: mounted
Прогнал один раз - диск размечен, отформатирован, смонтирован. Прогнал второй раз - всё зелёное, ноль changed. Вот это и есть идемпотентность дисковых операций.

Типичные грабли
  • Перепутал устройство. Самая дорогая ошибка. vda - почти всегда системный диск. Прежде чем гнать parted, убедись через ansible_facts, что бьёшь по пустому vdb. Лишний --check здесь не спасёт: parted в check-режиме не всегда честно показывает деструктив.
  • Неверный FQCN. Напишешь parted без community.general - и на чистом RHEL 9 получишь "couldn't resolve module". Коллекции community.general и ansible.posix должны быть установлены (ansible-galaxy collection list это покажет).
  • Забыл fstype в mount. Без явного fstype модуль может не угадать тип, особенно для свежесозданной ФС. Указывай xfs/ext4 явно.
  • state: present вместо mounted. Дописал в fstab, а смонтировать забыл - после ребута появится, а сейчас /data пустой. На лабе это выглядит как "сделал, но не работает".
  • force: true по привычке. У filesystem этот флаг переформатирует уже существующую ФС и стирает данные. Не ставь его "на всякий случай".
  • Ubuntu/Debian и RU-дистрибутивы. Сами модули кросс-платформенные, но нужные утилиты лежат в разных пакетах: на RHEL это xfsprogs и e2fsprogs (dnf), на Debian/Ubuntu - те же e2fsprogs и xfsprogs через apt. На RED OS и Astra набор как в RHEL/Debian соответственно. xfs на минимальном Debian может потребовать доустановки xfsprogs.
Мини-лаба

Подними тестовую VM с RHEL 9 (или Fedora) и прицепи к ней второй пустой диск. Руками через Ansible:
  • Через community.general.parted нарежь на /dev/vdb два раздела: один большой под данные, второй маленький под swap (используй part_start/part_end в процентах).
  • На первом создай xfs, на втором - swap через community.general.filesystem.
  • Большой раздел смонтируй в /data с state: mounted, проверь mount | grep data и cat /etc/fstab.
  • swap пропиши в fstab и включи, проверь через swapon --show.
  • Прогони плейбук повторно и убедись, что во втором проходе нет ни одного changed - это и есть проверка идемпотентности.
  • Бонус: перепиши src в mount на UUID= вместо имени устройства.
Контрольные вопросы
  • Какой FQCN-модуль создаёт раздел на чистом диске и какой параметр задаёт тип таблицы (gpt/msdos)?
  • Чем отличается state: mounted от state: present у модуля mount?
  • Почему повторный запуск filesystem на уже отформатированном разделе ничего не делает, и что меняет force: true?
  • Как через mount правильно прописать swap, если у свопа нет точки монтирования?
Итог

Дисковый блок RHCE - это конвейер из трёх модулей: community.general.parted режет разделы, community.general.filesystem кладёт ФС, ansible.posix.mount монтирует и пишет в /etc/fstab. Все три идемпотентны, но parted и filesystem деструктивны, поэтому первое правило - не перепутать устройство. Отработай этот цикл на пустом диске до автоматизма: на экзамене EX294 такая задача почти гарантирована, и сыпятся на ней чаще всего из-за state: present вместо mounted и забытого fstype.
👍3 ❤️2 🔥3 😄 🤔1
Аватара пользователя
grafana8
Сообщения: 1
Зарегистрирован: 03 июн 2026, 09:57

Re: Управление дисками: filesystem, mount и parted

Сообщение grafana8 »

Спасибо, наконец дошло про state present vs mounted. На прошлой пробной лабе как раз записал в fstab, а смонтировать забыл, и думал почему data пустой. Теперь ясно.
👍 ❤️ 🔥1 😄 🤔2
Аватара пользователя
lena42
Сообщения: 1
Зарегистрирован: 30 май 2026, 16:42

Re: Управление дисками: filesystem, mount и parted

Сообщение lena42 »

А правда что filesystem теперь community.general, а не ansible.posix? У меня в старых конспектах ansible.posix.filesystem, проверил galaxy list - и правда лежит в community.general. Хорошо что предупредили, на экзамене бы затупил с FQCN.
👍2 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Управление SSH-ключами через Ansible: authorized_key
Следующая глава →
LVM через Ansible: тома, группы и расширение

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

Поделиться темой: ✈ Telegram VK

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

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

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