Сразу предупреждение, которое нельзя пропускать. Работа с дисками деструктивна. Модуль 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 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%
Теперь кладём файловую систему. Это ключевой момент для запроса "ansible filesystem":
Код: Выделить всё
- name: Создать XFS на разделе
community.general.filesystem:
dev: /dev/vdb1
fstype: xfs
Финальный шаг - постоянное монтирование. Тема "ansible mount" и "ansible fstab" - это один и тот же модуль:
Код: Выделить всё
- name: Смонтировать XFS и записать в fstab
ansible.posix.mount:
path: /data
src: /dev/vdb1
fstype: xfs
opts: defaults
state: mounted
- mounted - смонтировать и записать в fstab (рабочая лошадка).
- present - только дописать в fstab, без монтирования прямо сейчас.
- unmounted - размонтировать, но строку в fstab оставить.
- absent - размонтировать и убрать из fstab.
- remounted - перемонтировать с новыми опциями.
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
Собранный плейбук на новый диск выглядит так:
Код: Выделить всё
- 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
Типичные грабли
- Перепутал устройство. Самая дорогая ошибка. 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.