Meníme a vymazávame Azure VM pomocou PowerShell

S pomocou PowerShell úspešne automatizujú inžinieri a IT administrátori rôzne úlohy pri práci nielen s on-premises, ale aj s cloudovými infraštruktúrami, najmä s Azure. Práca cez PowerShell je v mnohých prípadoch omnoho pohodlnejšia a rýchlejšia ako cez Azure portal. Vďaka multiplatformovosti PowerShell je možné ho používať na akýchkoľvek operačných systémoch.

Nezáleží na tom, či pracujete s Ubuntu, Red Hat alebo Windows — PowerShell vám pomôže kontrolovať cloudové zdroje. Použitím modulu Azure PowerShell, napríklad môžete nastavovať akékoľvek vlastnosti virtuálnych strojov.

V tomto článku si ukážeme, ako je možné využiť PowerShell na zmenu veľkosti VM v cloude Azure, ako aj na odstránenie VM a s nimi spojených objektov.

Meníme a vymazávame Azure VM pomocou PowerShell

Dôležité! Nezabudnite si umyť ruky dezinfekčným prostriedkom a pripraviť sa na prácu:

  • Potrebovať budete modul Azure PowerShell Module — tento modul si môžete stiahnuť z PowerShell Gallery príkazom Install-Module Az.
  • Je potrebné sa autentifikovať v cloude Azure, kde sa nachádza virtuálny stroj, vykonaním príkazu Connect-AzAccount.

Najprv si vytvoríme skript, ktorý zmenšuje veľkosť Azure VM. Otvoríme VS Code a uložíme nový PowerShell skript s názvom Resize-AzVirtualMachine.ps1 — do neho budeme počas príkladu pridávať útržky kódu.

Vyžiadame si existujúce veľkosti VM

Predtým, než zmeníte veľkosť VM, je potrebné zistiť, aké sú dostupné veľkosti pre virtuálne stroje v cloude Azure. Na to sa vykoná príkaz Get-AzVMSize.

Takže pre virtuálny stroj devvm01 z resource group dev žiadame o všetky možné povolené veľkosti:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(V reálnych úlohách, samozrejme, namiesto ResourceGroupName=dev a VMName=devvm01 budete zadávať svoje hodnoty týchto parametrov.)

Príkaz vráti približne takýto zoznam:

Meníme a vymazávame Azure VM pomocou PowerShell

Toto sú všetky možné varianty veľkostí, ktoré môžete nastaviť pre tento virtuálny stroj.

Zmeníme veľkosť stroja

Pre príklad zmeníme veľkosť na novú veľkosť Standard_B1ls — je na prvom mieste v zozname vyššie. (V reálnych úlohách, samozrejme, si vyberiete akúkoľvek potrebnú veľkosť.)

  1. Najprv pomocou príkazu Get-AzVM získame informácie o našom objekte (virtuálnom stroji) a uložíme ich do premennej $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Potom si z tohto objektu vezmeme vlastnosť .HardwareProfile.VmSize a nastavíme požadovanú novú hodnotu:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. A teraz jednoducho vykonáme príkaz na aktualizáciu VM — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Uistíme sa, že všetko prebehlo úspešne — na to sa opäť opýtame na informácie o našom objekte a pozrieme sa na vlastnosť $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Ak tam vidíme Standard_B1ls — znamená to, že všetko je v poriadku, veľkosť stroja bola zmenená. Môžeme ísť ďalej a pokračovať v úspechu — zmeniť veľkosť hneď niekoľkých VM pomocou poľa.

A čo sa týka odstránenia VM v Azure?

S odstránením to nie je tak jednoduché a priamočiare, ako by sa mohlo zdať. Musíme totiž odstrániť aj množstvo iných prostriedkov spojených s týmto strojom, vrátane:

  • Úložných kontajnerov pre diagnostiku zavádzania (Boot diagnostics storage containers)
  • Sieťové rozhrania
  • Verejné IP adresy
  • Systémový disk a blob, kde sa uchováva jeho stav
  • Disky s údajmi (data disks)

Preto vytvoríme funkciu a nazveme ju Remove-AzrVirtualMachine — a táto funkcia odstráni nielen Azure VM, ale aj všetko vyššie uvedené.

Ideme štandardnou cestou a najskôr získame náš objekt (VM) pomocou príkazu Get-AzVm. Pre príklad nech je to stroj WINSRV19 z resource group MyTestVMs.

Uložíme tento objekt so všetkými jeho vlastnosťami do premennej $vm:

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

Odstraňujeme kontajner so súbormi diagnostiky zavádzania

Pri vytváraní VM v Azure sa používateľovi ponúka aj vytvorenie kontajnera pre uchovávanie diagnostiky zavádzania (boot diagnostics container), aby sa pri problémoch so zavádzaním dalo na čo odvolávať pri riešení problémov. Avšak pri odstránení VM tento kontajner zostáva naďalej existovať bez účelu. Oprávnime túto situáciu.

  1. Najprv zistíme, ktorý úložný účet patrí tomuto kontajneru — na to potrebujeme nájsť vlastnosť storageUri v útrobách objektu DiagnosticsProfile našej VM. Na to používam takéto regulárne výrazy:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Teraz musíme zistiť názov kontajnera, a na to potrebujeme získať ID VM pomocou príkazu 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. Potom získame názov zdrojovej skupiny, ku ktorej patrí kontajner:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. A teraz máme všetko potrebné na to, aby sme odstránili kontajner príkazom Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Odstraňujeme VM

Teraz odstránime virtuálny počítač, keďže sme už vytvorili premennú $vm pre príslušný objekt. No, spustíme príkaz Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Odstraňujeme sieťové rozhranie a verejnú IP adresu

Na našej VM zostalo jedno (alebo aj viacero) sieťových rozhraní (NICs) — aby sme ich odstránili zbytočnosti, prejdeme cez vlastnosť NetworkInterfaces nášho objektu VM a odstránime NIC príkazom Remove-AzNetworkInterface. V prípade, že je viac sieťových rozhraní, použijeme cyklus. Pri každom NIC skontrolujeme aj vlastnosť IpConfiguration čo ak je na rozhraní verejná IP adresa. Ak bude objavená, odstránime ju príkazom Remove-AzPublicIpAddress.

Tu je príklad takého kódu, kde v cykle prechádzame všetkými NICs, odstraňujeme ich, kontrolujeme, či je verejná IP. Ak áno, parsujeme vlastnosť PublicIpAddress, získavame názov príslušného zdroja podľa ID a odstraňujeme ho:


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

Odstraňujeme systémový disk

Disk OS je blob, na jeho odstránenie existuje príkaz Remove-AzStorageBlob — ale pred jeho vykonaním je potrebné nastaviť požadované hodnoty jeho parametrom. Na to, medzi inými, je potrebné získať názov úložného kontajnera, ktorý obsahuje systémový disk, a potom ho odovzdať tomuto príkazu spolu s príslušným úložným účtom.

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

Odstraňujeme blob stavu systémového disku

Na to, ako už určite tušíte, vezmeme úložný kontajner, v ktorom sa nachádza tento disk, a, predpokladajúc, že blob na konci obsahuje status, predávame príslušné parametre príkazu na odstránenie Remove-AzStorageBlob:

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

A napokon odstránime disky s dátami

Našej VM mohli zostať disky s dátami, ktoré boli k nej pripojené. Ak ich nepotrebujeme, odstránime aj tie. Najprv ich parsujeme StorageProfile našej VM a nájdeme vlastnosť Uri. Ak je diskov viac, usporiadame cyklus podľa URI. Pre každý URI nájdeme zodpovedajúci storage účet pomocou Get-AzStorageAccount. Potom parsujeme storage URI, aby sme extrahovali požadované meno blobu a odovzdali ho príkazu na odstránenie Remove-AzStorageBlob spolu so storage účtom. Takto to bude vyzerať v kóde:

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

A tak sme "sa dostali k šťastnému koncu!" Teraz musíme zo všetkých týchto fragmentov poskladať celok. Dobrosrdečný autor Adam Bertram vyhovel používateľom a urobil to sám. Tu je odkaz na konečný skript s názvom Remove-AzrVirtualMachine.ps1:

→ GitHub

Dúfam, že tieto praktické tipy vám pomôžu ušetriť sily, čas a prostriedky pri práci s Azure VMs.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster