Měníme a odstraňujeme Azure VMs pomocí PowerShell

Pomocí PowerShell mohou inženýři a IT administrátoři úspěšně automatizovat různé úkoly při práci nejen s on-premises, ale i s cloudovými infrastrukturami, zejména s Azure. Práce prostřednictvím PowerShell je v řadě případů mnohem pohodlnější a rychlejší než přes Azure portal. Díky multiplatformnosti je PowerShell použitelný na jakýkoliv operační systém.

Ať už pracujete s Ubuntu, Red Hat nebo Windows, PowerShell vám pomůže řídit cloudové zdroje. Použitím modulu Azure PowerShell, například, můžete nastavovat jakékoli vlastnosti virtuálních strojů.

V tomto článku se podíváme na to, jak můžete použít PowerShell ke změně velikosti VM v cloudu Azure, a také k odstranění VM a s ní spojených objektů.

Měníme a odstraňujeme Azure VMs pomocí PowerShell

Důležité! Nezapomeňte si umýt ruce dezinfekčním prostředkem a připravit se na práci:

  • Bude potřeba modul Azure PowerShell Module — ten můžete stáhnout z PowerShell Gallery pomocí příkazu Install-Module Az.
  • Je třeba autentizovat se v cloudu Azure, kde běží virtuální stroj, pomocí příkazu Connect-AzAccount.

Nejprve vytvoříme skript, který změní velikost Azure VM. Otevřeme VS Code a uložíme nový PowerShell skript jako Resize-AzVirtualMachine.ps1 — do něj během příkladu budeme přidávat části kódu.

Zjišťujeme dostupné velikosti VM

Před změnou velikosti VM je třeba zjistit, jaké jsou obecně dostupné velikosti pro virtuální stroje v cloudu Azure. K tomu je třeba spustit příkaz Get-AzVMSize.

Takže pro virtuální stroj devvm01 z resource group dev zjišťujeme všechny možné povolené velikosti:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(V reálných úlohách samozřejmě místo ResourceGroupName=dev a VMName=devvm01 budete uvádět své hodnoty těchto parametrů.)

Příkaz vrátí přibližně takový seznam:

Měníme a odstraňujeme Azure VMs pomocí PowerShell

Toto jsou všechny možné varianty velikostí, které lze pro tento virtuální stroj nastavit.

Změna velikosti stroje

Pro příklad změníme velikost na novou velikost Standard_B1ls — ta je na prvním místě v seznamu výše. (V reálných úlohách samozřejmě vyberete jakoukoli požadovanou velikost.)

  1. Nejprve pomocí příkazu Get-AzVM získáme informace o našem objektu (virtuálním stroji) a uložíme je do proměnné $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Poté z tohoto objektu vezmeme vlastnost .HardwareProfile.VmSize a nastavíme potřebnou novou hodnotu:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. A nyní jednoduše provedeme příkaz pro aktualizaci VM — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Ujistíme se, že vše proběhlo úspěšně — k tomu opět požádáme o informace o našem objektu a podíváme se na vlastnost $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Pokud tam vidíme Standard_B1ls — znamená to, že vše je v pořádku, velikost stroje byla změněna. Můžeme jít dál a rozvinout úspěch — provést resize několika VMs najednou, pomocí pole.

A co odstranění VMs v Azure?

S odstraněním to není tak jednoduché a přímé, jak by se mohlo zdát. Je třeba odstranit také řadu dalších zdrojů spojených s tímto strojem, včetně:

  • Úložištní kontejnery pro diagnostiku spouštění (Boot diagnostics storage containers)
  • Síťová rozhraní
  • Veřejné IP adresy
  • Systémový disk a blob, kde je uloženo jeho stav
  • Data disky (data disks)

Proto vytvoříme funkci a nazveme ji Remove-AzrVirtualMachine — a ta bude odstraňovat nejen Azure VM, ale také vše výše uvedené.

Postupujeme standardním způsobem a nejdříve získáme náš objekt (VM) pomocí příkazu Get-AzVm. Pro příklad ať je to stroj WINSRV19 z resource group MyTestVMs.

Uložíme tento objekt spolu se všemi jeho vlastnostmi do proměnné $vm:

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

Odstraníme kontejner s diagnostickými soubory spuštění

Při vytváření VM v Azure je uživateli také nabídnuto vytvořit kontejner pro ukládání diagnostiky spouštění (boot diagnostics container), aby měl při potížích se spuštěním co zkontrolovat pro troubleshooting. Nicméně při odstranění VM tento kontejner zůstává a pokračuje ve své nyní zbytečné existenci. Opravením této situace.

  1. Nejdříve zjistíme, který úložní účet kontejner vlastní — k tomu potřebujeme najít vlastnost storageUri ve hlubinách objektu DiagnosticsProfile naší VM. K tomu používám takový regulární výraz:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Nyní je třeba zjistit název kontejneru, a k tomu musíme získat VM ID pomocí pří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. Dále získáme název skupiny zdrojů, ke které náleží kontejner:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. A nyní máme vše potřebné pro odstranění kontejneru pomocí příkazu Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Odstraňujeme VM

Nyní odstraníme samotný virtuální stroj, protože jsme již vytvořili proměnnou $vm pro odpovídající objekt. Tak pojďme spustit příkaz Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Odstraňujeme síťový rozhraní a veřejnou IP adresu

Našem VM zbývá jedno (nebo dokonce několik) síťových rozhraní (NIC), abychom je odstranili jako nepotřebné, projdeme vlastnost NetworkInterfaces našem objektu VM a odstraníme NIC pomocí příkazu Remove-AzNetworkInterface. Pro případ, že by bylo více síťových rozhraní, použijeme smyčku. Zároveň pro každé NIC zkontrolujeme vlastnost IpConfiguration zda má rozhraní veřejnou IP adresu. Pokud bude taková nalezena, odstraníme ji příkazem Remove-AzPublicIpAddress.

Toto je příklad takového kódu, kde v smyčce procházíme všechny NICy, odstraníme je, zkontrolujeme, zda je veřejná IP. Pokud ano, tak provedeme analýzu vlastnosti PublicIpAddress, získáme pomocí ID název odpovídajícího zdroje a odstraníme 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, k jehož odstranění existuje příkaz Remove-AzStorageBlob — ale před jeho provedením bude nutné stanovit požadované hodnoty jeho parametrům. K tomu je třeba získat název úložiště, které obsahuje systémový disk, a poté je předat tomuto příkazu spolu s odpovídajícím úložišťovým účtem.

$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

K tomu, jak už jste asi uhodli, bereme úložišťový kontejner, ve kterém se tento disk nachází, a s předpokladem, že blob na konci obsahuje status, předáváme odpovídající parametry příkazu pro odstranění Remove-AzStorageBlob:

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

A nakonec odstraníme disky s daty

Naší VM mohly zůstat disky s daty, které byly k ní připojeny. Pokud je nepotřebujeme, odstraníme i ty. Nejprve je parsujeme StorageProfile naší VM a najdeme vlastnost Uri. Pokud je více disků, uspořádáme cyklus podle URI. Pro každý URI najdeme odpovídající storage účet pomocí Get-AzStorageAccount. Poté parsujeme storage URI, abychom získali potřebné jméno blobu a předali ho příkazu pro odstranění Remove-AzStorageBlob spolu se storage účtem. Takto to bude vypadat v kódu:

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 teď jsme "dosáhli šťastného konce!" Nyní je třeba z těchto fragmentů sestavit celek. Dobrosrdečný autor Adam Bertram vyšel vstříc uživatelům a udělal to za ně. Tady je odkaz na finální skript s názvem Remove-AzrVirtualMachine.ps1:

→ GitHub

Doufám, že tyto praktické rady vám pomohou ušetřit síly, čas a prostředky při práci s Azure VMs.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster