Ændring og sletning af Azure VM'er ved hjælp af PowerShell

Ved at bruge PowerShell automatiserer ingeniører og it-administratorer med succes forskellige opgaver, når de arbejder ikke kun med lokale, men også med cloud-infrastrukturer, især med Azure. I nogle tilfælde er det meget mere bekvemt og hurtigere at arbejde gennem PowerShell end at arbejde gennem Azure-portalen. Takket være sin cross-platform karakter kan PowerShell bruges på ethvert operativsystem.

Uanset om du kører Ubuntu, Red Hat eller Windows, kan PowerShell hjælpe dig med at kontrollere dine cloud-ressourcer. Brug af modulet Azure PowerShell, for eksempel kan du indstille alle egenskaber for virtuelle maskiner.

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

Ændring og sletning af Azure VM'er ved hjælp af PowerShell

Vigtigt! Glem ikke at tørre dine hænder med desinfektionsmiddel for at forberede dig til arbejde:

  • Du skal bruge et modul Azure PowerShell-modul - det kan downloades fra PowerShell Gallery med kommandoen Install-Module Az.
  • Du skal godkende i Azure-skyen, hvor den virtuelle maskine kører, ved at køre kommandoen Connect-AzAccount.

Lad os først oprette et script, der vil ændre størrelsen på en Azure VM. Lad os åbne VS-kode og gemme et nyt PowerShell-script kaldet Resize-AzVirtualMachine.ps1 — vi tilføjer stykker kode til det, efterhånden som eksemplet skrider frem.

Vi anmoder om de tilgængelige VM-størrelser

Før du ændrer VM-størrelsen, skal du finde ud af, hvad de acceptable størrelser er for virtuelle maskiner i Azure-skyen. For at gøre dette skal du køre kommandoen Get-AzVMSize.

Altså for den virtuelle maskine devvm01 fra ressourcegruppen dev Vi anmoder om alle mulige acceptable størrelser:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

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

Kommandoen vil returnere noget som dette:

Ændring og sletning af Azure VM'er ved hjælp af PowerShell

Disse er alle mulige størrelsesindstillinger, der kan indstilles for en given virtuel maskine.

Lad os ændre størrelsen på bilen

For eksempel vil vi ændre størrelsen til en ny størrelse Standard_B1ls - han er på førstepladsen på listen ovenfor. (I virkelige applikationer vælger du selvfølgelig den størrelse, du har brug for.)

  1. Brug først kommandoen Get-AzVM vi får information om vores objekt (virtuel maskine) ved at gemme det i en variabel $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Så tager vi ejendommen fra dette objekt .HardwareProfile.VmSize og indstil den ønskede nye værdi:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Og nu udfører vi simpelthen VM-opdateringskommandoen - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Vi sørger for, at alt gik godt - for at gøre dette, anmoder vi igen om oplysninger om vores objekt og ser på ejendommen $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Hvis vi ser der Standard_B1ls - det betyder, at alt er i orden, størrelsen på bilen er ændret. Du kan gå videre og bygge videre på din succes ved at ændre størrelsen på flere VM'er på én gang ved hjælp af et array.

Hvad med at slette en VM i Azure?

Med sletning er ikke alt så enkelt og ligetil, som det måske ser ud til. Det er trods alt nødvendigt at fjerne en række ressourcer forbundet med denne maskine, herunder:

  • Opbevaringsbeholdere til opstartsdiagnostik
  • Netværksgrænseflader
  • Offentlige IP-adresser
  • Systemdisk og blob, hvor dens status er gemt
  • Datadiske

Derfor vil vi oprette en funktion og kalde den Remove-AzrVirtualMachine - og det sletter ikke kun Azure VM, men også alt det ovenstående.

Vi går standardvejen og henter først vores objekt (VM) ved hjælp af kommandoen Get-AzVm. Lad det for eksempel være en bil WINSRV19 fra ressourcegruppen MyTestVM'er.

Lad os gemme dette objekt sammen med alle dets egenskaber i en variabel $vm:

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

Fjernelse af beholderen med opstartsdiagnosefiler

Ved oprettelse af en VM i Azure bliver brugeren også bedt om at oprette en container til lagring af boot diagnosticering (boot diagnostics container), så hvis der er problemer med opstart, er der noget at henvende sig til for fejlfinding. Men når VM'en slettes, overlades denne container til at fortsætte sin nu formålsløse eksistens. Lad os rette op på denne situation.

  1. Lad os først finde ud af, hvilken lagerkonto denne container tilhører - til dette skal vi finde ejendommen storageUri i genstandens tarme DiagnosticsProfile vores VM. Til dette bruger jeg dette regulære udtryk:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Nu skal du finde ud af navnet på beholderen, og for dette skal du få VM ID'et 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å den ressourcegruppe, som containeren tilhører:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Og nu har vi alt, hvad vi behøver for at slette containeren med kommandoen Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Fjernelse af VM

Lad os nu slette selve den virtuelle maskine, da vi allerede har oprettet en variabel $vm for det tilsvarende objekt. Nå, lad os køre kommandoen Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Fjernelse af netværksgrænsefladen og den offentlige IP-adresse

Vores VM har stadig en (eller endda flere) netværksgrænseflader (NIC'er) - for at fjerne dem som unødvendige, lad os gå gennem ejendommen NetworkInterfaces vores VM-objekt og slet NIC med kommandoen Remove-AzNetworkInterface. Hvis der er mere end én netværksgrænseflade, bruger vi en loop. Samtidig kontrollerer vi ejendommen for hvert NIC IpConfiguration for at afgøre, om grænsefladen har en offentlig IP-adresse. Hvis en bliver fundet, fjerner vi den med kommandoen Remove-AzPublicIpAddress.

Her er et eksempel på netop sådan en kode, hvor vi kigger alle NIC'er igennem i en loop, sletter dem og tjekker om der er en offentlig IP. Hvis der er, så parse egenskaben PublicIpAddress, find navnet på den tilsvarende ressource efter ID og slet 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
        }
    }
}

Fjernelse af systemdisken

OS-disken er en klat, for hvilken der er en kommando til at slette den Remove-AzStorageBlob - men før du udfører det, skal du indstille de nødvendige værdier for dets parametre. For at gøre dette skal du især få navnet på lagerbeholderen, der indeholder systemdisken, og derefter videregive det til denne kommando sammen med den tilsvarende lagerkonto.

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

Fjernelse af System Disk Status Blob

For at gøre dette, som du sikkert allerede har gættet, tager vi lagerbeholderen, hvori denne disk er gemt, og antyder, at klatten i slutningen indeholder status, videregive de tilsvarende parametre til delete-kommandoen Remove-AzStorageBlob:

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

Og til sidst fjerner vi datadiskene

Vores VM kunne stadig have diske med data, der var knyttet til den. Hvis de ikke er nødvendige, sletter vi dem også. Lad os analysere det først StorageProfile vores VM og find ejendommen Uri. Er der flere diske tilrettelægger vi en cyklus iflg URI. For hver URI finder vi den tilsvarende lagerkonto ved hjælp af Get-AzStorageAccount. Parse derefter lager-URI'en for at udtrække det ønskede blob-navn og videregive det til delete-kommandoen Remove-AzStorageBlob sammen med en lagerkonto. Sådan ser det ud i kode:

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 "har vi nået den lykkelige slutning!" Nu skal vi samle en enkelt helhed fra alle disse fragmenter. Den venlige forfatter Adam Bertram mødte brugerne halvvejs og gjorde det selv. Her er et link til det endelige script kaldet Remove-AzrVirtualMachine.ps1:

GitHub

Jeg håber, at du finder disse praktiske tips nyttige til at spare dig for indsats, tid og penge, når du arbejder med Azure VM'er.

Kilde: www.habr.com

Tilføj en kommentar