Úpravy a odstraňování virtuálních počítačů Azure pomocí PowerShellu

Pomocí PowerShellu inženýři a IT administrátoři úspěšně automatizují různé úkoly při práci nejen s místními, ale také s cloudovými infrastrukturami, zejména s Azure. V některých případech je práce přes PowerShell mnohem pohodlnější a rychlejší než práce přes Azure Portal. Díky své multiplatformní povaze lze PowerShell používat na jakémkoli operačním systému.

Ať už používáte Ubuntu, Red Hat nebo Windows, PowerShell vám může pomoci ovládat vaše cloudové zdroje. Pomocí modulu Azure PowerShellmůžete například nastavit libovolné vlastnosti virtuálních strojů.

V tomto článku se podíváme na to, jak můžete pomocí PowerShellu změnit velikost virtuálního počítače v cloudu Azure a také odstranit virtuální počítač a jeho přidružené objekty.

Úpravy a odstraňování virtuálních počítačů Azure pomocí PowerShellu

Důležité! Nezapomeňte si otřít ruce dezinfekcí, abyste se připravili na práci:

  • Budete potřebovat modul Modul Azure PowerShell - lze jej stáhnout z galerie PowerShell pomocí příkazu Install-Module Az.
  • Spuštěním příkazu se musíte ověřit v cloudu Azure, kde běží virtuální počítač Connect-AzAccount.

Nejprve vytvořte skript, který změní velikost virtuálního počítače Azure. Otevřeme VS Code a uložíme nový skript PowerShell s názvem Resize-AzVirtualMachine.ps1 — v průběhu příkladu do něj budeme přidávat kousky kódu.

Požadujeme dostupné velikosti VM

Než změníte velikost virtuálního počítače, musíte zjistit, jaké jsou přijatelné velikosti pro virtuální počítače v cloudu Azure. Chcete-li to provést, musíte spustit příkaz Get-AzVMSize.

Tedy pro virtuální stroj devvm01 ze skupiny prostředků dev Požadujeme všechny možné přijatelné velikosti:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Ve skutečných problémech, samozřejmě místo toho ResourceGroupName=dev и VMName=devvm01 pro tyto parametry určíte své vlastní hodnoty.)

Příkaz vrátí něco takového:

Úpravy a odstraňování virtuálních počítačů Azure pomocí PowerShellu

Toto jsou všechny možné možnosti velikosti, které lze nastavit pro daný virtuální stroj.

Pojďme změnit velikost auta

Například změníme velikost na novou velikost Standard_B1ls - je na prvním místě ve výše uvedeném seznamu. (V reálných aplikacích si samozřejmě vyberete jakoukoli velikost, kterou potřebujete.)

  1. Nejprve pomocí příkazu Get-AzVM informaci o našem objektu (virtuálním stroji) získáme uložením do proměnné $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Potom vezmeme vlastnost z tohoto objektu .HardwareProfile.VmSize a nastavte požadovanou novou hodnotu:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. A nyní jednoduše provedeme příkaz aktualizace VM - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Dbáme na to, aby vše proběhlo v pořádku – k tomu si znovu vyžádáme informace o našem objektu a prohlédneme si nemovitost $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Pokud tam uvidíme Standard_B1ls - to znamená, že je vše v pořádku, velikost vozu byla změněna. Můžete jít dále a stavět na svém úspěchu změnou velikosti několika virtuálních počítačů najednou pomocí pole.

A co smazání virtuálního počítače v Azure?

S mazáním není vše tak jednoduché a přímočaré, jak by se mohlo zdát. Koneckonců je nutné odstranit řadu zdrojů spojených s tímto strojem, včetně:

  • Spouštěcí diagnostické úložné kontejnery
  • Síťová rozhraní
  • Veřejné IP adresy
  • Systémový disk a blob, kde je uložen jeho stav
  • Datové disky

Proto vytvoříme funkci a zavoláme ji Remove-AzrVirtualMachine - a odstraní nejen virtuální počítač Azure, ale také všechny výše uvedené.

Jdeme standardní cestou a nejprve získáme náš objekt (VM) pomocí příkazu Get-AzVm. Ať je to například auto WINSRV19 ze skupiny prostředků MyTestVMs.

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

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

Odebrání kontejneru s diagnostickými soubory spouštění

Při vytváření virtuálního počítače v Azure je uživatel také požádán o vytvoření kontejneru pro uložení diagnostiky spouštění (kontejner diagnostiky spouštění), aby se v případě problémů se spouštěním měl na co obrátit při řešení problémů. Když je však virtuální počítač odstraněn, je tento kontejner ponechán, aby pokračoval ve své nyní bezúčelné existenci. Pojďme tuto situaci napravit.

  1. Nejprve zjistíme, ke kterému účtu úložiště tento kontejner patří - k tomu musíme najít vlastnost storageUri v útrobách objektu DiagnosticsProfile náš VM. K tomu používám tento regulární výraz:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Nyní musíte zjistit název kontejneru a k tomu musíte pomocí příkazu získat ID VM 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 prostředků, do které kontejner patří:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. A nyní máme vše, co potřebujeme k 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

Odebrání VM

Nyní smažeme samotný virtuální stroj, protože jsme již vytvořili proměnnou $vm pro odpovídající objekt. No, spustíme příkaz Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Odebrání síťového rozhraní a veřejné IP adresy

Náš virtuální počítač má stále jedno (nebo dokonce několik) síťových rozhraní (NIC) – abychom je odstranili jako nepotřebné, pojďme si projít vlastnost NetworkInterfaces náš objekt VM a smažte NIC pomocí příkazu Remove-AzNetworkInterface. V případě, že existuje více síťových rozhraní, použijeme smyčku. Zároveň u každého NIC zkontrolujeme nemovitost IpConfiguration zjistit, zda má rozhraní veřejnou IP adresu. Pokud se nějaký najde, příkazem ho odstraníme Remove-AzPublicIpAddress.

Zde je příklad právě takového kódu, kdy procházíme všechny NIC ve smyčce, mažeme je a kontrolujeme, zda existuje veřejná IP. Pokud existuje, analyzujte vlastnost PublicIpAddress, najděte název odpovídajícího zdroje podle ID a odstraňte jej:


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

Odebrání systémového disku

Disk OS je blob, pro který existuje příkaz k jeho odstranění Remove-AzStorageBlob - ale před jeho spuštěním budete muset nastavit požadované hodnoty jeho parametrů. Chcete-li to provést, musíte zejména získat název úložného kontejneru obsahujícího systémový disk a poté jej předat tomuto příkazu spolu s odpovídajícím účtem úložiště.

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

Odebrání objektu Blob System Disk Status

Za tímto účelem, jak jste pravděpodobně již uhodli, vezmeme úložný kontejner, ve kterém je tento disk uložen, a z toho vyplývá, že blob na konci obsahuje status, předejte odpovídající parametry příkazu delete Remove-AzStorageBlob:

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

A nakonec odstraníme datadisky

Náš virtuální počítač mohl mít stále disky s daty, která k němu byla připojena. Pokud nejsou potřeba, smažeme je také. Nejprve to rozebereme StorageProfile náš VM a najděte nemovitost Uri. Pokud je disků více, uspořádáme cyklus podle URI. Pro každý URI najdeme odpovídající účet úložiště pomocí Get-AzStorageAccount. Poté analyzujte identifikátor URI úložiště, abyste extrahovali požadovaný název objektu blob a předali jej příkazu delete Remove-AzStorageBlob spolu s účtem úložiště. Takto by to vypadalo 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ď "dosáhli jsme šťastného konce!" Nyní musíme sestavit jediný celek ze všech těchto fragmentů. Laskavý autor Adam Bertram vyšel uživatelům vstříc na půl cesty a udělal to sám. Zde je odkaz na finální skript s názvem Remove-AzrVirtualMachine.ps1:

GitHub

Doufám, že vám tyto praktické tipy pomohou při práci s virtuálními počítači Azure, které vám ušetří námahu, čas a peníze.

Zdroj: www.habr.com

Přidat komentář