Korzystając z PowerShell, inżynierowie i administratorzy IT z powodzeniem automatyzują różne zadania podczas pracy nie tylko z infrastrukturą on-premise, ale także z infrastrukturą chmurową, w szczególności z Azure. W niektórych przypadkach praca za pomocą programu PowerShell jest znacznie wygodniejsza i szybsza niż praca za pośrednictwem Azure Portal. Dzięki wieloplatformowemu charakterowi PowerShell może być używany w dowolnym systemie operacyjnym.
Niezależnie od tego, czy korzystasz z Ubuntu, Red Hat czy Windows, PowerShell może pomóc Ci kontrolować zasoby w chmurze. Korzystanie z modułu
W tym artykule przyjrzymy się, jak za pomocą programu PowerShell zmienić rozmiar maszyny wirtualnej w chmurze Azure, a także usunąć maszynę wirtualną i skojarzone z nią obiekty.
Ważne! Nie zapomnij wytrzeć rąk środkiem dezynfekującym, aby przygotować się do pracy:
- Będziesz potrzebował modułu Moduł Azure PowerShell - można go pobrać z Galerii PowerShell za pomocą polecenia
Install-Module Az
. - Musisz uwierzytelnić się w chmurze Azure, w której działa maszyna wirtualna, uruchamiając polecenie
Connect-AzAccount
.
Najpierw utwórzmy skrypt, który zmieni rozmiar maszyny wirtualnej platformy Azure. Otwórzmy VS Code i zapiszmy nowy skrypt PowerShell o nazwie Zmień rozmiar-AzVirtualMachine.ps1 — będziemy dodawać do niego fragmenty kodu w miarę postępu przykładu.
Prosimy o dostępne rozmiary maszyn wirtualnych
Zanim zmienisz rozmiar maszyny wirtualnej, musisz dowiedzieć się, jakie są dopuszczalne rozmiary maszyn wirtualnych w chmurze Azure. Aby to zrobić, musisz uruchomić polecenie Get-AzVMSize
.
Tak dla maszyny wirtualnej devvm01 z grupy zasobów dev Prosimy o wszystkie możliwe dopuszczalne rozmiary:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(W prawdziwych problemach oczywiście zamiast NazwaGrupy Zasobów=dev и Nazwa maszyny wirtualnej=devvm01 określisz własne wartości dla tych parametrów.)
Polecenie zwróci coś takiego:
Są to wszystkie możliwe opcje rozmiaru, które można ustawić dla danej maszyny wirtualnej.
Zmieńmy rozmiar samochodu
Na przykład zmienimy rozmiar na nowy Standard_B1ls - jest na pierwszym miejscu na powyższej liście. (Oczywiście w rzeczywistych zastosowaniach wybierasz dowolny rozmiar, jakiego potrzebujesz.)
- Najpierw użyj polecenia
Get-AzVM
Informacje o naszym obiekcie (maszynie wirtualnej) uzyskujemy przechowując je w zmiennej$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- Następnie pobieramy własność tego obiektu
.HardwareProfile.VmSize
i ustaw żądaną 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 dobrze - w tym celu ponownie prosimy o informacje o naszym obiekcie i oglądamy nieruchomość
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Jeśli tam zobaczymy Standard_B1ls - czyli wszystko jest w porządku, zmieniono gabaryty auta. Możesz pójść dalej i wykorzystać swój sukces, zmieniając rozmiar kilku maszyn wirtualnych jednocześnie za pomocą tablicy.
A co z usuwaniem maszyny wirtualnej na platformie Azure?
Po usunięciu nie wszystko jest tak proste i oczywiste, jak mogłoby się wydawać. W końcu konieczne jest usunięcie szeregu zasobów powiązanych z tą maszyną, w tym:
- Kontenery do przechowywania diagnostyki rozruchu
- Interfejsy sieciowe
- Publiczne adresy IP
- Dysk systemowy i obiekt blob, w którym przechowywany jest jego stan
- Dyski z danymi
Dlatego utworzymy funkcję i wywołamy ją Remove-AzrVirtualMachine
— i usunie nie tylko maszynę wirtualną Azure, ale także wszystkie powyższe.
Idziemy standardową drogą i najpierw pobieramy nasz obiekt (VM) za pomocą polecenia Get-AzVm
. Niech to będzie na przykład samochód WINSRV19 z grupy zasobów Moje maszyny testowe.
Zapiszmy ten obiekt wraz ze wszystkimi jego właściwościami w zmiennej $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
Usuwanie kontenera z plikami diagnostycznymi rozruchu
Podczas tworzenia maszyny wirtualnej na platformie Azure użytkownik jest również proszony o utworzenie kontenera do przechowywania diagnostyki rozruchu (kontenera diagnostyki rozruchu), aby w przypadku problemów z uruchomieniem było się do czego zwrócić w celu rozwiązania problemu. Jednak po usunięciu maszyny wirtualnej kontener ten może kontynuować swoje obecnie bezcelowe istnienie. Naprawmy tę sytuację.
- Najpierw dowiedzmy się, do którego konta magazynu należy ten kontener – w tym celu musimy znaleźć właściwość
storageUri
w wnętrznościach obiektuDiagnosticsProfile
nasza maszyna wirtualna. W tym celu używam tego wyrażenia regularnego:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- Teraz musisz znaleźć nazwę kontenera i w tym celu musisz uzyskać identyfikator maszyny wirtualnej 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 otrzymujemy nazwę grupy zasobów, do której należy kontener:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- I teraz mamy wszystko, czego potrzebujemy, aby usunąć kontener za pomocą polecenia
Remove-AzStorageContainer
:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Usuwanie maszyny wirtualnej
Teraz usuńmy samą maszynę wirtualną, ponieważ stworzyliśmy już zmienną $vm
dla odpowiedniego obiektu. Cóż, uruchommy polecenie Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
Usuwanie interfejsu sieciowego i publicznego adresu IP
Nasza maszyna wirtualna nadal posiada jeden (lub nawet kilka) interfejsów sieciowych (NIC) - aby usunąć je jako niepotrzebne, przejdźmy do właściwości NetworkInterfaces
nasz obiekt VM i usuń kartę sieciową za pomocą polecenia Remove-AzNetworkInterface
. W przypadku, gdy istnieje więcej niż jeden interfejs sieciowy, stosujemy pętlę. Jednocześnie dla każdej karty sieciowej sprawdzimy właściwość IpConfiguration
w celu ustalenia, czy interfejs ma publiczny adres IP. Jeśli taki zostanie znaleziony, usuniemy go za pomocą polecenia Remove-AzPublicIpAddress
.
Oto przykład takiego kodu, w którym przeglądamy w pętli wszystkie karty sieciowe, usuwamy je i sprawdzamy, czy istnieje publiczny adres IP. Jeśli tak, przeanalizuj właściwość PublicIpAddress
, znajdź nazwę odpowiedniego zasobu według identyfikatora i usuń 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
}
}
}
Usuwanie dysku systemowego
Dysk systemu operacyjnego to obiekt typu blob, dla którego istnieje polecenie jego usunięcia Remove-AzStorageBlob
- ale przed jego wykonaniem konieczne będzie ustawienie wymaganych wartości jego parametrów. W tym celu należy w szczególności uzyskać nazwę kontenera magazynu zawierającego dysk systemowy, a następnie przekazać ją do tego polecenia wraz z odpowiednim kontem magazynu.
$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]
Usuwanie obiektu Blob stanu dysku systemowego
Aby to zrobić, jak już zapewne się domyślasz, bierzemy kontener pamięci, w którym przechowywany jest ten dysk, i sugerując, że blob na końcu zawiera status
, przekaż odpowiednie parametry do polecenia usuwania Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
Na koniec usuwamy dyski z danymi
Nasza maszyna wirtualna mogła nadal posiadać dyski z dołączonymi do niej danymi. Jeśli nie będą potrzebne, również je usuniemy. Przeanalizujmy to najpierw StorageProfile
naszą maszynę wirtualną i znajdź właściwość Uri
. Jeśli dysków jest kilka, cykl organizujemy wg URI
. Dla każdego identyfikatora URI znajdziemy odpowiednie konto magazynu Get-AzStorageAccount
. Następnie przeanalizuj identyfikator URI magazynu, aby wyodrębnić żądaną nazwę obiektu BLOB i przekaż go do polecenia usuwania Remove-AzStorageBlob
wraz z kontem magazynu. Tak by to wyglądało 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]
}
}
A teraz „dotarliśmy do szczęśliwego zakończenia!” Teraz ze wszystkich tych fragmentów musimy złożyć jedną całość. Uprzejmy autor Adam Bertram spotkał się z użytkownikami w połowie drogi i zrobił to sam. Oto link do ostatecznego skryptu o nazwie Usuń-AzrVirtualMachine.ps1:
→
Mam nadzieję, że te praktyczne wskazówki pomogą Ci zaoszczędzić wysiłek, czas i pieniądze podczas pracy z maszynami wirtualnymi platformy Azure.
Źródło: www.habr.com