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

Mithilfe von PowerShell automatisieren Ingenieure und IT-Administratoren erfolgreich verschiedene Aufgaben, wenn sie nicht nur mit lokalen, sondern auch mit Cloud-Infrastrukturen, insbesondere mit Azure, arbeiten. In manchen Fällen ist die Arbeit über PowerShell deutlich komfortabler und schneller als die Arbeit über das Azure-Portal. Dank seiner plattformübergreifenden Natur kann PowerShell auf jedem Betriebssystem verwendet werden.

Unabhängig davon, ob Sie Ubuntu, Red Hat oder Windows ausführen, kann PowerShell Ihnen bei der Kontrolle Ihrer Cloud-Ressourcen helfen. Verwendung des Moduls Azure-PowerShellBeispielsweise können Sie beliebige Eigenschaften virtueller Maschinen festlegen.

In diesem Artikel sehen wir uns an, wie Sie mit PowerShell die Größe einer VM in der Azure-Cloud ändern und eine VM und die zugehörigen Objekte löschen können.

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

Wichtig! Vergessen Sie nicht, Ihre Hände mit Desinfektionsmittel abzuwischen, um sich auf die Arbeit vorzubereiten:

  • Sie benötigen ein Modul Azure PowerShell-Modul - Es kann mit dem Befehl aus der PowerShell-Galerie heruntergeladen werden Install-Module Az.
  • Sie müssen sich in der Azure-Cloud authentifizieren, in der die virtuelle Maschine ausgeführt wird, indem Sie den Befehl ausführen Connect-AzAccount.

Erstellen wir zunächst ein Skript, das die Größe einer Azure-VM ändert. Öffnen wir VS Code und speichern ein neues PowerShell-Skript mit dem Namen Resize-AzVirtualMachine.ps1 – Wir werden im Verlauf des Beispiels Codeteile hinzufügen.

Wir fragen nach den verfügbaren VM-Größen

Bevor Sie die VM-Größe ändern, müssen Sie herausfinden, welche akzeptablen Größen für virtuelle Maschinen in der Azure-Cloud gelten. Dazu müssen Sie den Befehl ausführen Get-AzVMSize.

Also für die virtuelle Maschine devvm01 aus der Ressourcengruppe dev Wir erfragen alle möglichen akzeptablen Größen:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Bei echten Problemen natürlich statt ResourceGroupName=dev и VMName=devvm01 Sie werden Ihre eigenen Werte für diese Parameter angeben.)

Der Befehl gibt etwa Folgendes zurück:

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

Dies sind alles mögliche Größenoptionen, die für eine bestimmte virtuelle Maschine festgelegt werden können.

Lassen Sie uns die Größe des Autos ändern

Beispielsweise werden wir die Größe auf eine neue Größe ändern Standard_B1ls - er steht auf der Liste oben an erster Stelle. (Bei realen Anwendungen wählen Sie natürlich die Größe, die Sie benötigen.)

  1. Zuerst den Befehl verwenden Get-AzVM Wir erhalten Informationen über unser Objekt (virtuelle Maschine), indem wir sie in einer Variablen speichern $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Dann übernehmen wir die Eigenschaft von diesem Objekt .HardwareProfile.VmSize und stellen Sie den gewünschten neuen Wert ein:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Und jetzt führen wir einfach den VM-Update-Befehl aus – Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Wir stellen sicher, dass alles gut gelaufen ist – dazu holen wir noch einmal Informationen zu unserem Objekt ein und schauen uns die Immobilie an $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Wenn wir dort sehen Standard_B1ls - Das heißt, alles ist in Ordnung, die Größe des Autos wurde geändert. Sie können noch weiter gehen und auf Ihrem Erfolg aufbauen, indem Sie die Größe mehrerer VMs gleichzeitig mithilfe eines Arrays ändern.

Wie wäre es mit dem Löschen einer VM in Azure?

Beim Löschen ist nicht alles so einfach und unkompliziert, wie es scheint. Schließlich ist es notwendig, eine Reihe von mit dieser Maschine verbundenen Ressourcen zu entfernen, darunter:

  • Speichercontainer für die Startdiagnose
  • Netzwerkschnittstellen
  • Öffentliche IP-Adressen
  • Systemfestplatte und Blob, auf dem der Status gespeichert ist
  • Datenträger

Deshalb erstellen wir eine Funktion und rufen sie auf Remove-AzrVirtualMachine – und es wird nicht nur die Azure-VM gelöscht, sondern auch alle oben genannten.

Wir gehen den Standardweg und rufen zunächst unser Objekt (VM) mit dem Befehl ab Get-AzVm. Lass es zum Beispiel ein Auto sein WINSRV19 aus der Ressourcengruppe MeineTestVMs.

Speichern wir dieses Objekt zusammen mit allen seinen Eigenschaften in einer Variablen $vm:

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

Entfernen des Containers mit Boot-Diagnosedateien

Beim Erstellen einer VM in Azure wird der Benutzer außerdem aufgefordert, einen Container zum Speichern von Boot-Diagnosen (Boot-Diagnose-Container) zu erstellen, damit bei Problemen beim Booten eine Anlaufstelle zur Fehlerbehebung zur Verfügung steht. Wenn die VM jedoch gelöscht wird, verbleibt dieser Container weiterhin in seiner nun zwecklosen Existenz. Lassen Sie uns diese Situation beheben.

  1. Lassen Sie uns zunächst herausfinden, zu welchem ​​Speicherkonto dieser Container gehört – dazu müssen wir die Eigenschaft finden storageUri im Inneren des Objekts DiagnosticsProfile unsere VM. Dazu verwende ich diesen regulären Ausdruck:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Jetzt müssen Sie den Namen des Containers herausfinden und dazu mit dem Befehl die VM-ID abrufen 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. Als nächstes 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 brauchen, 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

Entfernen der VM

Löschen wir nun die virtuelle Maschine selbst, da wir bereits eine Variable erstellt haben $vm für das entsprechende Objekt. Nun, lassen Sie uns den Befehl ausführen Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Entfernen der Netzwerkschnittstelle und der öffentlichen IP-Adresse

Unsere VM verfügt noch über eine (oder sogar mehrere) Netzwerkschnittstellen (NICs) – um diese als unnötig zu entfernen, gehen wir die Eigenschaft durch NetworkInterfaces unser VM-Objekt und löschen Sie die Netzwerkkarte mit dem Befehl Remove-AzNetworkInterface. Falls es mehr als eine Netzwerkschnittstelle gibt, verwenden wir eine Schleife. Gleichzeitig prüfen wir für jede NIC die Eigenschaft IpConfiguration um festzustellen, ob die Schnittstelle eine öffentliche IP-Adresse hat. Wenn einer gefunden wird, entfernen wir ihn mit dem Befehl Remove-AzPublicIpAddress.

Hier ist ein Beispiel für einen solchen Code, bei dem wir alle NICs in einer Schleife durchsuchen, sie löschen und prüfen, ob es eine öffentliche IP gibt. Wenn ja, analysieren Sie die Eigenschaft PublicIpAddress, suchen Sie den Namen der entsprechenden Ressource anhand der ID und löschen Sie sie:


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

Entfernen der Systemfestplatte

Der Betriebssystemdatenträger ist ein Blob, für den es einen Befehl zum Löschen gibt Remove-AzStorageBlob - aber bevor Sie es ausführen, müssen Sie die erforderlichen Werte für seine Parameter festlegen. Dazu müssen Sie insbesondere den Namen des Speichercontainers ermitteln, der die Systemfestplatte enthält, und ihn dann zusammen mit dem entsprechenden Speicherkonto an diesen Befehl ü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]

Entfernen des Systemfestplattenstatus-Blobs

Dazu nehmen wir, wie Sie wahrscheinlich schon vermutet haben, den Speichercontainer, in dem diese Festplatte gespeichert ist, und implizieren, dass sich am Ende ein Blob befindet statusÜbergeben Sie die entsprechenden Parameter an den Löschbefehl Remove-AzStorageBlob:

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

Und schließlich entfernen wir die Datenträger

An unsere VM könnten noch Festplatten mit angehängten Daten angeschlossen sein. Sofern diese nicht mehr benötigt werden, werden wir diese ebenfalls löschen. Lassen Sie es uns zuerst analysieren StorageProfile unsere VM und finden Sie die Eigenschaft Uri. Bei mehreren Datenträgern organisieren wir einen Zyklus entsprechend URI. Für jeden URI finden wir das entsprechende Speicherkonto Get-AzStorageAccount. Analysieren Sie dann den Speicher-URI, um den gewünschten Blobnamen zu extrahieren, und übergeben Sie ihn an den Löschbefehl Remove-AzStorageBlob zusammen mit einem Speicherkonto. So würde es 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 jetzt „haben wir das Happy End erreicht!“ Jetzt müssen wir aus all diesen Fragmenten ein einziges Ganzes zusammensetzen. Der freundliche Autor Adam Bertram kam den Nutzern auf halbem Weg entgegen und machte es selbst. Hier ist ein Link zum endgültigen Skript namens Remove-AzrVirtualMachine.ps1:

GitHub

Ich hoffe, dass Sie diese praktischen Tipps hilfreich finden, um bei der Arbeit mit Azure-VMs Aufwand, Zeit und Geld zu sparen.

Source: habr.com

Kommentar hinzufügen