Автоматизация подготовки тестового стенда на базе Hyper-V с помощью PowerShell
В проектной работе часто используется тестовый стенд для проработки решений. Время от времени на стенде проводятся различные эксперименты, ни какого логирования об изменениях не ведутся. Со временем "замученный" стенд требует переустановки с последующей настройкой с нуля.
Переустановить стенд в ручном режиме в среднем занимает один день. Выделить на это время сложно. Решил потратить день на создание автоматизации, но теперь при необходимости стенд пересоздаю за 5 минут.
Инфраструктура
Для организации стенда хватает рабочей станции под управлением клиентской Windows с установленным Hyper-V на которой возможно организовать стенд для тестирования.
Характеристики рабочей станции
DISK C:\ - Samsung M2 240Gb (System disk)
DISK D:\ - Samsung SSD 870 EVO 500Gb (Data disk)
Рабочую станцию пришлось прокачать в плане объема оперативной памяти и жесткого диска. Для тестового стенда как правило больших требований к процессору не предъявляю, главное наличие SSD-диска и чем больше оперативной памяти тем лучше. Это позволит запускать больше виртуальных машин одновременно или запускать ресурсоемкие продукты вроде Configuration Manager, Operation Manager или Exchange Server.
Все виртуальные машины хранятся в каталоге D:\Hyper-V\
В Hyper-V настроены два типа коммутаторов: vExternal и vPrivate. vExternal сопоставил с Wi-Fi адаптером, чтобы у виртуальных машин был доступ в Интернет.
Чаще разворачиваю дополнительную виртуальную машину, с настроенной службой RRAS, которая выполняет роль шлюза для доступа в интернет.
Но тут вылезла одна особенность, скорость на рабочей станции раз в 10 падает. В интернете нашел решение, который процентов на 80% восстанавливает скорость.
- Открываем оснастку устройств (Device Manager) и находим сетевой адаптер Microsoft Network Adapter multiplexor Driver
- Заходим в свойства и устанавливаем значение Disabled для двух параметров: Large Send Offload Version 2 (IPv4) и Large Send Offload Version 2 (IPv6)
Далее, вручную готовим эталонный образ с диском виртуальной машины. Этих эталонных образов понадобится столько, сколько предполагается использовать типов операционных систем. Как правило хватает Windows Server 2019 Standard и Windows 10 Pro, иногда Windows 10 Enterprise.
Эталонный образ виртуальной машины необходим, чтобы сэкономить время на установку операционной системы, а также сэкономить объем жесткого диска, так как будут использоваться разностные диски и эталонный образ будет является родительским диском для новой виртуальной машины. Для демонстрационного стенда идеальное решение.
Все как обычно: создаем виртуальную машину, запускаем, устанавливаем операционную систему, желательно установить обновления, далее выполняем команду Sysprep с файл ответом, чтобы при первом запуске не настраивать операционную систему. Быстро подготовить файл ответов без разворачивания Windows ADK может помочь онлайн конфигуратор на сайте https://www.windowsafg.com. Выключаем виртуальную машину. Готово.
Необходимые настройки операционной системы при первом запуске сохраняем в файл, например, autounattend.xml, который и будет использоваться как один из параметров файла ответов для Sysprep.
sysprep /generalize /oobe /shutdown /unattend:c:\autounattend.xml
В каталоге D:\Hyper-V\ создаем новый Template, в котором будут размещаться диски с эталонными образами операционных систем со своей системой обозначения:
w2k16 - Windows Server 2016 Standard
w2k19 - Windows Server 2019 Standard
w2k22 - Windows Server 2022 Standard
Инструментарий
В качестве автоматизации используется PowerShell. Код удобно писать в Visual Studio Code, иногда в PowerShell ISE, а хранить результат в репозитории GitHub.
Постарался сделать универсальный инструмент для автоматического поднятия демо стенда. Для этого необходимо заполнить CSV-файл, где будут перечислены все виртуальные машины с их параметрами.
Логика работы
В автоматическом режиме будет:
- созданы все виртуальные машины из списка CSV-файла
- развернут контроллер домена
- все виртуальные серверы автоматически включены в домен при условии если это значение было указано в CSV-файле (domain/workgroup)
Прежде чем запустить код на PowerShell, необходимо скорректировать значения переменных под свою инфраструктуру. И обязательно указать логин и пароль локального администратора от эталонных образов виртуальных машин с установленной операционной системой. Иначе магия автоматизации не произойдет.
В моем случае для всех систем сделал одинаковый логин и пароль, когда создавал файл ответов для запуска Sysprep на эталонных виртуальных машинах:
Когда все готово можно запускать скрипты по очереди:
- Add-VM.ps1 - скрипт для создания всех виртуальных машин из CSV-файла.
После отработки скрипта необходимо подождать пока операционные системы подготовятся на созданных виртуальных машинах, т.к. при первом запуске отрабатывается файл ответом, который был запущен на виртуальной машине, когда была подготовка эталонного образа операционной системы. - Add-AD.ps1 - скрипт для поднятия контроллера домена
После запуска необходимо дождаться автоматической настройки сервера и установки роли контроллера домена. - Set-Server.ps1 - скрипт для настройки серверов: присвоение имени, назначения IP-адреса и ввода в домен если это указано в CSV-файле.
- Set-Client.ps1 - скрипт для настройки клиентов: присвоение имени, назначения IP-адреса и ввода в домен если это указано в CSV-файле.
Так как это решение пока сделано "на коленке" приходится запускать скрипты по очереди. В планах объединить 4 скрипта в один, с указанием необходимых параметров. Нет пределу совершенства. Но и в таком виде это сильно экономит время.
Репозиторий скриптов для скачивания
https://github.com/dasternd/msware-PS-Kit/tree/main/DemoStand