Folosind PowerShell, inginerii și administratorii IT automatizează cu succes diverse sarcini atunci când lucrează nu numai cu infrastructuri on-premise, ci și cu infrastructuri cloud, în special cu Azure. În unele cazuri, lucrul prin PowerShell este mult mai convenabil și mai rapid decât lucrul prin portalul Azure. Datorită naturii sale multiplatforme, PowerShell poate fi utilizat pe orice sistem de operare.
Indiferent dacă rulați Ubuntu, Red Hat sau Windows, PowerShell vă poate ajuta să vă controlați resursele cloud. Folosind modulul
În acest articol, vom analiza cum puteți utiliza PowerShell pentru a redimensiona o VM în cloud Azure, precum și pentru a șterge o VM și obiectele asociate acesteia.
Important! Nu uitați să vă ștergeți mâinile cu dezinfectant pentru a vă pregăti de lucru:
- Veți avea nevoie de un modul Modulul Azure PowerShell - poate fi descărcat din PowerShell Gallery cu comanda
Install-Module Az
. - Trebuie să vă autentificați în cloudul Azure unde rulează mașina virtuală, rulând comanda
Connect-AzAccount
.
Mai întâi, să creăm un script care va redimensiona o VM Azure. Să deschidem VS Code și să salvăm un nou script PowerShell numit Resize-AzVirtualMachine.ps1 — îi vom adăuga bucăți de cod pe măsură ce exemplul progresează.
Solicităm dimensiunile VM disponibile
Înainte de a modifica dimensiunea VM, trebuie să aflați care sunt dimensiunile acceptabile pentru mașinile virtuale din cloudul Azure. Pentru a face acest lucru, trebuie să rulați comanda Get-AzVMSize
.
Deci pentru mașina virtuală devvm01 din grupul de resurse dev Solicităm toate dimensiunile posibile acceptabile:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(În probleme reale, desigur, în loc de ResourceGroupName=dev и VMName=devvm01 veți specifica propriile valori pentru acești parametri.)
Comanda va returna ceva de genul acesta:
Acestea sunt toate opțiunile de dimensiune posibile care pot fi setate pentru o anumită mașină virtuală.
Să redimensionăm mașina
De exemplu, vom redimensiona la o dimensiune nouă Standard_B1ls - este pe primul loc pe lista de mai sus. (În aplicațiile din viața reală, desigur, alegeți orice dimensiune aveți nevoie.)
- Mai întâi folosind comanda
Get-AzVM
obținem informații despre obiectul nostru (mașina virtuală) prin stocarea acestuia într-o variabilă$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- Apoi luăm proprietatea de la acest obiect
.HardwareProfile.VmSize
și setați noua valoare dorită:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- Și acum pur și simplu executăm comanda de actualizare a VM -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- Ne asigurăm că totul a mers bine - pentru a face acest lucru, solicităm din nou informații despre obiectul nostru și ne uităm la proprietate
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Dacă vedem acolo Standard_B1ls - asta înseamnă că totul este în ordine, dimensiunea mașinii a fost schimbată. Puteți merge mai departe și vă bazați pe succesul dvs. redimensionând mai multe VM simultan, folosind o matrice.
Ce zici de ștergerea unui VM din Azure?
Cu ștergerea, nu totul este atât de simplu și direct pe cât ar părea. La urma urmei, este necesar să eliminați o serie de resurse asociate cu această mașină, inclusiv:
- Containere de stocare pentru diagnosticarea pornirii
- Interfețe de rețea
- Adrese IP publice
- Disc de sistem și blob unde este stocată starea acestuia
- Discuri de date
Prin urmare, vom crea o funcție și o vom numi Remove-AzrVirtualMachine
- și va șterge nu numai Azure VM, ci și toate cele de mai sus.
Mergem pe calea standard și primim mai întâi obiectul nostru (VM) folosind comanda Get-AzVm
. De exemplu, să fie o mașină WINSRV19 din grupul de resurse MyTestVMs.
Să salvăm acest obiect împreună cu toate proprietățile sale într-o variabilă $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
Îndepărtarea containerului cu fișiere de diagnosticare de pornire
Când creează o VM în Azure, utilizatorului i se cere, de asemenea, să creeze un container pentru stocarea diagnosticelor de pornire (container de diagnosticare de pornire), astfel încât, dacă există probleme cu pornirea, să existe ceva la care să apeleze pentru depanare. Cu toate acestea, atunci când VM-ul este șters, acest container este lăsat să-și continue existența acum fără scop. Să reparăm această situație.
- Mai întâi, să aflăm cărui cont de stocare îi aparține acest container - pentru aceasta trebuie să găsim proprietatea
storageUri
în măruntaiele obiectuluiDiagnosticsProfile
VM-ul nostru. Pentru aceasta folosesc această expresie regulată:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- Acum trebuie să aflați numele containerului și pentru aceasta trebuie să obțineți ID-ul VM 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)
- În continuare, obținem numele grupului de resurse căruia îi aparține containerul:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- Și acum avem tot ce avem nevoie 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
Eliminarea VM-ului
Acum să ștergem mașina virtuală în sine, deoarece am creat deja o variabilă $vm
pentru obiectul corespunzător. Ei bine, hai să rulăm comanda Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
Eliminarea interfeței de rețea și a adresei IP publice
VM-ul nostru are încă una (sau chiar mai multe) interfețe de rețea (NIC) - pentru a le elimina ca fiind inutile, să trecem prin proprietate NetworkInterfaces
obiectul nostru VM și ștergeți NIC-ul cu comanda Remove-AzNetworkInterface
. În cazul în care există mai multe interfețe de rețea, folosim o buclă. În același timp, pentru fiecare NIC vom verifica proprietatea IpConfiguration
pentru a determina dacă interfața are o adresă IP publică. Dacă se găsește unul, îl vom elimina cu comanda Remove-AzPublicIpAddress
.
Iată un exemplu de un astfel de cod, în care ne uităm prin toate NIC-urile într-o buclă, le ștergem și verificăm dacă există un IP public. Dacă există, atunci analizați proprietatea PublicIpAddress
, găsiți numele resursei corespunzătoare după ID și ștergeți-o:
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
}
}
}
Scoaterea discului de sistem
Discul OS este un blob, pentru care există o comandă pentru a-l șterge Remove-AzStorageBlob
- dar înainte de a-l executa, va trebui să setați valorile necesare pentru parametrii săi. Pentru a face acest lucru, în special, trebuie să obțineți numele containerului de stocare care conține discul de sistem și apoi să îl transmiteți 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]
Eliminarea blob-ului de stare a discului de sistem
Pentru a face acest lucru, după cum probabil ați ghicit deja, luăm containerul de stocare în care este stocat acest disc și, sugerând că blob-ul de la sfârșit conține status
, treceți parametrii corespunzători la comanda de ștergere Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
Și în cele din urmă, scoatem discurile de date
VM-ul nostru ar putea avea în continuare discuri cu date care i-au fost atașate. Dacă nu sunt necesare, le vom șterge și noi. Să o analizăm mai întâi StorageProfile
VM-ul nostru și găsiți proprietatea Uri
. Daca sunt mai multe discuri, organizam un ciclu in functie de URI
. Pentru fiecare URI, vom găsi contul de stocare corespunzător folosind Get-AzStorageAccount
. Apoi analizați URI-ul de stocare pentru a extrage numele blob-ului dorit și transmiteți-l la comanda de ștergere Remove-AzStorageBlob
împreună cu un cont de stocare. Cam așa ar 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 acum „am ajuns la finalul fericit!” Acum trebuie să asamblam un singur întreg din toate aceste fragmente. Amabilul autor Adam Bertram a întâlnit utilizatorii la jumătatea drumului și a făcut-o singur. Iată un link către scriptul final numit Eliminați-AzrVirtualMachine.ps1:
→
Sper că veți găsi aceste sfaturi practice utile pentru a vă economisi efort, timp și bani atunci când lucrați cu VM-uri Azure.
Sursa: www.habr.com