Ændrer og sletter Azure VMs med PowerShell

Med PowerShell kan ingeniører og IT-administratorer effektivt automatisere forskellige opgaver ikke kun med on-premises, men også med cloud-infrastrukturer, især med Azure. At arbejde via PowerShell er i mange tilfælde meget mere bekvemt og hurtigere end gennem Azure-portalen. Takket være PowerShell's cross-platform funktionalitet kan det bruges til enhver OS.

Uanset om du arbejder med Ubuntu, Red Hat eller Windows, vil PowerShell hjælpe med at kontrollere cloud-ressourcer. Ved at bruge modulet Azure PowerShell, kan du for eksempel angive enhver egenskab for virtuelle maskiner.

I denne artikel vil vi se på, hvordan man kan bruge PowerShell til at ændre størrelsen på en VM i Azure-cloud og til at slette VMs samt tilknyttede objekter.

Ændrer og sletter Azure VMs med PowerShell

Vigtigt! Husk at desinficere dine hænder før du går i gang:

  • Du får brug for modulet Azure PowerShell Module — det kan downloades fra PowerShell Gallery med kommandoen Install-Module Az.
  • Du skal autentificere dig i Azure-cloud, hvor den virtuelle maskine kører, ved at udføre kommandoen Connect-AzAccount.

Lad os først oprette et script, der ændrer størrelsen på en Azure VM. Åbn VS Code, og gem det nye PowerShell-script med navnet Resize-AzVirtualMachine.ps1 — vi vil gradvist tilføje kodesnit til det.

Anmodning om eksisterende VM-størrelser

Inden vi ændrer størrelsen på VM'en, skal vi finde ud af, hvilke gyldige størrelser der overhovedet er tilgængelige for virtuelle maskiner i Azure-cloud. For at gøre dette skal vi udføre kommandoen Get-AzVMSize.

Så, for den virtuelle maskine devvm01 fra ressourcegruppen dev anmoder vi om alle mulige tilladte størrelser:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(I virkelige opgaver vil du selvfølgelig angive dine egne værdier for disse parametre i stedet for ResourceGroupName=dev og VMName=devvm01 ).

Kommandoen vil returnere omtrent en liste som denne:

Ændrer og sletter Azure VMs med PowerShell

Dette er alle mulige størrelser, der kan angives for denne virtuelle maskine.

Ændrer størrelsen på maskinen

I dette eksempel ændrer vi størrelsen til den nye størrelse Standard_B1ls — den står først på listen ovenfor. (I virkelige opgaver vælger du selvfølgelig enhver størrelse, du har brug for.)

  1. Først ved hjælp af kommandoen Get-AzVM henter vi oplysninger om vores objekt (den virtuelle maskine) og gemmer dem i variablen $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Derefter tager vi denne objekts egenskab .HardwareProfile.VmSize og indstiller den ønskede nye værdi:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Og nu udfører vi blot VM-opdateringskommandoen — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Vi sikrer os, at alt er forløbet som planlagt — for at bekræfte dette, anmoder vi igen om information om vores objekt og kigger på egenskaben $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Hvis vi kan se det Standard_B1ls — så er alt i orden, maskinens størrelse er ændret. Vi kan gå videre og udnytte denne succes — ved at ændre størrelsen på flere VMer samtidig ved hjælp af et array.

Hvad med at slette VM i Azure?

Det er ikke så enkelt og ligetil at slette, som man måske kunne tro. Man skal også slette en række ressourcer, der er knyttet til denne maskine, herunder:

  • Lagringscontainnere til bootdiagnoser
  • Netværksinterfacer
  • Offentlige IP-adresser
  • Systemdisk og blob, der gemmer dens status
  • Datadiskene

Så vi opretter en funktion og kalder den Remove-AzrVirtualMachine — og den vil slette ikke kun Azure VM, men også alt det ovenstående.

Vi følger den normale procedure og får først vores objekt (VM) ved hjælp af kommandoen Get-AzVm. Som eksempel lad os sige, det er maskinen WINSRV19 fra ressourcegruppen MyTestVMs.

