Inginerii și administratorii IT automatizează cu succes diverse sarcini utilizând PowerShell, atât pentru infrastructuri on-premises, cât și pentru cele cloud, în special Azure. Lucrul prin PowerShell este adesea mult mai convenabil și rapid decât utilizarea portalului Azure. Datorită compatibilității cross-platform, PowerShell poate fi utilizat pe orice sistem de operare.
Indiferent dacă lucrați cu Ubuntu, Red Hat sau Windows, PowerShell vă va ajuta să controlați resursele cloud. Folosind modulul , de exemplu, puteți seta orice proprietăți ale mașinilor virtuale.
În acest articol, vom analiza cum se poate folosi PowerShell pentru a schimba dimensiunea unei VM în cloudul Azure, precum și pentru a șterge VM-ul și obiectele asociate acestuia.

Important! Nu uitați să vă dezinfectați mâinile înainte de a începe:
- Vă va trebui modulul Azure PowerShell Module — acesta poate fi descărcat din PowerShell Gallery folosind comanda
Install-Module Az. - Trebuie să vă autentificați în cloudul Azure unde rulează mașina virtuală, executând comanda
Connect-AzAccount.
În primul rând, să creăm un script care redimensionează Azure VM. Vom deschide VS Code și vom salva un nou script PowerShell cu numele Resize-AzVirtualMachine.ps1 — în care vom adăuga pe parcursul exemplului fragmente de cod.
Obținem dimensiunile disponibile ale VM-ului
Înainte de a schimba dimensiunea VM-ului, trebuie să aflăm ce dimensiuni sunt disponibile pentru mașinile virtuale în cloudul Azure. Pentru aceasta, trebuie să executați comanda Get-AzVMSize.
Deci, pentru mașina virtuală devvm01 din grupul de resurse dev cerem toate dimensiunile permise:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(În sarcini reale, desigur, în loc de ResourceGroupName=dev și VMName=devvm01 veți specifica valorile proprii pentru acești parametri.)
Comanda va returna o listă asemănătoare:

