Endre og slette Azure VM-er ved hjelp av PowerShell

Ved å bruke PowerShell, lykkes ingeniører og IT-administratorer å automatisere ulike oppgaver når de arbeider ikke bare med lokale, men også med skyinfrastrukturer, spesielt med Azure. I noen tilfeller er det mye mer praktisk og raskere å jobbe gjennom PowerShell enn å jobbe gjennom Azure-portalen. Takket være sin karakter på tvers av plattformer, kan PowerShell brukes på alle operativsystemer.

Enten du kjører Ubuntu, Red Hat eller Windows, kan PowerShell hjelpe deg med å kontrollere skyressursene dine. Bruk av modulen Azure PowerShell, for eksempel kan du angi hvilke som helst egenskaper for virtuelle maskiner.

I denne artikkelen skal vi se på hvordan du kan bruke PowerShell til å endre størrelse på en VM i Azure-skyen, samt slette en VM og dens tilknyttede objekter.

Endre og slette Azure VM-er ved hjelp av PowerShell

Viktig! Ikke glem å tørke av hendene med rensemiddel for å forberede deg til jobb:

  • Du trenger en modul Azure PowerShell-modul - den kan lastes ned fra PowerShell Gallery med kommandoen Install-Module Az.
  • Du må autentisere i Azure-skyen der den virtuelle maskinen kjører ved å kjøre kommandoen Connect-AzAccount.

La oss først lage et skript som vil endre størrelsen på en Azure VM. La oss åpne VS-kode og lagre et nytt PowerShell-skript kalt Resize-AzVirtualMachine.ps1 — Vi vil legge til kodebiter etter hvert som eksemplet skrider frem.

Vi ber om tilgjengelige VM-størrelser

Før du endrer VM-størrelsen, må du finne ut hva de akseptable størrelsene er for virtuelle maskiner i Azure-skyen. For å gjøre dette må du kjøre kommandoen Get-AzVMSize.

Så for den virtuelle maskinen devvm01 fra ressursgruppen dev Vi ber om alle mulige akseptable størrelser:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(I virkelige problemer, selvfølgelig, i stedet for ResourceGroupName=dev и VMName=devvm01 du vil spesifisere dine egne verdier for disse parameterne.)

Kommandoen vil returnere noe slikt:

Endre og slette Azure VM-er ved hjelp av PowerShell

Dette er alle mulige størrelsesalternativer som kan angis for en gitt virtuell maskin.

La oss endre størrelsen på bilen

For eksempel vil vi endre størrelsen til en ny størrelse Standard_B1ls – han er på førsteplass på listen over. (I virkelige applikasjoner velger du selvfølgelig hvilken størrelse du trenger.)

  1. Bruk først kommandoen Get-AzVM vi får informasjon om objektet vårt (virtuell maskin) ved å lagre det i en variabel $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Så tar vi eiendommen fra dette objektet .HardwareProfile.VmSize og sett den ønskede nye verdien:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Og nå utfører vi bare VM-oppdateringskommandoen - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Vi sørger for at alt gikk bra - for å gjøre dette ber vi igjen om informasjon om vårt objekt og ser på eiendommen $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Hvis vi ser der Standard_B1ls - det betyr at alt er i orden, størrelsen på bilen er endret. Du kan gå lenger og bygge videre på suksessen din ved å endre størrelse på flere VM-er samtidig ved å bruke en matrise.

Hva med å slette en VM i Azure?

Med sletting er ikke alt så enkelt og greit som det kan virke. Tross alt er det nødvendig å fjerne en rekke ressurser knyttet til denne maskinen, inkludert:

  • Oppbevaringsbeholdere for oppstartsdiagnostikk
  • Nettverksgrensesnitt
  • Offentlige IP-adresser
  • Systemdisk og blob der statusen er lagret
  • Datadisker

Derfor vil vi lage en funksjon og kalle den Remove-AzrVirtualMachine - og det vil slette ikke bare Azure VM, men også alt det ovennevnte.

Vi går standardveien og henter først objektet vårt (VM) ved å bruke kommandoen Get-AzVm. La det for eksempel være en bil WINSRV19 fra ressursgruppen MyTestVMs.

La oss lagre dette objektet sammen med alle dets egenskaper i en variabel $vm:

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

Fjerner beholderen med oppstartsdiagnosefiler

Når du oppretter en VM i Azure, blir brukeren også bedt om å opprette en beholder for lagring av oppstartsdiagnostikk (oppstartsdiagnostikkbeholder), slik at hvis det er problemer med oppstart, er det noe å henvende seg til for feilsøking. Men når VM-en slettes, får denne beholderen fortsette sin nå formålsløse eksistens. La oss fikse denne situasjonen.

  1. Først, la oss finne ut hvilken lagringskonto denne beholderen tilhører - for dette må vi finne eiendommen storageUri i innvollene til gjenstanden DiagnosticsProfile vår VM. Til dette bruker jeg dette regulære uttrykket:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Nå må du finne ut navnet på beholderen, og for dette må du få VM-IDen ved å bruke 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. Deretter får vi navnet på ressursgruppen som beholderen tilhører:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Og nå har vi alt vi trenger for å slette beholderen med kommandoen Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Fjerning av VM

La oss nå slette selve den virtuelle maskinen, siden vi allerede har laget en variabel $vm for det tilsvarende objektet. Vel, la oss kjøre kommandoen Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Fjerner nettverksgrensesnittet og den offentlige IP-adressen

VMen vår har fortsatt ett (eller til og med flere) nettverksgrensesnitt (NIC) - for å fjerne dem som unødvendige, la oss gå gjennom eiendommen NetworkInterfaces vårt VM-objekt og slett NIC med kommandoen Remove-AzNetworkInterface. I tilfelle det er mer enn ett nettverksgrensesnitt, bruker vi en sløyfe. Samtidig vil vi sjekke eiendommen for hvert NIC IpConfiguration for å finne ut om grensesnittet har en offentlig IP-adresse. Hvis en blir funnet, fjerner vi den med kommandoen Remove-AzPublicIpAddress.

Her er et eksempel på nettopp en slik kode, der vi ser gjennom alle NIC i en løkke, sletter dem og sjekker om det finnes en offentlig IP. Hvis det er det, analyser egenskapen PublicIpAddress, finn navnet på den tilsvarende ressursen etter ID og slett 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, som det er en kommando for å slette den Remove-AzStorageBlob - men før du utfører det, må du angi de nødvendige verdiene for parameterne. For å gjøre dette, spesielt, må du få navnet på lagringsbeholderen som inneholder systemdisken, og deretter sende det til denne kommandoen sammen med den tilsvarende lagringskontoen.

$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 System Disk Status Blob

For å gjøre dette, som du sikkert allerede har gjettet, tar vi lagringsbeholderen som denne disken er lagret i, og antyder at bloben på slutten inneholder status, send de tilsvarende parameterne til delete-kommandoen Remove-AzStorageBlob:

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

Og til slutt fjerner vi datadiskene

Vår VM kan fortsatt ha disker med data som var koblet til den. Hvis de ikke er nødvendige, sletter vi dem også. La oss analysere det først StorageProfile vår VM og finn eiendommen Uri. Er det flere disker organiserer vi en syklus iht URI. For hver URI finner vi den tilsvarende lagringskontoen ved å bruke Get-AzStorageAccount. Parse deretter lagrings-URIen for å trekke ut ønsket blob-navn og gi det til slettekommandoen Remove-AzStorageBlob sammen med en lagringskonto. Slik vil det se ut 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 nå "har vi nådd den lykkelige enden!" Nå må vi sette sammen en enkelt helhet fra alle disse fragmentene. Den snille forfatteren Adam Bertram møtte brukerne halvveis og gjorde det selv. Her er en lenke til det endelige manuset kalt Remove-AzrVirtualMachine.ps1:

GitHub

Jeg håper du finner disse praktiske tipsene nyttige for å spare deg for krefter, tid og penger når du arbeider med Azure VM-er.

Kilde: www.habr.com

Legg til en kommentar