Ми плануємо автоматизувати створення віртуальних машин для нашої інфраструктури побудови, щоб ми могли:
- Масштабуйте ресурси збирання на основі попиту, наприклад, додавши більше агентів побудови, коли потрібно, та видаляючи їх, коли не потрібно
- Відтворіть все або частину середовища побудови, якщо / коли машини гинуть
- Дублювати середовище збирання, коли нам потрібна тестова установка
Одним із кроків цього процесу є автоматизація створення базових зображень VM (у нашому випадку з використанням Hyper-V). Для цього у нас є сценарій, який:
- Створює новий VHDX з ISO за допомогою сценарію Convert-WindowsImage . Наразі ми використовуємо Windows 2012R2, але будемо з нетерпінням розпочати роботу з 2016 року, як тільки вона стане доступною.
- Додає сценарій без нагляду до нового VHDX з усією необхідною базовою конфігурацією
- Оновлення VHDX за допомогою останніх патчів Windows за допомогою сценарію Apply-WindowsUpdate
- Створює новий VM Hyper-V на основі VHDX і запускає його
- Чекає завантаження VM і чекає, коли служба WinRM буде готова прийняти віддалені з'єднання
- Чекає, коли Windows завершить початкову конфігурацію та конфігурацію нових патчів
- Застосовує будь-які подальші виправлення
- Перезавантажте для завершення конфігурації останніх виправлень
- Чекає, поки Windows завершить налаштування патчів
- Натискає на машину сценарій sysprep і викликає цей сценарій. Це запускає sysprep, а потім вимикає машину
- Видаляє VM, але зберігає VHDX
- Вилучає файли з системою синхронізації та скасування запиту з VHDX, а потім ущільнює VHDX
- Переміщує VHDX до місця розташування шаблону та позначає лише для читання
Проблема, яку ми відчуваємо, полягає в кроках 6 та 9. В ідеалі ми чекаємо завершення всієї конфігурації перед перезавантаженням / вимкненням машини, але, здається, не існує способу виявити, що Windows закінчила етап конфігурації.
Під час проходження користувальницького інтерфейсу зрозуміло, коли виконується будь-який крок, оскільки інтерфейс для входу в систему не відображається, поки процес не буде готовий. Однак при використанні WinRM для віддаленого підключення до машини це менш зрозуміло, оскільки WinRM забезпечує доступ до машини перед тим, як це буде виконано з конфігураційною роботою.
Отже, питання полягає в тому, що є найбільш дурним способом виявити через віддалене з'єднання, що Windows закінчила налаштування оновлень тощо, щоб ми могли перезавантажувати / вимикати машину, не викликаючи проблем пізніше.
------ EDIT -----
Зрештою, ми використовуємо модифіковану версію відповіді Кетрін у тому, що наш сценарій також чекає windeploy
та ngen
завершує. З огляду на те, що ngen
це не завершується до завершення ініціалізації ОС, що працює, і як бонус остаточний VHDX матиме всі рамки .NET ngen-ed, що означає, що нам не доведеться мати справу з цим, коли ми створюємо нові Віртуальних машин шаблонного диска. І сценарій, який ми використовуємо для створення шаблону VHDX, і сценарії для створення локального тестового середовища знаходяться на github у випадку, якщо хтось зацікавлений.