Ändern und Löschen von Azure-VMs mit PowerShell

Mit PowerShell automatisieren Ingenieure und IT-Administratoren erfolgreich verschiedene Aufgaben bei der Arbeit nicht nur mit On-Premises, sondern auch mit Cloud-Infrastrukturen, insbesondere mit Azure. Die Arbeit ĂŒber PowerShell ist in vielen FĂ€llen viel bequemer und schneller als ĂŒber das Azure-Portal. Dank der plattformĂŒbergreifenden Natur von PowerShell kann es fĂŒr jedes Betriebssystem genutzt werden.

Egal, ob Sie mit Ubuntu, Red Hat oder Windows arbeiten - PowerShell hilft Ihnen, Cloud-Ressourcen zu steuern. Mithilfe des Moduls Azure PowerShell, können beispielsweise beliebige Eigenschaften von virtuellen Maschinen festgelegt werden.

In diesem Artikel werden wir untersuchen, wie PowerShell verwendet werden kann, um die GrĂ¶ĂŸe einer VM in der Azure-Cloud zu Ă€ndern und um eine VM sowie die damit verbundenen Objekte zu löschen.

Ändern und Löschen von Azure-VMs mit PowerShell

Wichtig! Vergessen Sie nicht, die HĂ€nde mit Desinfektionsmittel zu reinigen, bevor Sie mit der Arbeit beginnen:

  • Sie benötigen das Modul Azure PowerShell Module — es kann mit dem Befehl aus der PowerShell Gallery heruntergeladen werden: Install-Module Az.
  • Sie mĂŒssen sich in der Azure-Cloud, in der die virtuelle Maschine betrieben wird, authentifizieren, indem Sie den Befehl ausfĂŒhren: Connect-AzAccount.

Lassen Sie uns zunĂ€chst ein Skript erstellen, das die Azure-VM in der GrĂ¶ĂŸe Ă€ndert. Öffnen Sie VS Code und speichern Sie ein neues PowerShell-Skript mit dem Namen Resize-AzVirtualMachine.ps1 — darin werden wir im Laufe des Beispiels Code-Schnipsel hinzufĂŒgen.

Ermitteln der verfĂŒgbaren VM-GrĂ¶ĂŸen

Bevor Sie die VM-GrĂ¶ĂŸe Ă€ndern, mĂŒssen Sie herausfinden, welche zulĂ€ssigen GrĂ¶ĂŸen fĂŒr virtuelle Maschinen in der Azure-Cloud vorhanden sind. FĂŒhren Sie dazu den Befehl aus: Get-AzVMSize.

FĂŒr die virtuelle Maschine devvm01 aus der Ressourcengruppe dev fordern wir alle möglichen zulĂ€ssigen GrĂ¶ĂŸen an:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(In realen Aufgaben wĂŒrden Sie natĂŒrlich Ihre eigenen Werte fĂŒr diese Parameter angeben.) ResourceGroupName=dev und VMName=devvm01 Der Befehl gibt etwa folgendes zurĂŒck:

Dies sind alle möglichen GrĂ¶ĂŸenversionen, die fĂŒr diese virtuelle Maschine angegeben werden können.

Ändern und Löschen von Azure-VMs mit PowerShell

Ändern der GrĂ¶ĂŸe der Maschine

In unserem Beispiel Ă€ndern wir die GrĂ¶ĂŸe auf die neue GrĂ¶ĂŸe

Standard_B1ls — sie steht an erster Stelle in der Liste oben. (In realen Aufgaben wĂ€hlen Sie natĂŒrlich jede gewĂŒnschte GrĂ¶ĂŸe aus.) ZunĂ€chst erhalten wir mit dem Befehl

  1. Get-AzVM Informationen ĂŒber unser Objekt (virtuelle Maschine) und speichern diese in der Variablen $virtualMachine $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01:
    Anschließend nehmen wir dieses Objekt und verwenden die Eigenschaft
  2. .HardwareProfile.VmSize und setzen den gewĂŒnschten neuen Wert: $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Und jetzt fĂŒhren wir einfach den Befehl zum Aktualisieren der VM aus — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Stellen wir sicher, dass alles erfolgreich war — dazu fragen wir erneut Informationen zu unserem Objekt an und schauen uns die Eigenschaft an $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Wenn wir dort sehen — sie steht an erster Stelle in der Liste oben. (In realen Aufgaben wĂ€hlen Sie natĂŒrlich jede gewĂŒnschte GrĂ¶ĂŸe aus.) — dann ist alles in Ordnung, die GrĂ¶ĂŸe der Maschine wurde geĂ€ndert. Man kann weitermachen und den Erfolg ausbauen — gleich mehrere VMs resizing, indem man ein Array verwendet.

Und wie sieht es mit dem Löschen von VMs in Azure aus?

Das Löschen ist nicht so einfach und geradlinig, wie es zunÀchst scheinen mag. Denn man muss eine Reihe von Ressourcen entfernen, die mit dieser Maschine verbunden sind, darunter:

  • Diagnose-Storage-Container fĂŒr Bootdiagnosen
  • Netzwerkschnittstellen
  • Öffentliche IP-Adressen
  • Das Systemlaufwerk und Blob, in dem sein Status gespeichert ist
  • DatentrĂ€ger (data disks)

Daher erstellen wir eine Funktion und nennen sie Remove-AzrVirtualMachine — und sie wird nicht nur die Azure-VM löschen, sondern auch alles oben Genannte.

Wir gehen den Standardweg und erhalten zunÀchst unser Objekt (VM) mit dem Befehl Get-AzVm. Zur Veranschaulichung nehmen wir die Maschine WINSRV19 aus der Ressourcengruppe MyTestVMs.

Wir speichern dieses Objekt zusammen mit all seinen Eigenschaften in einer Variablen $vm:

$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs

Wir löschen den Container mit den Bootdiagnose-Dateien.

Bei der Erstellung einer VM in Azure wird dem Benutzer auch angeboten, einen Container fĂŒr die Speicherung von Bootdiagnosen zu erstellen, um im Falle von Problemen bei der boot diagnose referenzieren zu können. Beim Löschen der VM bleibt dieser Container jedoch weiterhin bestehen und fĂŒhrt seine nun sinnlose Existenz. Lassen Sie uns dieses Problem beheben.

  1. Zuerst finden wir heraus, zu welchem Storage-Konto dieser Container gehört — dazu mĂŒssen wir die Eigenschaft storageUri im Inneren des Objekts DiagnosticsProfile unserer VM ermitteln. DafĂŒr benutze ich folgendes regulĂ€res Ausdruck:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Jetzt mĂŒssen wir den Namen des Containers herausfinden, dafĂŒr benötigen wir die VM-ID mit dem Befehl 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. Dann erhalten wir den Namen der Ressourcengruppe, zu der der Container gehört:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Und jetzt haben wir alles, was wir benötigen, um den Container mit dem Befehl zu löschen Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Löschen der VM

Jetzt löschen wir die virtuelle Maschine, da wir bereits die Variable erstellt haben $vm fĂŒr das entsprechende Objekt. Nun, lassen Sie uns den Befehl ausfĂŒhren Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Löschen des Netzwerkinterfaces und der öffentlichen IP-Adresse

Unsere VM hat ein (oder mehrere) Netzwerkinterfaces (NICs) — um diese aus Unnötigkeit zu löschen, gehen wir das Attribut NetworkInterfaces unseres VM-Objekts durch und löschen das NIC mit dem Befehl Remove-AzNetworkInterface. Falls mehr als ein Netzwerkinterface vorhanden ist, verwenden wir eine Schleife. Außerdem ĂŒberprĂŒfen wir fĂŒr jedes NIC das Attribut IpConfiguration darĂŒber, ob das Interface eine öffentliche IP-Adresse hat. Sollte eine solche vorhanden sein, löschen wir sie mit dem Befehl Remove-AzPublicIpAddress.

Hier ist ein Beispiel eines solchen Codes, bei dem wir in einer Schleife alle NICs durchgehen, sie löschen und ĂŒberprĂŒfen, ob eine öffentliche IP vorhanden ist. Wenn ja, parsen wir das Attribut PublicIpAddress, holen wir den Namen des zugehörigen Ressourcen-IDs und löschen ihn:


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
        }
    }
}

Löschen der Systemfestplatte

Die OS-Festplatte ist ein Blob, fĂŒr dessen Löschung es einen Befehl gibt Remove-AzStorageBlob — aber bevor wir diesen ausfĂŒhren, mĂŒssen wir die erforderlichen Werte fĂŒr seine Parameter festlegen. Dazu ist es erforderlich, den Namen des Speichercontainers zu erhalten, der die Systemfestplatte enthĂ€lt, und diesen dann diesem Befehl zusammen mit dem entsprechenden Storage-Account zu ĂŒbergeben.

$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]

Löschen des Blobs des Status der Systemfestplatte

DafĂŒr nehmen wir, wie Sie sicherlich bereits vermutet haben, den Speichercontainer, in dem sich diese Festplatte befindet, und, vorausgesetzt, dass der Blob am Ende enthĂ€lt status, ĂŒbergeben wir die entsprechenden Parameter dem Löschbefehl Remove-AzStorageBlob:

$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob

Und schließlich löschen wir die DatentrĂ€ger

An unserer VM könnten DatentrĂ€ger angehĂ€ngt geblieben sein. Wenn sie nicht mehr benötigt werden, löschen wir auch diese. Zuerst parsen wir StorageProfile unserer VM und finden die Eigenschaft Uri. Wenn mehrere DatentrĂ€ger vorhanden sind, organisieren wir eine Schleife ĂŒber URI. FĂŒr jede URI finden wir das entsprechende Speicherkonto mithilfe von Get-AzStorageAccount. Dann parsen wir die Speicher-URI, um den benötigten Blob-Namen herauszuziehen und ihn an den Löschbefehl weiterzugeben Remove-AzStorageBlob zusammen mit dem Speicherkonto. So wird das im Code aussehen:

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]
    }
}

Und nun "sind wir am glĂŒcklichen Ende angekommen!" Jetzt mĂŒssen wir all diese Fragmente zu einem Ganzen zusammenfĂŒgen. Der freundliche Autor Adam Bertram hat sich den Nutzern zuliebe die MĂŒhe gemacht und das selbst erledigt. Hier ist der Link zum endgĂŒltigen Skript mit dem Titel Remove-AzrVirtualMachine.ps1:

→ GitHub

Ich hoffe, diese praktischen Tipps helfen Ihnen, Kraft, Zeit und Ressourcen bei der Arbeit mit Azure VMs zu sparen.

Quelle: habr.com

60GB SSD 8Gb DDR4