Modyfikowanie i usuwanie maszyn wirtualnych platformy Azure przy użyciu programu PowerShell

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 Azure PowerShellna przykład możesz ustawić dowolne właściwości maszyn wirtualnych.

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.

Modyfikowanie i usuwanie maszyn wirtualnych platformy Azure przy użyciu programu PowerShell

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:

Modyfikowanie i usuwanie maszyn wirtualnych platformy Azure przy użyciu programu PowerShell

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.)

  1. 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
  2. Następnie pobieramy własność tego obiektu .HardwareProfile.VmSize i ustaw żądaną nową wartość:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. A teraz po prostu wykonujemy polecenie aktualizacji VM - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. 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ę.

  1. 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 obiektu DiagnosticsProfile nasza maszyna wirtualna. W tym celu używam tego wyrażenia regularnego:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. 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)
    
  3. Następnie otrzymujemy nazwę grupy zasobów, do której należy kontener:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. 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:

GitHub

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

Dodaj komentarz