Mijenjanje i brisanje Azure VM-ova putem PowerShell-a

Pomoću PowerShell-a inženjeri i IT administratori uspješno automatiziraju razne zadatke u radu ne samo s lokalnim, već i s oblaku infrastrukturom, posebno s Azure-om. Raditi putem PowerShell-a u mnogim je slučajevima mnogo prikladnije i brže nego putem Azure portala. Zbog međplatformske podrške, PowerShell se može koristiti na svim operativnim sustavima.

Bez obzira radite li s Ubuntu, Red Hat ili Windows-om — PowerShell će vam pomoći u kontroli oblačnih resursa. Koristeći modul Azure PowerShell, na primjer, možete postaviti bilo koja svojstva virtualnih mašina.

U ovom članku ćemo razmotriti kako koristiti PowerShell za mijenjanje veličine VM-a u oblaku Azure, kao i za brisanje VM-a i povezanih objekata.

Mijenjanje i brisanje Azure VM-ova putem PowerShell-a

Važno! Ne zaboravite dezinficirati ruke i pripremiti se za rad:

  • Trebat će vam modul Azure PowerShell Module — možete ga preuzeti iz PowerShell Gallery naredbom Install-Module Az.
  • Morate se autentificirati u oblaku Azure, gdje se nalazi virtualna mašina, izvođenjem naredbe Connect-AzAccount.

Za početak, stvorit ćemo skriptu koja mijenja veličinu Azure VM-a. Otvorit ćemo VS Code i spremiti novu PowerShell skriptu pod nazivom Resize-AzVirtualMachine.ps1 — u nju ćemo tijekom primjera dodavati dijelove koda.

Tražimo postojeće veličine VM-a

Prije nego što promijenite veličinu VM-a, potrebno je znati koje su dozvoljene veličine za virtualne mašine u oblaku Azure. Da biste to saznali, potrebno je izvršiti naredbu Get-AzVMSize.

Dakle, za virtualnu mašinu devvm01 iz resursne grupe dev tražimo sve dozvoljene veličine:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(U stvarnim zadacima, naravno, umjesto ResourceGroupName=dev i VMName=devvm01 navest ćete svoje vrijednosti za te parametre.)

Naredba će vratiti otprilike takav popis:

Mijenjanje i brisanje Azure VM-ova putem PowerShell-a

To su sve moguće veličine koje se mogu postaviti za ovu virtualnu mašinu.

Mijenjamo veličinu mašine

Za primjer, promijenit ćemo veličinu na novu veličinu Standard_B1ls — ona je prva na popisu iznad. (U stvarnim zadacima, naravno, odabirete bilo koju veličinu koja vam odgovara.)

  1. Najprije pomoću naredbe Get-AzVM dobivamo informacije o našem objektu (virtualnoj mašini), čuvajući ih u varijabli $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Zatim uzimamo svojstvo ovog objekta .HardwareProfile.VmSize i postavljamo novu potrebnu vrijednost:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. I sada jednostavno izvršavamo naredbu za ažuriranje VM-a — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Provjeravamo je li sve prošlo uspješno — u tu svrhu opet tražimo informacije o našem objektu i gledamo na svojstvo $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Ako tamo vidimo Standard_B1ls — to znači da je sve u redu, veličina stroja je promijenjena. Možemo ići dalje i nastaviti uspjeh — promijeniti veličinu nekoliko VM-ova odjednom koristeći niz.

A što je s brisanjem VM-a u Azureu?

S brisanjem nije sve tako jednostavno i ravno kao što se može činiti. Naime, potrebno je obrisati još nekoliko resursa povezanih s tim strojem, uključujući:

  • Spremnik za pohranu za dijagnostiku pokretanja (Boot diagnostics storage containers)
  • Mrežni sučelja
  • Javne IP adrese
  • Sustavni disk i blob koji pohranjuje njegov status
  • Diskovi s podacima (data disks)

Stoga ćemo napraviti funkciju i nazvati je Remove-AzrVirtualMachine — i ona će brisati ne samo Azure VM, već i sve navedeno.

Idemo standardnim putem i prvo dobivamo naš objekt (VM) pomoću naredbe Get-AzVm. Za primjer, neka to bude stroj WINSRV19 iz resursne grupe MyTestVMs.

Spremit ćemo ovaj objekt zajedno sa svim njegovim svojstvima u varijablu $vm:

$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs

Brišemo spremnik s datotekama dijagnostike pokretanja

Prilikom stvaranja VM-a u Azureu, korisniku se također nudi kreiranje spremnika za pohranu dijagnostike pokretanja (boot diagnostics container), kako bi se u slučaju problema s pokretanjem imalo gdje potražiti rješenje. Međutim, prilikom brisanja VM-a, ovaj spremnik ostaje i nastavlja svoje sada beskorisno postojanje. Ispravimo tu situaciju.

  1. Prvo ćemo saznati kojem storage računu pripada ovaj spremnik — u tu svrhu trebamo pronaći svojstvo storageUri u dubinama objekta DiagnosticsProfile našeg VM-a. Za to koristim ovako izrađenu regularnu ekspresiju:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Sada trebamo saznati ime spremnika, a za to trebamo dobiti VM ID pomoću naredbe 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. Zatim dobivamo ime resursne grupe kojoj pripada spremnik:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. I sada imamo sve što je potrebno za uklanjanje kontejnera pomoću naredbe Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Uklanjanje VM-a

Sada ćemo ukloniti virtualnu mašinu, srećom, već smo kreirali promenljivu $vm za odgovarajući objekat. Pa, pokrenimo naredbu Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Uklanjamo mrežni interfejs i javnu IP adresu

Naša VM ima jedan (ili čak više) mrežnih interfejsa (NICs) — da bismo ih uklonili jer nisu potrebni, proći ćemo kroz svojstvo NetworkInterfaces našeg VM objekta i ukloniti NIC pomoću naredbe Remove-AzNetworkInterface. U slučaju da ima više mrežnih interfejsa, koristimo petlju. Takođe, za svaki NIC proveravamo svojstvo IpConfiguration da vidimo ima li interfejs javnu IP adresu. Ako se takva pronađe, uklonit ćemo je naredbom Remove-AzPublicIpAddress.

Evo primera takvog koda gde u petlji prolazimo kroz sve NIC-ove, uklanjamo ih i proveravamo postoji li javna IP adresa. Ako postoji, analiziramo svojstvo PublicIpAddress, uzimamo ime odgovarajućeg resursa prema ID-u i uklanjamo ga:


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
        }
    }
}

Uklanjanje sistemskog diska

OS disk je blob, za uklanjanje kojeg postoji naredba Remove-AzStorageBlob — ali pre nego što je izvršimo, potrebno je postaviti potrebne vrednosti njenim parametrima. Za ovo, između ostalog, potrebno je dobiti ime skladišnog kontejnera koji sadrži sistemski disk, a zatim ga proslijediti ovoj naredbi zajedno sa odgovarajućim skladišnim računom.

$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]

Uklanjanje Blob statusa sistemskog diska

Za to, kao što ste već sigurno pretpostavili, uzimamo skladišni kontejner u kojem se ovaj disk nalazi, i, pod pretpostavkom da blob na kraju sadrži status, prosledićemo odgovarajuće parametre naredbi za uklanjanje Remove-AzStorageBlob:

$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob

I konačno, uklanjamo diskove s podacima

Našoj VM mogli su ostati diskovi s podacima koji su bili vezani uz nju. Ako nisu potrebni, uklonit ćemo i njih. Prvo ćemo analizirati StorageProfile našoj VM i pronaći svojstvo Uri. Ako ima više diskova, organizirat ćemo petlju po URI. Za svaki URI pronaći ćemo odgovarajući storage account pomoću Get-AzStorageAccount. Zatim ćemo analizirati storage URI kako bismo izvadili potrebno ime blob-a i predati ga naredbi za uklanjanje Remove-AzStorageBlob zajedno sa storage accountom. Ovako će izgledati u kodu:

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 eto, "stigli smo do sretnog kraja!" Sada iz svih ovih fragmenata trebamo sastaviti cjelinu. Dobar autor Adam Bertram je izašao u susret korisnicima i sam to napravio. Evo linka na završni skript pod nazivom Remove-AzrVirtualMachine.ps1:

→ GitHub

Nadam se da će vam ovi praktični savjeti biti korisni kako biste uštedjeli energiju, vrijeme i sredstva pri radu s Azure VM-ovima.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster