Wijzig en verwijder Azure VM's met PowerShell

Met PowerShell automatiseren engineers en IT-beheerders met succes verschillende taken bij het werken met zowel on-premises als cloudinfrastructuren, met name met Azure. Het werken met PowerShell is in veel gevallen veel handiger en sneller dan via het Azure-portaal. Dankzij de cross-platform mogelijkheid kan PowerShell voor elk besturingssysteem worden gebruikt.

Of u nu met Ubuntu, Red Hat of Windows werkt - PowerShell helpt bij het beheren van cloudresources. Met de module Azure PowerShell, bijvoorbeeld, kunnen alle eigenschappen van virtuele machines worden ingesteld.

In dit artikel bekijken we hoe PowerShell kan worden gebruikt om de grootte van een VM in de Azure-cloud te wijzigen en om een VM en de bijbehorende objecten te verwijderen.

Wijzig en verwijder Azure VM's met PowerShell

Belangrijk! Vergeet niet uw handen met desinfectiemiddel schoon te maken voordat u begint met werken:

  • U heeft de module Azure PowerShell Module nodig - deze kan worden gedownload uit de PowerShell Gallery met het commando Install-Module Az.
  • U moet zich authenticeren in de Azure-cloud waar de virtuele machine draait door het commando uit te voeren Connect-AzAccount.

Laten we beginnen met het maken van een script dat de Azure VM resize. Open VS Code en sla een nieuw PowerShell-script op met de naam Resize-AzVirtualMachine.ps1 – we zullen stukjes code eraan toevoegen als voorbeeld.

Opvragen van beschikbare VM-formaten

Voordat u de grootte van de VM wijzigt, moet u weten welke toegestane formaten er zijn voor virtuele machines in de Azure-cloud. Voer hiervoor het commando uit Get-AzVMSize.

Dus voor de virtuele machine devvm01 uit de resourcegroep , maar volgt geen wijzigingen), gebruikmakend van een andere configuratie. vragen we naar alle mogelijke toegestane formaten:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(In echte taken vervangt u natuurlijk ResourceGroupName=dev en VMName=devvm01 met uw eigen waarden voor deze parameters.)

Het commando geeft ongeveer deze lijst terug:

Wijzig en verwijder Azure VM's met PowerShell

Dit zijn alle mogelijke formaten die voor deze virtuele machine kunnen worden ingesteld.

De machine resizen

Voor het voorbeeld zullen we de resize naar het nieuwe formaat Standard_B1ls doen - dit staat bovenaan de lijst hierboven. (In echte taken kiest u natuurlijk elk gewenst formaat.)

  1. Eerst krijgen we met het commando Get-AzVM informatie over ons object (de virtuele machine) en slaan deze op in een variabele $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Daarna nemen we voor dit object de eigenschap .HardwareProfile.VmSize en stellen we de gewenste nieuwe waarde in:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. En nu voeren we gewoon het commando voor het bijwerken van de VM uit - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. We zorgen ervoor dat alles succesvol is verlopen — hiervoor vragen we opnieuw informatie over ons object en bekijken we de eigenschap $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Als we het daar zien Standard_B1ls — betekent dat alles in orde is, de grootte van de machine is gewijzigd. We kunnen verder gaan en de successen uitbreiden — resize meerdere VM's tegelijk met behulp van een array.

En wat betreft het verwijderen van VM's in Azure?

Het verwijderen is niet zo eenvoudig en rechttoe rechtaan als het lijkt. Want er moeten ook een aantal bronnen worden verwijderd die aan deze machine zijn gekoppeld, waaronder:

  • Opslagcontainers voor opstartdiagnostiek (Boot diagnostics storage containers)
  • Netwerkinterfaces
  • Publieke IP-adressen
  • Het systeemschijf en blob waar de status wordt opgeslagen
  • Gegevensschijven (data disks)

Daarom gaan we een functie maken en deze noemen Remove-AzrVirtualMachine — en deze zal niet alleen de Azure VM verwijderen, maar ook al het bovenstaande.

We volgen de standaard route en krijgen eerst ons object (VM) met behulp van de opdracht Get-AzVm. Voor het voorbeeld laten we dit een machine zijn WINSRV19 uit de resourcegroep MyTestVMs.

We zullen dit object samen met al zijn eigenschappen in een variabele opslaan $vm:

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

We verwijderen de container met de opstartdiagnostiekbestanden

Bij het maken van een VM in Azure wordt de gebruiker ook gevraagd een container voor opstartdiagnostiek (boot diagnostics container) aan te maken, zodat er bij opstartproblemen iets te troubleshoot is. Echter, bij het verwijderen van de VM blijft deze container voortbestaan in zijn nu doelloze bestaan. Laten we deze situatie verhelpen.

  1. Laten we eerst uitzoeken tot welke opslagaccount deze container behoort — daarvoor moeten we de eigenschap vinden storageUri in de diepten van het object DiagnosticsProfile van onze VM. Hiervoor gebruik ik de volgende reguliere expressie:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Nu moeten we de naam van de container weten, en daarvoor moeten we de VM ID verkrijgen met behulp van de opdracht 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. Vervolgens verkrijgen we de naam van de resourcegroep waartoe de container behoort:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. En nu hebben we alles wat we nodig hebben om de container met het commando te verwijderen Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

We verwijderen de VM

Laten we nu de eigenlijke virtuele machine verwijderen, gelukkig hebben we al een variabele gemaakt $vm voor het bijbehorende object. Laten we het commando uitvoeren Remove-AzVm:

$null = $vm | Remove-AzVM -Force

We verwijderen de netwerkinterface en het openbare IP-adres

Onze VM heeft nog een (of zelfs meerdere) netwerkinterfaces (NICs) - om ze te verwijderen, gaan we door de eigenschap NetworkInterfaces van ons VM-object en verwijderen de NIC met het commando Remove-AzNetworkInterface. Voor het geval er meerdere netwerkinterfaces zijn, gebruiken we een lus. Laten we daarnaast voor elke NIC de eigenschap controleren IpConfiguration om te zien of de interface een openbaar IP-adres heeft. Als er een wordt gevonden, verwijderen we deze met het commando Remove-AzPublicIpAddress.

Hier is een voorbeeld van een dergelijke code, waarin we in een lus alle NICs doorlopen, ze verwijderen en controleren of er een openbaar IP is. Als dat zo is, parseren we de eigenschap PublicIpAddress, halen we de naam van de bijbehorende bron op via de ID en verwijderen deze:


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

We verwijderen de systeemschijf

De OS-schijf is een blob, waarvoor een commando bestaat om deze te verwijderen Remove-AzStorageBlob - maar voordat we dit kunnen uitvoeren, moeten we de vereiste waarden voor de parameters opgeven. Daartoe moeten we onder andere de naam van de opslagcontainer verkrijgen die de systeemschijf bevat, en deze vervolgens doorgeven aan dit commando samen met het bijbehorende opslagaccount.

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

We verwijderen de blob van de status van de systeemschijf

Hiervoor, zoals je waarschijnlijk al had verwacht, nemen we de opslagcontainer waarin deze schijf is opgeslagen, en veronderstellende dat de blob aan het einde bevat status, geven we de bijbehorende parameters door aan het verwijdercommando Remove-AzStorageBlob:

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

En tenslotte verwijderen we de gegevensschijven.

Onze VM kon gegevensschijven hebben die eraan waren gekoppeld. Als ze niet nodig zijn, verwijderen we ze ook. Laten we eerst parseren. StorageProfile van onze VM en het eigenschap Uri. Als er meerdere schijven zijn, organiseren we een loop over URI. Voor elke URI vinden we het bijbehorende opslagaccount met behulp van Get-AzStorageAccount. Vervolgens parseren we de opslag-URI om de benodigde blob-naam te extraheren en deze door te geven aan het verwijdercommando Remove-AzStorageBlob samen met het opslagaccount. Zo zou het eruitzien in de code:

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

En hier zijn we “bij het gelukkige einde aangekomen!” Nu moeten we al deze fragmenten samenvoegen tot een geheel. De goedwillende auteur Adam Bertram kwam de gebruikers tegemoet en heeft dit zelf gedaan. Hier is de link naar het uiteindelijke script genaamd Remove-AzrVirtualMachine.ps1:

→ GitHub

Ik hoop dat deze praktische tips nuttig voor je zijn om kracht, tijd en middelen te besparen bij het werken met Azure VMs.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster