Облачные провайдеры предлагают готовые образы операционных систем, но в реальных проектах часто требуются кастомизированные сборки. Особенно это актуально для Windows Server, когда нужно предустановить специфическое ПО, настроить политики безопасности или оптимизировать конфигурацию под нагрузку. На днях на Habr появилась статья, в которой разработчики поделились детальным опытом сборки собственного образа Windows Server для Яндекс Облака. Разберём ключевые этапы, технические нюансы и типичные грабли, чтобы вы могли повторить этот процесс без лишних итераций.
Почему стандартные образы не подходят?
Яндекс Облако предоставляет несколько версий Windows Server — от 2019 до 2022, но они имеют «коробочные» настройки. В проектах с сотнями виртуальных машин каждый лишний шаг при развёртывании превращается в часы простоев. Кастомный образ позволяет:
- исключить ручную донастройку после старта ВМ;
- встроить агенты мониторинга, антивирусы, сертификаты;
- заранее настроить брандмауэр и RDP;
- ускорить запуск новых инстансов до 2–3 минут.
Разработчики из сообщества столкнулись с тем, что документация Облака по созданию собственных образов довольно лаконична. Поэтому они решили опубликовать проверенный рецепт на основе Packer и Ansible.
Инструментарий: Packer, Ansible и Object Storage
В основе процесса лежит Packer от HashiCorp — инструмент для создания идентичных машинных образов. В качестве источника используется установочный ISO-образ Windows Server (например, с портала VLSC или пробной версии). Для автоматизации конфигурации применяется Ansible, хотя можно обойтись и PowerShell-скриптами.
Схема работы:
1. Packer запускает виртуальную машину в Яндекс Облаке из временной загрузочной ОС (Linux или Windows).
2. Монтирует ISO, выполняет установку в unattend-режиме.
3. После завершения установки запускает скрипты (через provisioner).
4. На последнем этапе запускает Sysprep, выгружает готовый VHD-диск в Object Storage.
5. Из Object Storage образ импортируется в каталог Облака как собственный.
Авторы статьи отмечают, что самым сложным оказался этап с Sysprep — без правильного ответного файла система либо зависала, либо не проходила генерализацию.
Подготовка unattend.xml и ключевые настройки
Файл unattend.xml — это сердце автоматической установки. В нём нужно задать:
- раздел диска;
- ключ продукта (если нужна активация);
- имя компьютера и пароль администратора;
- настройки сети (DHCP);
- отключение UAC и экрана блокировки;
- включение RDP и открытие порта 3389 в брандмауэре;
- установка драйверов VirtIO (дисковые и сетевые).
Без драйверов VirtIO Windows не увидит диск в Яндекс Облаке, а сетевой адаптер будет определён как неизвестное устройство. Разработчики советуют скачивать последнюю версию VirtIO-win с Fedora People и добавлять её в состав образа через Packer.
ВАЖНО: в unattend.xml для раздела Microsoft-Windows-Shell-Setup нужно указать OOBE с параметром HideEULAPage и SkipMachineOOBE, иначе после первого входа появится мастер настройки, который не получится обойти удалённо.
Sysprep без сюрпризов
После установки всех компонентов необходимо выполнить генерализацию — Sysprep с параметрами /generalize /oobe /shutdown. Образ должен быть выключен именно этим способом, иначе Packer не сможет корректно захватить диск.
Авторы столкнулись с ошибкой, когда Sysprep завершался неудачно из-за того, что в образе оставались включёнными службы, не поддерживающие генерализацию. Решение — отключать лишние роли (по умолчанию ставятся только минимальные компоненты) и проверять журнал %WINDIR%\System32\Sysprep\Panther\setuperr.log.
После успешного выполнения Sysprep виртуальная машина выключается. Packer снимает снапшот диска, конвертирует в VHD (если нужно) и загружает в указанный бакет Object Storage.
Импорт образа в Яндекс Облако
Когда VHD-файл лежит в Object Storage, остаётся выполнить импорт через CLI или консоль:
yc compute image create \
--name windows-server-2022-custom \
--folder-id <folder-id> \
--source-object-bucket-name <bucket> \
--source-object-key <path>/disk.vhd \
--os-type windows
Параметр --os-type windows обязателен — он включает лицензионную модель (BYOL или платная). Если его упустить, образ будет считаться Linux, и лицензия не сработает.
После импорта образ появляется в списке собственных. Из него можно создавать виртуальные машины с любым типом дисковой подсистемы (HDD, SSD, НСД). В статье отмечается, что загрузка ВМ из кастомного образа занимает примерно 3–4 минуты — это время уходит на инициализацию и OOBE (даже с скрытыми страницами).
Таблица: сравнение стандартного и кастомного образа
| Параметр | Стандартный образ | Кастомный образ |
|---|---|---|
| Время первой настройки после старта | 10–15 минут вручную | 0 минут (всё готово) |
| Состав ПО | Только ОС + драйверы VirtIO | ОС + любое ПО по вашему списку |
| Возможность аудита | Нет (конфигурация не воспроизводится) | Есть (Packer-шаблон в Git) |
| Запуск по расписанию патчей | — | Можно включить в автоматизацию |
Типичные проблемы и их решение
Проблема 1: Образ не грузится в Яндекс Облаке
Причина: не установлены драйверы VirtIO для контроллера диска. Решение: смонтировать ISO VirtIO в Packer-провижнере и установить драйверы через DISM или Setup.
Проблема 2: После Sysprep не получается подключиться по RDP
Причина: в unattend.xml не прописан параметр AutoLogon или FirstLogonCommands, из-за чего OOBE требует интерактивного входа. Решение: добавить секцию FirstLogonCommands, которая запускает PowerShell-скрипт, включающий удалённое управление и отключающий экран приветствия.
Проблема 3: Ошибка активации на новых ВМ
Если вы используете лицензию с подпиской (Pay-As-You-Go), активация происходит автоматически — образ должен быть собран без ключа. Для BYOL — ключ продукта нужно оставить в unattend.xml, но тогда Sysprep не «сбросит» активацию, и каждая ВМ потребует отдельной активации. Разработчики советуют при сборке не указывать ключ вообще (пропустить этот шаг) и положиться на механизмы Облака.
Преимущества подхода для teams и enterprise
Автоматизация сборки образов с помощью Packer — это не разовая задача, а часть CI/CD инфраструктуры. Описанный метод легко встраивается в GitLab CI или Jenkins:
- Каждое изменение в конфигурации (новое ПО, обновление драйверов) проходит через пайплайн.
- Образы версионируются — всегда можно откатиться.
- Время развёртывания новых стендов сокращается с часов до минут.
Команда проекта, поделившаяся статьёй, использует этот подход уже полгода и отмечает снижение количества ручных операций на 80%.
Заключение
Сборка собственного образа Windows Server для Яндекс Облака — задача не тривиальная, но вполне решаемая с помощью Packer, unattend.xml и Object Storage. Главное — правильно подготовить ответный файл и не забыть про драйверы VirtIO. Если вы devops-инженер или администрируете крупную инфраструктуру на Windows, обязательно попробуйте внедрить такой пайплайн. Это сэкономит не только ваше время, но и деньги на лишних часах работы ВМ.
Подробное описание всех шагов, включая полные примеры unattend.xml и Ansible-плейбуков, читайте в оригинальной статье: Источник.
Комментарии