Poszedłem jednak trochę pod prąd, ponieważ wziąłem powyższy kod i wywaliłem to co mi się nie przydaje, dodałem to czego mi brakowało i teraz z powodzeniem stosuję również na produkcji stawiając setki maszyn wirtualnych.
Dlaczego tak? Mam pewność że skrypt się nagle nie zmieni, nie zniknie, mam zachowaną lokalnie taką wersję która dobrze działa w moim środowisku. A Czasami coś się hardokoduje w skrypcie żeby nie mnożyć parametrów które dla każdej maszyny są takie same, a utrudniają czytelność konfiguracji IaaC.
Ale od początku. Co uzyskamy za pomocą MSLab?
- Spreparujemy obraz systemu (VHDX), łącznie z wgraniem poprawek zabezpieczeń.
- Korzystając z powyższego obrazu i konfiguracji IaaC, utworzymy maszyny wirtualne i wstrzykniemy im wszystko co potrzebne do instalacji nienadzorowanej (włącznie z dodaniem do domeny!).
Przygotowanie obrazów systemów
Zaczynamy od pobrania paczki skryptów https://aka.ms/mslab/download i rozpakowujemy je do C:\WSLab.
Pobieramy również https://github.com/microsoft/MSLab/blob/master/Tools/DownloadLatestCUs.ps1 i zapisujemy do C:\WSLab.
Pobranie poprawek z Windows Update
Zaczynamy od skryptu DownloadLatestCUs.ps1, który uruchamiamy i wskazujemy by pobrał poprawki Cumulative Updates do katalogu C:\WSLab\UpdateRollup
Zależnie jakie docelowo systemy operacyjne chcemy stawiać, wskazujemy odpowiednie numery systemów. Dzięki temu spreparujemy obraz który będzie posiadał w sobie główne poprawki zabezpieczeń (odpada ręczne instalowanie i restartowanie systemu post factum – o ile będziemy utrzymywali dosyć świeży obraz startowy).
Windows Server 2016 LTSC to 1607, Windows Server 2019 LTSC to 1809. Szczegóły który numer co oznacza znajdziemy w https://docs.microsoft.com/pl-pl/windows-server/get-started/windows-server-release-info
Przygotowanie obrazów systemów
Pora na przygotowanie obrazu systemu. W swoich środowiskach korzystam z Windows Server 2019 Standard GUI, oraz Windows Server 2019 Datacenter CORE.
Żeby takie obrazy przygotować wpierw uruchamiamy skrypt (będąc w katalogu C:\WSLab) który pobierze wszystkie potrzebne komponenty do utworzenia obrazu systemu:
.\1_Prereq.ps1
Następnie uruchamiamy już ostateczny skrypt przygotowujący obraz systemu:
.\ParentDisks\CreateParentDisk.ps1
W trakcie wykonywania podajemy namiary na obraz ISO systemu operacyjnego, katalog gdzie pobraliśmy najnowsze Cumulative Updates do systemu, oraz wskazujemy wersję systemu który ma zostać przygotowany:
– 2019 GUI Standard (1809)
– 2019 CORE Datacenter (1809)
Dysk C: ustawiamy na rozmiar 64 GB.
Obrazy systemów zapisałem pod nazwami:
– Win2019_GUI_Standard_2021_02.vhdx
– Win2019_CORE_Datacenter_2021_02.vhdx
IaaC – Infrastructure as a Code
Bardzo modne ostatnio hasło. Do tej pory tworzenie maszyn wirtualnych na Hyper-V nie było za dobrze zagospodarowane. Był Virtual Machine Manager, który jednak w moich środowiskach powodował problemy wydajnościowe więc z niego zrezygnowałem, można posiłkować się Vagrantem – ale nie przekonał mnie żeby korzystać z niego na produkcji.
Rozwiązanie w pełni oparte na Powershellu ma dla mnie tę ogromną zaletę, że do wszystkiego co się po drodze dzieje mamy wgląd. Wystarczy dowolny edytor tekstu i możemy po kolei prześledzić jakie komendy są wykonywane, a jak potrzebujemy to wykorzystać je również w innych miejscach.
Przygotowanie sieci wirtualnej
Zanim wystartujemy z tworzeniem maszyn wirtualnych, musimy utworzyć dla nich wirtualną sieć do której będziemy je podpinać. Na potrzeby budowania środowiska PoC tworzę sieć typu internal, dzięki czemu wszystkie maszyny wirtualne są odizolowane od świata zewnętrznego, zachowując jednak dostęp do Internetu. Do maszyn dostęp jest tylko z hosta Hyper-V.
Tworzenie sieci opisałem w https://takietam.eu/konfiguracja-sieci-hyper-v-dla-srodowisk-poc-win10
Tworzymy pierwszą maszynę – kontroler domeny
W każdym środowisku zwykle trzeba wystartować od domeny. MSLab potrafi to zrobić za nas, ale w większości przypadków wolę mieć większą kontrolę nad tym co się dzieje. Dlatego pierwsza maszyna jaką wdrożę, będzie ta przeznaczona na kontroler domeny.
Przygotowujemy plik LabConfig.ps1 o zawartości:
$LabConfig=@{
DomainAdminName='Administrator';
SwitchName = 'PocSwitchTest';
}
$csv = "D:\HyperV"
$netIpAddress = "192.168.123"
$win2019gui = 'Win2019_GUI_Standard_2021_02.vhdx'
$win2019core = 'Win2019_CORE_Datacenter_2021_02.vhdx'
$rdp = "reg add 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server' /v fDenyTSConnections /t REG_DWORD /d 0 /f > Unattend_remoteDesktop.log"
$telnet = "dism /online /Enable-Feature /FeatureName:TelnetClient > Unattend_dismTelnet.log"
$rdpFirewall = "Netsh advfirewall firewall set rule group='remote desktop' new enable=yes > Unattend_RdpFirewall.log"
$LABConfig.VMs += ,@{
VMName = "POC123-DC" ;
ParentVHD = $win2019gui;
HDDNumber = 1; HDDSize= 16GB ;
VMProcessorCount = 2 ;
MemoryStartupBytes= 1024MB ; MaximumBytes= 16384MB ;
CsvPath = $csv ;
Unattend="NoDjoin" ;
IP = "${netIpAddress}.100"; Subnet = $subnet24; DNS = "1.1.1.1"; DefaultGateway = $gw;
CustomPowerShellCommands=`
$rdp, `
$telnet,`
$rdpFirewall
}
We wszystkich przykładach korzystam ze swojej zmodyfikowanej wersji https://github.com/lukaszherman/WsLab/blob/main/POC_local_hyperv.ps1