Wir planen, die Erstellung von VMs für unsere Build-Infrastruktur zu automatisieren, damit wir:
- Skalieren Sie die Build-Ressourcen nach Bedarf, indem Sie beispielsweise bei Bedarf weitere Build-Agenten hinzufügen und bei Bedarf entfernen
- Erstellen Sie die gesamte oder einen Teil der Build-Umgebung neu, wenn Maschinen ausfallen
- Duplizieren Sie die Build-Umgebung, wenn ein Test eingerichtet werden muss
Einer der Schritte in diesem Prozess ist die Automatisierung der Erstellung der VM-Basisimages (in unserem Fall mit Hyper-V). Dafür haben wir ein Skript, das:
- Erstellt neues VHDX aus ISO mit dem Skript Convert-WindowsImage . Wir verwenden derzeit Windows 2012R2, werden jedoch versuchen, mit 2016 zu beginnen, sobald es verfügbar ist.
- Fügt dem neuen VHDX ein unbeaufsichtigtes Skript mit der gesamten erforderlichen Basiskonfiguration hinzu
- Aktualisiert die VHDX mit den neuesten Windows-Patches mithilfe des Apply-WindowsUpdate- Skripts
- Erstellt eine neue Hyper-V-VM basierend auf der VHDX und startet sie
- Wartet auf den Start der VM und darauf, dass der WinRM-Dienst bereit ist, Remoteverbindungen zu akzeptieren
- Wartet darauf, dass Windows die Erstkonfiguration und die Konfiguration der neuen Patches abschließt
- Wendet weitere Patches an
- Startet neu, um die Konfiguration der neuesten Patches abzuschließen
- Wartet, bis Windows die Konfiguration der Patches abgeschlossen hat
- Überträgt ein Sysprep-Skript auf den Computer und ruft dieses Skript auf. Dadurch wird sysprep ausgeführt und der Computer dann ausgeschaltet
- Löscht die VM, behält aber die VHDX bei
- Entfernt Sysprep- und unbeaufsichtigte Dateien von der VHDX und komprimiert dann die VHDX
- Verschiebt VHDX an den Speicherort der Vorlage und markiert es als schreibgeschützt
Das Problem tritt in den Schritten 6 und 9 auf. Im Idealfall warten wir, bis die gesamte Konfiguration abgeschlossen ist, bevor wir den Computer neu starten / herunterfahren. Es scheint jedoch keine Möglichkeit zu geben, zu erkennen, dass Windows die Konfigurationsphase abgeschlossen hat.
Wenn Sie die Benutzeroberfläche durchlaufen, ist sehr klar, wann einer der beiden Schritte ausgeführt wird, da die Anmelde-Benutzeroberfläche erst angezeigt wird, wenn der Vorgang abgeschlossen ist. Wenn Sie jedoch WinRM verwenden, um eine Remoteverbindung zum Computer herzustellen, ist dies weniger klar, da WinRM den Zugriff auf den Computer ermöglicht, bevor die Konfigurationsarbeiten abgeschlossen sind.
Die Frage ist also, wie man über eine Remoteverbindung am besten erkennen kann, dass Windows die Konfiguration von Updates usw. abgeschlossen hat, damit wir den Computer neu starten / herunterfahren können, ohne später Probleme zu verursachen.
------ EDIT -----
Am Ende verwenden wir eine modifizierte Version von Katherines Antwort, indem unser Skript auch darauf wartet windeploy
und ngen
abgeschlossen wird. Da ngen
dies erst lange nach Abschluss der Initialisierung des Betriebssystems abgeschlossen ist, wird das endgültige VHDX über das gesamte .NET-Framework verfügen, was bedeutet, dass wir uns beim Erstellen neuer Betriebssysteme nicht darum kümmern müssen VMs der Vorlagenfestplatte. Sowohl das Skript, das wir zum Erstellen der VHDX-Vorlage verwenden, als auch die Skripte zum Erstellen der lokalen Testumgebung befinden sich auf Github, falls jemand interessiert ist.