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 , 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.

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:

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ť.)
- Najprv pomocou príkazu
Get-AzVMzískame informácie o našom objekte (virtuálnom stroji) a uložíme ich do premennej$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - Potom si z tohto objektu vezmeme vlastnosť
.HardwareProfile.VmSizea nastavíme požadovanú novú hodnotu:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - A teraz jednoducho vykonáme príkaz na aktualizáciu VM —
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - 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 MyTestVMsOdstraň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.
- Najprv zistíme, ktorý úložný účet patrí tomuto kontajneru — na to potrebujeme nájsť vlastnosť
storageUriv útrobách objektuDiagnosticsProfilenašej VM. Na to používam takéto regulárne výrazy:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - 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) - Potom získame názov zdrojovej skupiny, ku ktorej patrí kontajner:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - 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 -ForceOdstraň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-AzStorageBlobA 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:
→
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
