Urejanje in brisanje Azure VM-jev z uporabo PowerShell

S pomočjo PowerShell-a inženirji in IT-administratorji uspešno avtomatizirajo različne naloge pri delu ne le z lokalnimi, temveč tudi s oblačnimi infrastrukturnimi rešitvami, zlasti z Azure. Delo preko PowerShell-a je v nekaterih primerih veliko bolj priročno in hitrejše kot preko Azure portala. Zaradi večplatformske narave PowerShell-a ga lahko uporabljate v vseh operacijskih sistemih.

Ni pomembno, ali delate z Ubuntu, Red Hat ali Windows — PowerShell vam bo pomagal upravljati oblačne vire. Uporabite lahko modul Azure PowerShell, na primer, za nastavitev vseh lastnosti virtualnih strojev.

V tem članku bomo raziskali, kako lahko uporabite PowerShell za spremembo velikosti VM v oblačju Azure ter za odstranitev VM in z njo povezanih objektov.

Urejanje in brisanje Azure VM-jev z uporabo PowerShell

Důležité! Ne pozabite si očistiti roke s razkužilom, preden začnete delati:

  • Potrebovali boste modul Azure PowerShell Module — prenesete ga lahko iz PowerShell Gallery s pomočjo ukaza Install-Module Az.
  • Potrebno je avtentificirati se v oblačju Azure, kjer deluje virtualni stroj, z izvajanjem ukaza Connect-AzAccount.

Najprej bomo ustvarili skript, ki spremeni velikost Azure VM. Odprli bomo VS Code in shranili nov PowerShell skript pod imenom Resize-AzVirtualMachine.ps1 — v njega bomo po poteku primera dodajali kose kode.

Zahtevamo obstoječe velikosti VM

Preden spremenite velikost VM, je treba ugotoviti, katere veljavne velikosti so na voljo za virtualne stroje v oblačju Azure. To lahko ugotovite z izvajanjem ukaza Get-AzVMSize.

Torej, za virtualni stroj devvm01 iz skupine virov dev zahtevamo vse možne veljavne velikosti:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(V resničnih nalogah boste seveda namesto ResourceGroupName=dev in VMName=devvm01 navedli svoje vrednosti teh parametrov.)

Ukaz bo vrnil približno tak seznam:

Urejanje in brisanje Azure VM-jev z uporabo PowerShell

To so vse možne velikosti, ki jih lahko nastavite za ta virtualni stroj.

Spremenimo velikost stroja

Za primer bomo spremenili velikost na novo velikost Standard_B1ls — ta je na prvem mestu na seznamu zgoraj. (V resničnih nalogah boste seveda izbrali katero koli velikost, ki jo potrebujete.)

  1. Najprej s pomočjo ukaza Get-AzVM pridobimo podatke o našem objektu (virtualnem stroju), shranimo jih v spremenljivko $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Nato od tega objekta vzamemo lastnost .HardwareProfile.VmSize in nastavimo zahtevano novo vrednost:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Zdaj pa preprosto izvedemo ukaz za posodobitev VM — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Ugotavljamo, da je vse potekalo uspešno — zato ponovno zahtevamo informacije o našem objektu in pogledamo lastnost $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Če tam vidimo Standard_B1ls — to pomeni, da je vse v redu, velikost stroja je bila spremenjena. Lahko nadaljujemo in naredimo korak naprej — spremenimo velikost več VM-jev hkrati z uporabo tabele.

Kakšno pa je stanje z brisanjem VM-jev v Azure?

Z brisanjem ni vse tako preprosto in neposredno, kot bi se lahko zdelo. Treba je namreč izbrisati tudi vrsto drugih virov, povezanih s tem strojem, vključno z:

  • Shranjevalnimi kontejnerji za diagnostiko nalaganja (Boot diagnostics storage containers)
  • Сетевые интерфейсы
  • Javne IP naslove
  • Sistemski disk in blob, kjer se shranjuje njegov status
  • Podatkovnimi diski (data disks)

Zato bomo ustvarili funkcijo in jo poimenovali Remove-AzrVirtualMachine — in ta bo izbrisala ne le Azure VM, temveč tudi vse zgoraj navedeno.

Sledimo standardni poti in najprej dobimo naš objekt (VM) z ukazom Get-AzVm. Za primer naj bo to stroj WINSRV19 iz skupine virov MyTestVMs.

Shranjujemo ta objekt skupaj z vsemi njegovimi lastnostmi v spremenljivko $vm:

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

Brišemo kontejner s datotekami diagnostike nalaganja

Pri ustvarjanju VM v Azure je uporabniku prav tako предложено, da ustvari kontejner za shranjevanje diagnostike nalaganja (boot diagnostics container), da bo imel ob težavah z nalaganjem nekaj, na kar se lahko sklicuje za odpravljanje težav. Vendar pa ta kontejner ob brisanju VM ostane in nadaljuje svoje zdaj brezciljno obstoja. Popravimo to situacijo.

  1. Najprej ugotovimo, kateremu shranjevalnemu računu pripada ta kontejner — za to moramo poiskati lastnost storageUri v globinah objekta DiagnosticsProfile naši VM. Za to uporabim takšno regularno izrazo:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Zdaj moramo izvedeti ime kontejnerja, in za to moramo dobiti ID VM z ukazom 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. Nato dobimo ime skupine virov, kateri pripada kontejner:
    $diagSaRg = (Get-AzStorageAccount | where { $.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. In zdaj imamo vse potrebno za izbris kontejnerja s ukazom Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Izbrišemo VM

Zdaj bomo izbrisali virtualni stroj, srečali smo se z dejstvom, da smo že ustvarili spremenljivko $vm za ustrezni objekt. Torej, zaženimo ukaz Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Izbrišemo omrežni vmesnik in javni IP naslov

Na našem VM je ostal en (ali več) omrežnih vmesnikov (NICs) — da bi jih odstranili, gremo skozi lastnost NetworkInterfaces našem objektu VM in izbrišemo NIC z ukazom Remove-AzNetworkInterface. V primeru, da je omrežnih vmesnikov več, uporabimo zanko. Za vsak NIC bomo preverili lastnost IpConfiguration z vidika, ali ima vmesnik javni IP naslov. Če bo ta odkrit, ga odstranimo z ukazom Remove-AzPublicIpAddress.

Tukaj je primer takšnega kode, kjer v zanki pregledamo vse NICs, jih izbrišemo in preverimo, ali imamo javni IP. Če je, torej izluščimo lastnost PublicIpAddress, pridobimo ime ustreznega vira po ID-ju in ga izbrišemo:


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

Izbrišemo sistemsko enoto

Disk OS je blob, za katerega obstaja ukaz za odstranitev Remove-AzStorageBlob — vendar pred njegovo izvedbo je potrebno določiti zahtevane vrednosti njegovim parametrom. Za to je potrebno, med drugim, pridobiti ime shranjevanja kontejnerja, ki vsebuje sistemsko enoto, in šele nato ga posredno podati temu ukazu skupaj z ustreznim shranjevanjem.

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

Izbrišemo Blob statusa sistemske enote

Za to, kot ste verjetno že domnevali, vzamemo shranjevalni kontejner, v katerem se nahaja ta disk, in, predvidevajoč, da blob na koncu vsebuje status, posredujemo ustrezne parametre ukazu za odstranitev Remove-AzStorageBlob:

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

In končni fazi odstranimo diske z podatki

Na našem VM so lahko ostali diski z podatki, ki so bili priključeni nanj. Če jih ne potrebujemo, jih bomo odstranili tudi. Najprej bomo razčlenili StorageProfile našega VM in poiskali lastnost Uri. Če je več diskov, bomo organizirali cikel po URI. Za vsak URI bomo poiskali ustrezen storage račun s pomočjo Get-AzStorageAccount. Nato bomo razčlenili storage URI, da izvlečemo potrebno ime blob-a in ga posredovali ukazu za odstranitev Remove-AzStorageBlob skupaj s storage računom. Tako bo to izgledalo v kodi:

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

In tako "smo prispeli do srečnega konca!" Zdaj je treba vse te fragmenta sestaviti v celoto. Prijazni avtor Adam Bertram je šel na roko uporabnikom in to storil sam. Tukaj je povezava do končnega skripta z naslovom Remove-AzrVirtualMachine.ps1:

→ GitHub

Upam, da vam bodo ti praktični nasveti koristili pri varčevanju z energijo, časom in sredstvi pri delu z Azure VM-ji.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster