Мы планируем автоматизировать создание виртуальных машин для нашей инфраструктуры сборки, чтобы мы могли:
- Масштабируйте ресурсы сборки на основе спроса, например, добавляя больше агентов сборки, когда это необходимо, и удаляя их, когда это не нужно.
- Воссоздать всю или часть среды сборки, если / когда машины умирают
- Дублируйте среду сборки, когда нам нужна настройка теста
Одним из шагов в этом процессе является автоматизация создания базовых образов виртуальных машин (в нашем случае это Hyper-V). Для этого у нас есть скрипт, который:
- Создает новый VHDX из ISO с помощью скрипта Convert-WindowsImage . В настоящее время мы используем Windows 2012R2, но начнем с 2016 года, как только она станет доступна.
- Добавляет сценарий автоматической установки в новый VHDX со всей необходимой базовой конфигурацией
- Обновляет VHDX с последними обновлениями Windows, используя скрипт Apply-WindowsUpdate
- Создает новую виртуальную машину Hyper-V на основе VHDX и запускает ее
- Ожидание загрузки виртуальной машины и ожидание готовности службы WinRM принимать удаленные подключения.
- Ожидает, пока Windows завершит начальную настройку и настройку новых патчей.
- Применяет любые дальнейшие патчи
- Перезагружается для завершения настройки последних патчей
- Ожидает, пока Windows завершит настройку патчей.
- Выдвигает сценарий sysprep на компьютер и вызывает этот сценарий. Это запускает sysprep, а затем выключает машину
- Удаляет виртуальную машину, но сохраняет VHDX
- Удаляет файлы sysprep и unattend из VHDX, а затем сжимает VHDX
- Перемещает VHDX в расположение шаблона и помечает его как доступный только для чтения.
Проблема, с которой мы сталкиваемся, заключается в шагах 6 и 9. В идеале мы ждем завершения всей конфигурации, прежде чем перезагрузить / выключить машину, но, похоже, нет способа определить, что Windows завершила стадию настройки.
При прохождении пользовательского интерфейса становится очень ясно, когда выполняется любой из этих шагов, поскольку пользовательский интерфейс входа в систему не отображается до тех пор, пока процесс не будет готов. Однако при использовании WinRM для удаленного подключения к машине это не так очевидно, поскольку WinRM предоставляет доступ к машине до того, как она будет выполнена с настройкой.
Поэтому вопрос заключается в том, какой самый надежный способ обнаружить через удаленное соединение, что Windows завершила настройку обновлений и т. Д., Чтобы мы могли перезагрузить / выключить компьютер, не вызывая проблем в дальнейшем.
------ РЕДАКТИРОВАТЬ -----
В конце мы используем измененную версию ответа Кэтрин, в которой наш сценарий также ожидает windeploy
и ngen
завершает. Учитывая, что ngen
это не завершится до тех пор, пока ОС не завершит инициализацию, которая работает, и в качестве бонуса финальный VHDX будет иметь все .NET Framework ngen-ed, что означает, что нам не придется иметь дело с этим при создании нового ВМ шаблона диска. Оба сценария, которые мы используем для создания шаблона VHDX, и сценарии для создания локальной тестовой среды находятся на github на случай, если кому-то это будет интересно.