Aceasta este toată gama de dimensiuni disponibile pe care le puteți stabili pentru această mașină virtuală.
Redimensionăm mașina
Ca exemplu, vom efectua redimensionarea pe o nouă dimensiune Standard_B1ls — aceasta fiind prima din listă. (În sarcini reale, desigur, alegeți orice dimensiune necesară.)
- Mai întâi, folosind comanda
Get-AzVMobținem informații despre obiectul nostru (mașina virtuală), salvându-le într-o variabilă$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - Apoi, luăm proprietatea acestui obiect
.HardwareProfile.VmSizeși setăm noua valoare dorită:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - Și acum pur și simplu efectuăm comanda de actualizare a VM-ului —
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Ne asigurăm că totul a decurs cu succes — pentru aceasta, din nou, solicităm informații despre obiectul nostru și ne uităm la proprietatea
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Dacă vedem acolo Standard_B1ls — înseamnă că totul este în regulă, dimensiunea mașinii a fost modificată. Putem continua și să extindem succesul — redimensionând mai multe VM-uri folosind un array.
Și ce zici de ștergerea VM-urilor în Azure?
Ștergerea nu este atât de simplă și directă, cum ar putea părea. Trebuie să ștergem și o serie de resurse asociate cu această mașină, inclusiv:
- Containerele de stocare pentru diagnosticarea încărcării (Boot diagnostics storage containers)
- Interfețe de rețea
- Adresele IP publice
- Disc sistem și blob, unde este stocat statusul său
- Discuri de date (data disks)
Prin urmare, vom crea o funcție pe care o vom numi Remove-AzrVirtualMachine — și aceasta va șterge nu doar VM-ul Azure, ci și tot ce este menționat mai sus.
Urmăm calea standard și, mai întâi, obținem obiectul nostru (VM) folosind comanda Get-AzVm. Ca exemplu, să fie aceasta mașina WINSRV19 din grupul de resurse MyTestVMs.
Să păstrăm acest obiect împreună cu toate proprietățile sale într-o variabilă $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsȘtergem containerul cu fișierele de diagnosticare a încărcării
Atunci când se creează o VM în Azure, utilizatorul este, de asemenea, invitat să creeze un container pentru stocarea diagnosticării încărcării (boot diagnostics container), astfel încât, în caz de probleme cu încărcarea, să existe ceva la care să se poată referi pentru depanare. Totuși, la ștergerea VM-ului, acest container continuă să existe fără un scop. Să corectăm această situație.
- Mai întâi, să aflăm la ce cont de stocare aparține acest container — pentru aceasta trebuie să căutăm proprietatea
storageUriîn adâncurile obiectuluiDiagnosticsProfileal VM-ului nostru. Pentru aceasta, folosesc următoarea expresie regulată:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.' ).groups[1].value - Acum trebuie să aflăm numele containerului, iar pentru aceasta trebuie să obținem ID-ul VM-ului folosind comanda
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) - Apoi obținem numele grupului de resurse la care aparține containerul:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - Și acum avem tot ce ne trebuie pentru a șterge containerul cu comanda
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Ștergem VM
Acum vom șterge mașina virtuală propriu-zisă, având în vedere că am creat deja variabila $vm pentru obiectul corespunzător. Ei bine, să rulăm comanda Remove-AzVm:
$null = $vm | Remove-AzVM -ForceȘtergem interfața de rețea și IP-ul public
Mașina noastră virtuală mai are una (sau chiar mai multe) interfețe de rețea (NICs) — pentru a le șterge, vom trece prin proprietatea NetworkInterfaces a obiectului nostru VM și vom șterge NIC-ul cu comanda Remove-AzNetworkInterface. În caz că sunt mai multe interfețe de rețea, vom utiliza un ciclu. De asemenea, pentru fiecare NIC vom verifica proprietatea IpConfiguration pentru a vedea dacă interfața are un IP public. În cazul în care este găsit, îl vom șterge cu comanda Remove-AzPublicIpAddress.
Iată un exemplu de cod în care parcurgem toate NIC-urile, le ștergem și verificăm dacă există un IP public. Dacă există, parsăm proprietatea PublicIpAddress, extragem numele resursei corespunzătoare după ID și o ștergem:
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
}
}
}
Ștergem discul de sistem
Discul OS este un blob, pentru ștergerea căruia există o comandă Remove-AzStorageBlob — dar înainte de a o executa, va trebui să definim valorile necesare pentru parametrii săi. În acest sens, este necesar să obținem numele containerului de stocare care conține discul de sistem și apoi să-l transmitem acestei comenzi, împreună cu contul de stocare corespunzător.
$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]
Ștergem Blob-ul stării discului de sistem
Pentru aceasta, așa cum ați ghicit deja, vom lua containerul de stocare în care se află acest disc și, presupunând că blob-ul de la final conține status, vom transmite parametrii corespunzători comenzii de ștergere Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobȘi, în final, eliminăm discurile cu date
La VM-ul nostru ar putea să existe discuri cu date care au fost atașate. Dacă nu mai sunt necesare, le vom șterge și pe acestea. Mai întâi, le vom analiza StorageProfile al VM-ului nostru și vom găsi proprietatea Uri. Dacă există mai multe discuri, vom organiza un ciclu pentru URI. Pentru fiecare URI vom găsi contul de stocare corespunzător folosind Get-AzStorageAccount. Apoi, vom analiza storage URI pentru a extrage numele blob-ului necesar și a-l transmite comenzii de ștergere Remove-AzStorageBlob împreună cu contul de stocare. Iată cum va arăta în cod:
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]
}
}
Și iată că „am ajuns la finalul fericit!” Acum, din toate aceste fragmente, trebuie să formăm un întreg. Autorul binevoitor Adam Bertram a mers în întâmpinarea utilizatorilor și a făcut asta el însuși. Iată linkul către scriptul final intitulat Remove-AzrVirtualMachine.ps1:
→
Sper că aceste sfaturi practice vă vor fi utile pentru a economisi efort, timp și resurse în lucrul cu VM-urile Azure.
Sursa: habr.com
