PowerShell
March 16, 2022

Автоматизация подготовки тестового стенда на базе Hyper-V с помощью PowerShell

В проектной работе часто используется тестовый стенд для проработки решений. Время от времени на стенде проводятся различные эксперименты, ни какого логирования об изменениях не ведутся. Со временем "замученный" стенд требует переустановки с последующей настройкой с нуля.

Переустановить стенд в ручном режиме в среднем занимает один день. Выделить на это время сложно. Решил потратить день на создание автоматизации, но теперь при необходимости стенд пересоздаю за 5 минут.

Мультфильм "Крылья, ноги и хвосты", 1986 г. СССР


Инфраструктура

Для организации стенда хватает рабочей станции под управлением клиентской Windows с установленным Hyper-V на которой возможно организовать стенд для тестирования.

Характеристики рабочей станции

CPU - Intel Core i5

RAM - 32Gb

DISK C:\ - Samsung M2 240Gb (System disk)

DISK D:\ - Samsung SSD 870 EVO 500Gb (Data disk)

OS - Windows 11

Рабочую станцию пришлось прокачать в плане объема оперативной памяти и жесткого диска. Для тестового стенда как правило больших требований к процессору не предъявляю, главное наличие SSD-диска и чем больше оперативной памяти тем лучше. Это позволит запускать больше виртуальных машин одновременно или запускать ресурсоемкие продукты вроде Configuration Manager, Operation Manager или Exchange Server.

Настройки окружения

Все виртуальные машины хранятся в каталоге D:\Hyper-V\

настройки месторасположения хранения виртуальных машин

В Hyper-V настроены два типа коммутаторов: vExternal и vPrivate. vExternal сопоставил с Wi-Fi адаптером, чтобы у виртуальных машин был доступ в Интернет.

Чаще разворачиваю дополнительную виртуальную машину, с настроенной службой RRAS, которая выполняет роль шлюза для доступа в интернет.

настройки виртуальных свитчей в Hyper-V

Но тут вылезла одна особенность, скорость на рабочей станции раз в 10 падает. В интернете нашел решение, который процентов на 80% восстанавливает скорость.

  1. Открываем оснастку устройств (Device Manager) и находим сетевой адаптер Microsoft Network Adapter multiplexor Driver
  2. Заходим в свойства и устанавливаем значение Disabled для двух параметров: Large Send Offload Version 2 (IPv4) и Large Send Offload Version 2 (IPv6)

параметры чтобы восстановить скорость работы сети на хосте с установленным Hyper-V

Далее, вручную готовим эталонный образ с диском виртуальной машины. Этих эталонных образов понадобится столько, сколько предполагается использовать типов операционных систем. Как правило хватает 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

w7 - Windows 7 Pro

w7e - Windows 7 Enterprise

w10 - Windows 10 Pro

w10e - Windows 10 Enterprise

w11 - Windows 11 Pro

w11e - Windows 11 Enterprise

шаблоны дисков для виртуальных машин с установленной операционной системой и отработанным Sysprep

Инструментарий

В качестве автоматизации используется PowerShell. Код удобно писать в Visual Studio Code, иногда в PowerShell ISE, а хранить результат в репозитории GitHub.

Постарался сделать универсальный инструмент для автоматического поднятия демо стенда. Для этого необходимо заполнить CSV-файл, где будут перечислены все виртуальные машины с их параметрами.

CSV-файл с параметрами виртуальных машин

Логика работы

В автоматическом режиме будет:

  1. созданы все виртуальные машины из списка CSV-файла
  2. развернут контроллер домена
  3. все виртуальные серверы автоматически включены в домен при условии если это значение было указано в CSV-файле (domain/workgroup)

Прежде чем запустить код на PowerShell, необходимо скорректировать значения переменных под свою инфраструктуру. И обязательно указать логин и пароль локального администратора от эталонных образов виртуальных машин с установленной операционной системой. Иначе магия автоматизации не произойдет.

В моем случае для всех систем сделал одинаковый логин и пароль, когда создавал файл ответов для запуска Sysprep на эталонных виртуальных машинах:

  • логин Administrator
  • пароль P@$$w0rd

Когда все готово можно запускать скрипты по очереди:

  1. Add-VM.ps1 - скрипт для создания всех виртуальных машин из CSV-файла.
    После отработки скрипта необходимо подождать пока операционные системы подготовятся на созданных виртуальных машинах, т.к. при первом запуске отрабатывается файл ответом, который был запущен на виртуальной машине, когда была подготовка эталонного образа операционной системы.
  2. Add-AD.ps1 - скрипт для поднятия контроллера домена
    После запуска необходимо дождаться автоматической настройки сервера и установки роли контроллера домена.
  3. Set-Server.ps1 - скрипт для настройки серверов: присвоение имени, назначения IP-адреса и ввода в домен если это указано в CSV-файле.
  4. Set-Client.ps1 - скрипт для настройки клиентов: присвоение имени, назначения IP-адреса и ввода в домен если это указано в CSV-файле.

скрипты для автоматизации стенда

Так как это решение пока сделано "на коленке" приходится запускать скрипты по очереди. В планах объединить 4 скрипта в один, с указанием необходимых параметров. Нет пределу совершенства. Но и в таком виде это сильно экономит время.


Репозиторий скриптов для скачивания

https://github.com/dasternd/msware-PS-Kit/tree/main/DemoStand