Vi gemmer dette objekt sammen med alle dets egenskaber i en variabel $vm:

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

Sletter containeren med bootdiagnosedata

Når man opretter en VM i Azure, bliver brugeren bedt om også at oprette en container til opbevaring af bootdiagnoser, så der er noget at henvise til ved opstartsproblemer. Men når VM'en slettes, forbliver denne container og fortsætter sin nu meningsløse eksistens. Lad os rette op på dette.

  1. Først finder vi ud af, hvilken lagerkonto denne container tilhører — til dette skal vi finde egenskaben storageUri i dybet af objektet DiagnosticsProfile af vores VM. Til dette bruger jeg et regulært udtryk:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/([^\.]+)\.').groups[1].value
  2. Nu skal vi finde ud af containerens navn, og til dette skal vi få VM ID ved hjælp af kommandoen 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. Dernæst får vi navnet på ressourcgruppen, som containeren tilhører:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Og nu har vi alt, hvad vi behøver for at fjerne containeren med kommandoen Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Fjerner VM

Lad os nu fjerne den virtuelle maskine, heldigvis har vi allerede oprettet en variabel $vm for den tilsvarende objekt. Lad os køre kommandoen Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Fjerner netværksgrænsefladen og den offentlige IP-adresse

Vores VM har en (eller endda flere) netværksgrænseflader (NICs) — for at fjerne dem, hvis de ikke er nødvendige, skal vi gennemgå egenskaben NetworkInterfaces af vores VM-objekt og fjerne NIC med kommandoen Remove-AzNetworkInterface. Hvis der er flere netværksgrænseflader, bruger vi en løkke. For hver NIC tjekker vi endda egenskaben IpConfiguration for at se, om grænsefladen har en offentlig IP-adresse. Hvis en sådan findes, fjerner vi den med kommandoen Remove-AzPublicIpAddress.

Her er et eksempel på sådan kode, hvor vi i en løkke gennemgår alle NICs, fjerner dem, og tjekker, om der er en offentlig IP. Hvis der er, parser vi egenskaben PublicIpAddress, henter navnet på den tilsvarende ressource ud fra ID og fjerner den:


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

Fjerner systemdisken

OS-disken er en blob, og der er en kommando til at fjerne den Remove-AzStorageBlob — men før vi kan udføre den, skal vi angive de nødvendige værdier for dens parametre. Til dette skal vi blandt andet hente navnet på storage-containeren, der indeholder systemdisken, og derefter videregive det til denne kommando sammen med den tilsvarende storage-konto.

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

Fjerner status-blobben for systemdisken

For dette, som du sikkert allerede har gættet, skal vi tage storage-containeren, hvor denne disk opbevares, og, med antagelsen om at blobben til sidst indeholder status, videregive de relevante parametre til fjerningskommandoen Remove-AzStorageBlob:

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

Og til sidst fjerner vi data-diskene

Der kunne være data-diske tilbage til vores VM, som var vedhæftet den. Hvis de ikke er nødvendige, fjerner vi dem også. Lad os først analysere StorageProfile for vores VM og finde egenskaben Uri. Hvis der er flere diske, organiserer vi en løkke over URI. For hver URI finder vi den tilsvarende storage-konto ved hjælp af Get-AzStorageAccount. Derefter analyserer vi storage URI for at udtrække det nødvendige blob-navn og overføre det til slette-kommandoen Remove-AzStorageBlob sammen med storage-kontoen. Sådan vil det se ud i koden:

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

Og nu "er vi kommet til den lykkelige slutning!" Nu skal alle disse fragmenter samles til en helhed. Den venlige forfatter Adam Bertram har imødekommet brugerne og gjort det selv. Her er et link til det endelige script med titlen Remove-AzrVirtualMachine.ps1:

→ GitHub

Jeg håber, at disse praktiske råd vil være nyttige for dig til at spare kræfter, tid og penge, når du arbejder med Azure VMs.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster