Modificarea și ștergerea mașinilor virtuale Azure folosind PowerShell

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 Azure PowerShell, de exemplu, puteți seta orice proprietăți ale mașinilor virtuale.

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

Modificarea și ștergerea mașinilor virtuale Azure folosind PowerShell

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:

Modificarea și ștergerea mașinilor virtuale Azure folosind PowerShell

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

  1. 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
  2. Apoi luăm proprietatea de la acest obiect .HardwareProfile.VmSize și setați noua valoare dorită:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Și acum pur și simplu executăm comanda de actualizare a VM - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. 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.

  1. 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 obiectului DiagnosticsProfile VM-ul nostru. Pentru aceasta folosesc această expresie regulată:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. 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)
    
  3. În continuare, obținem numele grupului de resurse căruia îi aparține containerul:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Ș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:

GitHub

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

Adauga un comentariu