Inżynierowie i administratorzy IT skutecznie automatyzują różne zadania, korzystając z PowerShell do pracy nie tylko z infrastrukturami lokalnymi, ale także z chmurą, w szczególności z Azure. W wielu przypadkach pracować z PowerShell jest znacznie wygodniej i szybciej niż przez portal Azure. Dzięki wieloplatformowości PowerShell można go używać w różnych systemach operacyjnych.
Nieważne, czy pracujesz z Ubuntu, Red Hat czy Windows — PowerShell pomoże w zarządzaniu zasobami chmurowymi. Używając modułu , na przykład, możesz ustawiać dowolne właściwości maszyn wirtualnych.
W tym artykule omówimy, jak użyć PowerShell do zmiany rozmiaru VM w chmurze Azure, a także do usunięcia VM i powiązanych z nią obiektów.

WAŻNE! Nie zapomnij zdezynfekować ręce środkiem do dezynfekcji, zanim przystąpisz do pracy:
- Będziesz potrzebować modułu Azure PowerShell Module — można go załadować z PowerShell Gallery poleceniem
Install-Module Az. - Musisz się uwierzytelnić w chmurze Azure, gdzie działa maszyna wirtualna, wykonując polecenie
Connect-AzAccount.
Na początek stwórzmy skrypt, który zmienia rozmiar maszyny wirtualnej Azure. Otwórzmy VS Code i zapiszmy nowy skrypt PowerShell pod nazwą Resize-AzVirtualMachine.ps1 — do niego będziemy stopniowo dodawać kawałki kodu.
Uzyskujemy dostępne rozmiary VM
Zanim zmienisz rozmiar VM, musisz się dowiedzieć, jakie rozmiary są dostępne dla maszyn wirtualnych w chmurze Azure. W tym celu należy wykonać polecenie Get-AzVMSize.
Zatem dla maszyny wirtualnej devvm01 z grupy zasobów dev zapytujemy o wszystkie możliwe dostępne rozmiary:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(W rzeczywistych zadaniach oczywiście zamiast ResourceGroupName=dev i VMName=devvm01 będziesz podawać własne wartości tych parametrów.)
Polecenie zwróci mniej więcej taki wykaz:

To są wszystkie możliwe rozmiary, które można ustawić dla tej maszyny wirtualnej.
Zmiana rozmiaru maszyny
Dla przykładu zmienimy rozmiar na nowy rozmiar Standard_B1ls — znajduje się on na pierwszym miejscu w powyższej liście. (W rzeczywistych zastosowaniach oczywiście wybierasz dowolny potrzebny rozmiar.)
- Najpierw za pomocą polecenia
Get-AzVMuzyskujemy informacje o naszym obiekcie (maszynie wirtualnej), przechowując je w zmiennej$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - Następnie z tego obiektu bierzemy właściwość
.HardwareProfile.VmSizei ustawiamy potrzebną nową wartość:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - A teraz po prostu wykonujemy polecenie aktualizacji VM —
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Upewniamy się, że wszystko poszło pomyślnie — w tym celu ponownie pobieramy informacje o naszym obiekcie i sprawdzamy właściwość
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Jeśli widzimy tam Standard_B1ls — wszystko w porządku, rozmiar maszyny został zmieniony. Możemy pójść dalej i rozwijać sukces — zmienić rozmiar kilku maszyn wirtualnych jednocześnie, używając tablicy.
A co z usuwaniem maszyn wirtualnych w Azure?
Usunięcie nie jest tak proste i oczywiste, jak może się wydawać. Musimy usunąć również szereg zasobów powiązanych z tą maszyną, w tym:
- Pojemniki do diagnostyki uruchamiania (Boot diagnostics storage containers)
- Interfejsy sieciowe
- Publiczne adresy IP
- Dysk systemowy i blob, gdzie przechowywany jest jego status
- Dyski danych (data disks)
Dlatego stworzymy funkcję i nazwiemy ją Remove-AzrVirtualMachine — która usunie nie tylko maszynę wirtualną Azure, ale także wszystko wymienione powyżej.
Idziemy standardową drogą i najpierw uzyskujemy nasz obiekt (VM) za pomocą polecenia Get-AzVm. Na przykład, niech to będzie maszyna WINSRV19 z grupy zasobów MyTestVMs.
Zapiszemy ten obiekt wraz ze wszystkimi jego właściwościami w zmiennej $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsUsuwamy pojemnik z plikami diagnostyki uruchamiania
Podczas tworzenia maszyny wirtualnej w Azure użytkownik jest również proszony o utworzenie pojemnika do przechowywania diagnostyki uruchamiania (boot diagnostics container), aby w przypadku problemów z uruchamianiem mieć możliwość nawiązania do czegoś w celu rozwiązywania problemów. Jednak podczas usuwania VM ten pojemnik pozostaje, aby kontynuować swoje teraz bezcelowe istnienie. Naprawmy to.
- Najpierw ustalimy, do którego konta magazynowego należy ten pojemnik — w tym celu musimy znaleźć właściwość
storageUriw głębinach obiektuDiagnosticsProfilenaszej maszyny wirtualnej. W tym celu używam takie regularne wyrażenie:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/([^\/]+)\.').groups[1].value - Teraz musimy dowiedzieć się, jaka jest nazwa kontenera, a w tym celu musimy uzyskać identyfikator VM za pomocą polecenia
Get-AzResource:if ($vm.Name.Length -gt 9) { $i = 9 } else { $i = $vm.Name.Length - 1 } $azResourceParams = @{ 'ResourceName' = WINSRV 'ResourceType' = 'Microsoft.Compute\/virtualMachines' 'ResourceGroupName' = MyTestVMs } $vmResource = Get-AzResource @azResourceParams $vmId = $vmResource.Properties.VmId $diagContainerName = ('bootdiagnostics-{0}-{1}' -f $vm.Name.ToLower().Substring(0, $i), $vmId) - Następnie uzyskujemy nazwę grupy zasobów, do której należy kontener:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - I teraz mamy wszystko, co potrzebne, aby usunąć kontener poleceniem
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Usuwamy VM
Teraz usuniemy samą maszynę wirtualną, na szczęście już stworzyliśmy zmienną $vm dla odpowiedniego obiektu. Cóż, uruchomimy polecenie Remove-AzVm:
$null = $vm | Remove-AzVM -ForceUsuwamy interfejs sieciowy i publiczny adres IP
Nasza VM ma jeden (lub nawet kilka) interfejsów sieciowych (NICs) — aby je usunąć jako zbędne, przejdźmy do właściwości NetworkInterfaces naszego obiektu VM i usuniemy NIC poleceniem Remove-AzNetworkInterface. Na wypadek, gdyby interfejsów sieciowych było więcej niż jeden, użyjemy pętli. Przy okazji dla każdego NIC sprawdzimy właściwość IpConfiguration pod kątem tego, czy interfejs ma publiczny adres IP. Jeśli zostanie znaleziony, usuniemy go poleceniem Remove-AzPublicIpAddress.
Oto przykład takiego kodu, w którym w pętli przeglądamy wszystkie NICs, usuwamy je, sprawdzamy, czy jest publiczny IP. Jeśli jest, to przetwarzamy właściwość PublicIpAddress, wyciągamy z ID nazwę odpowiedniego zasobu i usuwamy go:
foreach($nicUri in $vm.NetworkProfile.NetworkInterfaces.Id) {
$nic = Get-AzNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicUri.Split('\/')[-1]
Remove-AzNetworkInterface -Name $nic.Name -ResourceGroupName $vm.ResourceGroupName -Force
foreach($ipConfig in $nic.IpConfigurations) {
if($ipConfig.PublicIpAddress -ne $null) {
Remove-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $ipConfig.PublicIpAddress.Id.Split('\/')[-1] -Force
}
}
}
Usuwamy dysk systemowy
Dysk OS jest blobem, do którego usunięcia istnieje polecenie Remove-AzStorageBlob — ale przed jego wykonaniem trzeba będzie ustawić wymagane wartości dla jego parametrów. W tym celu, w szczególności, trzeba uzyskać nazwę kontenera storage, zawierającego dysk systemowy, a dopiero potem przekazać ją do tego polecenia razem z odpowiednim kontem storage.
$osDiskUri = $vm.StorageProfile.OSDisk.Vhd.Uri
$osDiskContainerName = $osDiskUri.Split('\/')[-2]
$osDiskStorageAcct = Get-AzStorageAccount | where { $_.StorageAccountName -eq $osDiskUri.Split('\/')[2].Split('.')[0] }
$osDiskStorageAcct | Remove-AzStorageBlob -Container $osDiskContainerName -Blob $osDiskUri.Split('\/')[-1]
Usuwamy blob statusu dysku systemowego
W tym celu, jak zapewne się domyślasz, bierzemy kontener storage, w którym znajduje się ten dysk, i, zakładając, że blob na końcu zawiera status, przekazujemy odpowiednie parametry do polecenia usunięcia Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobI na koniec usuwamy dyski z danymi
Nasza VM mogła mieć pozostałe dyski z danymi, które były do niej dołączone. Jeśli nie są potrzebne, usuńmy je również. Najpierw przeanalizujemy StorageProfile naszej VM i znajdziemy właściwość Uri. Jeśli jest kilka dysków, zorganizujemy pętlę po URI. Dla każdego URI znajdziemy odpowiadające konto magazynu za pomocą Get-AzStorageAccount. Następnie przeanalizujemy URI magazynu, aby wydobyć potrzebną nazwę bloba i przekazać ją do polecenia usuwania Remove-AzStorageBlob wraz z kontem magazynu. Oto jak to będzie wyglądać w kodzie:
if ($vm.DataDiskNames.Count -gt 0) {
foreach ($uri in $vm.StorageProfile.DataDisks.Vhd.Uri) {
$dataDiskStorageAcct = Get-AzStorageAccount -Name $uri.Split('\/')[2].Split('.')[0]
$dataDiskStorageAcct | Remove-AzStorageBlob -Container $uri.Split('\/')[-2] -Blob $uri.Split('\/')[-1]
}
}
I oto "dobraliśmy się do szczęśliwego końca!" Teraz z wszystkich tych fragmentów musimy stworzyć całość. Dobry autor Adam Bertram wyszedł naprzeciw użytkownikom i zrobił to sam. Oto link do końcowego skryptu o nazwie Remove-AzrVirtualMachine.ps1:
→
Mam nadzieję, że te praktyczne porady będą przydatne, aby zaoszczędzić siły, czas i środki w pracy z VM-ami Azure.
Źródło: habr.com
