O nouă versiune a analizatorului static gratuit este disponibilă

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

O nouă versiune a analizatorului static gratuit este disponibilă

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:

O nouă versiune a analizatorului static gratuit este disponibilă

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

  1. Mai întâi, folosind comanda Get-AzVM obținem informații despre obiectul nostru (mașina virtuală), salvându-le într-o variabilă $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Apoi, luăm proprietatea acestui obiect .HardwareProfile.VmSize și setăm noua valoare dorită:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Și acum pur și simplu efectuăm comanda de actualizare a VM-ului — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. 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.

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

→ GitHub

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

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster