Planujemy zautomatyzować tworzenie maszyn wirtualnych dla naszej infrastruktury kompilacji, abyśmy mogli:
- Skaluj zasoby kompilacji na podstawie zapotrzebowania, np. Dodając więcej agentów kompilacji, gdy jest to wymagane, i usuwając je, gdy nie są wymagane
- Odtworzyć całość lub część środowiska kompilacji, jeśli / kiedy maszyny umrą
- Zduplikuj środowisko kompilacji, gdy potrzebujemy konfiguracji testowej
Jednym z kroków tego procesu jest automatyzacja tworzenia podstawowych obrazów maszyn wirtualnych (w naszym przypadku przy użyciu funkcji Hyper-V). Do tego mamy skrypt, który:
- Tworzy nowy VHDX z ISO za pomocą skryptu Convert-WindowsImage . Obecnie korzystamy z systemu Windows 2012R2, ale zaczniemy od 2016 roku, gdy tylko będzie dostępny.
- Dodaje skrypt nienadzorowany do nowego VHDX ze wszystkimi potrzebnymi konfiguracjami podstawowymi
- Aktualizuje VHDX o najnowsze łaty systemu Windows za pomocą skryptu Apply-WindowsUpdate
- Tworzy nową maszynę wirtualną Hyper-V na podstawie VHDX i uruchamia ją
- Czeka na uruchomienie maszyny wirtualnej i czeka, aż usługa WinRM będzie gotowa na przyjęcie połączeń zdalnych
- Oczekiwanie na zakończenie przez Windows konfiguracji początkowej i konfiguracji nowych łatek
- Stosuje wszelkie dalsze poprawki
- Uruchomi się ponownie, aby zakończyć konfigurację najnowszych łatek
- Czeka, aż system Windows zakończy konfigurowanie poprawek
- Pcha skrypt sysprep na maszynę i wywołuje ten skrypt. Spowoduje to uruchomienie sysprep, a następnie wyłączenie urządzenia
- Usuwa maszynę wirtualną, ale zachowuje VHDX
- Usuwa pliki sysprep i instalacji nienadzorowanej z VHDX, a następnie kompaktuje VHDX
- Przenosi VHDX do lokalizacji szablonu i oznacza jako tylko do odczytu
Występuje problem w krokach 6 i 9. Idealnie czekamy na zakończenie całej konfiguracji przed ponownym uruchomieniem / zamknięciem komputera, ale wydaje się, że nie ma sposobu na wykrycie, że system Windows zakończył etap konfiguracji.
Podczas przechodzenia przez interfejs użytkownika jest bardzo jasne, kiedy którykolwiek z kroków zostanie wykonany, ponieważ interfejs logowania nie pojawia się, dopóki proces nie jest gotowy. Jednak przy użyciu WinRM do zdalnego połączenia z maszyną jest to mniej jasne, ponieważ WinRM zapewnia dostęp do komputera, zanim zakończy się praca konfiguracyjna.
Pytanie brzmi zatem, jaki jest najgłupszy sposób na wykrycie przez zdalne połączenie, że system Windows zakończył konfigurowanie aktualizacji itp., Abyśmy mogli ponownie uruchomić / zamknąć komputer bez powodowania problemów w późniejszym czasie.
------ EDYTOWAĆ -----
W końcu jesteśmy stosując zmodyfikowaną wersję odpowiedzi Katherine, że nasz skrypt czeka także windeploy
i ngen
do końca. Biorąc pod uwagę, że ngen
nie kończy się to długo po zakończeniu inicjalizacji systemu operacyjnego, co działa, i jako bonus, ostateczny VHDX będzie miał całą strukturę .NET, co oznacza, że nie musimy sobie z tym poradzić, gdy tworzymy nowy Maszyny wirtualne dysku szablonu. Zarówno skrypt, którego używamy do tworzenia szablonu VHDX, jak i skrypty do tworzenia lokalnego środowiska testowego znajdują się na github na wypadek, gdyby ktoś był zainteresowany.