Hyper-V: Przygotowanie powtarzalnego środowiska testowego w kilka minut [Powtarzalne środowisko #2]

Czas w końcu rozszerzyć temat powtarzalnego środowiska dla Hyper-V w PowerShell’u. Wpis ten jest kontynuacją pierwszej części, gdzie po trudach z sysprep udało nam się wypromować wzorcowy obraz, którego będziemy teraz używać do naszych prywatnych labów lub szybkiego tworzenia maszyn wirtualnych w środowisku produkcyjnym. Podzielę się z Wami własnymi doświadczeniami i wskazówkami, a przede wszystkim jakich błędów warto unikać. Przeprowadzimy kilka scenariuszy jak dobierać się do takiego obrazu. Gotowi na kolejnego PowerShellowego nura?

Mamy do dyspozycji coś na podobieństwo szablonu. Szablon to nasze dopieszczone cudo, które chcemy klonować, by zbawiać świat. A przynajmniej nie klikać kolejne „dalej” podczas instalacji, kopiować plików, znowu instalować i konfigurować i tak bez końca. Dawno się już tak nie robi. W poprzednim odcinku utworzyliśmy swój wymarzony obraz, który mamy zapisany obecnie w pliku o rozszerzeniu vhdx. Jeśli nie wiecie, gdzie ten dysk się znajduje, spieszę z one-linerem pod tytułem „Jak znaleźć ścieżkę do dysku maszyny wirtualnej w Hyper-V?”. A no tak:

(Get-Item (get-vm *NAZWA_VM* | Get-VMHardDiskDrive).Path).DirectoryName

Mamy już więc zlokalizowany dysk z szablonem. Teraz warto by było wiedzieć, jakie środowisko chcemy odwzorować. Na potrzeby artykułu zrobimy dość proste środowisko – 5 serwerów, po 2 w każdej lokalizacji + jeden pełniący rolę routera. Poniżej przedstawiam mocno poglądowy rysunek:

Mamy więc dwie lokalizacje odseparowane od siebie fizycznie, upraszczając sytuację, potrzebujemy minimum 3 urządzenia – po jednym switchu w każdej lokalizacji + router, który będzie potrafił routować ruch pomiędzy sieciami. Skoro dwa switche, powinniśmy utworzyć dwa wirtualne przełączniki w Hyper-V. Można to sobie wyklikać w GUI, ale po co do takich operacji angażować inne narzędzie niż klawiaturę i PowerShella?

$SWITCH1="JEL"
$SWITCH2="GRU"
if (!((Get-VMSwitch | where {$_.name -eq "$SWITCH1" -and $_.SwitchType -eq "Private"}).count -ne 0)) {New-VMSwitch -Name "$SWITCH1" -SwitchType Private}
if (!((Get-VMSwitch | where {$_.name -eq "$SWITCH2" -and $_.SwitchType -eq "Private"}).count -ne 0)) {New-VMSwitch -Name "$SWITCH2" -SwitchType Private}

W ten sposób tworzymy dwa switche, przy okazji sprawdzając, czy switch o danej nazwie nie istnieje już w środowisku – czasem może być to problematyczne, ale Hyper-V zezwala na dowolną liczbę wirtualnych przełączników o tej samej nazwie. Prywatny przełącznik nie zezwala na ruch poza sieć wirtualną (a więc uniemożliwiamy routing do hosta). Routerem może być zwirtualizowane urządzenie, albo kolejny serwer podpięty do obu przełączników i ze zdefiniowanym routingiem – ta kwestia należy do Was i tego co chcecie w labie przećwiczyć.

Jak wydajnie utworzyć maszyny wirtualne, kiedy masz mało miejsca na dysku? Wystarczy, że wszystkie maszyny będą linkowały do wspólnego obrazu bazowego, a wszelkie pozostałe dane będą przechowywać na dyskach różnicowych. Jeśli masz dysk HDD, to raczej zrezygnuj z tego rozwiązania, bo wydajność maszyn wirtualnych w Twoim labie znacząco może się obniżyć. W przypadku dysku SSD spadek ten nie powinien być tak drastyczny (zaznaczam, dla środowiska laboratoryjnego – nie rób tego na produkcji! 🙂 )

Dla każdej maszyny wirtualnej wykonaj poniższy kroki:

new-vhd -path "$PATH\$VMName\OS.vhdx" -ParentPath $OS_TEMPLATE | Out-Null
new-vm -Name $VMname -Generation 2 -BootDevice VHD -VHDPath "$PATH\$VMname\OS.vhdx" -MemoryStartupBytes 2048MB -SwitchName $SWITCH1 -Path "$VMPATH\$VMName" | Out-Null

$OS_TEMPLATE to ścieżka do obrazu, który utworzyliśmy w poprzedniej części – OS z ustawieniami takie, jakie chcesz. Następnie układamy sobie hierarchię – tworzymy nowy dysk vhdx, który linkuje do bazowego obrazu (linia 4 powyżej). Następnie tworzymy nową maszynę wirtualną, której jako urzadzenie bootujące wskazujemy świeżo utworzony dysk (będącym od teraz dyskiem różnicowym), nadajemy jej podstawowe parametry i podłączamy do jednego z przełączników wirtualnych.

I voilla! Dla naszego środowiska zaoszczędzimy około 8(n-1) GB miejsca, co dla 4 serwerów(lub 5 w przypadku routera jako również Windows Server) daje nam nawet 32GB zaoszczędzonej przestrzeni.

Poniżej kod, który utworzy pełne środowisko jak na schemacie na samej górze. W ten sposób w kilka minut utworzycie to samo środowisko.

W zależności od tego, jaką lokalizację wybieramy, dobieramy odpowiedni przełącznik, a jeśli to router – to obie sieci muszą być podłączone, przynajmniej w naszym środowisku.

Powyższe sprawdzi się dobrze w przypadku naprawdę ograniczonego miejsca na dysku Waszej stacji roboczej. Nie polecam nikomu wdrażania tego scenariusza produkcyjnie – zakładając, że utworzymy z naszego obrazu 50 maszyn, może dojść do sytuacji, że każda z 50 maszyn będzie odczytywała ten sam plik bazowy, a co za tym idzie – drastycznie spadnie wydajność Waszych maszyn.

Modyfikacja skryptu jest bardzo prosta – usuńmy linię nr 12. Podając parametr VHDPath wskazujemy który dysk ma być używany jako dysk OS. Cała modyfikacja ma swoją analogię w technologii snapshotów – usunęliśmy dysk różnicowy, więc korzystamy tylko z jednej, „bazowej” migawki (trochę naginam terminologię).

Szablonowanie w Hyper-V nie należy do trudnych, więc warto sobie trochę ułatwić życie. W szczególności, kiedy w Waszym labie już ciężko idzie klikanie w „Dalej”..

Marcin Kuchczyński

Wielki fan automatyzowania wszystkiego, co trzeba wykonać więcej niż 2 razy. Cierpliwie rozwijający się w kierunku rozwiązań chmurowych i raczkujący w sferze sztucznej inteligencji. W IT od 2016 roku.

Leave a Reply