Koristeći PowerShell, inženjeri i IT administratori uspješno automatiziraju različite zadatke kada rade ne samo s lokalnim, već i sa cloud infrastrukturama, posebno s Azureom. U nekim slučajevima, rad preko PowerShell-a je mnogo praktičniji i brži od rada preko Azure portala. Zahvaljujući svojoj višeplatformskoj prirodi, PowerShell se može koristiti na bilo kojem operativnom sistemu.
Bilo da koristite Ubuntu, Red Hat ili Windows, PowerShell vam može pomoći da kontrolišete svoje resurse u oblaku. Korištenje modula
U ovom članku ćemo pogledati kako možete koristiti PowerShell za promjenu veličine VM-a u Azure oblaku, kao i za brisanje VM-a i povezanih objekata.
Važno! Ne zaboravite obrisati ruke dezinfekcijskim sredstvom kako biste se pripremili za posao:
- Trebat će vam modul Azure PowerShell modul - može se preuzeti iz PowerShell galerije pomoću naredbe
Install-Module Az
. - Potrebno je da se autentifikujete u Azure oblaku gde virtuelna mašina radi tako što ćete pokrenuti naredbu
Connect-AzAccount
.
Prvo, napravimo skriptu koja će promijeniti veličinu Azure VM-a. Otvorimo VS Code i spremimo novu PowerShell skriptu pod nazivom Resize-AzVirtualMachine.ps1 — dodaćemo mu delove koda kako primer bude napredovao.
Tražimo dostupne veličine VM-a
Prije nego što promijenite veličinu VM-a, morate saznati koje su prihvatljive veličine za virtuelne mašine u Azure oblaku. Da biste to učinili, morate pokrenuti naredbu Get-AzVMSize
.
Dakle, za virtuelnu mašinu devvm01 iz grupe resursa dev Tražimo sve moguće prihvatljive veličine:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(U stvarnim problemima, naravno, umjesto ResourceGroupName=dev и VMName=devvm01 odredit ćete vlastite vrijednosti za ove parametre.)
Naredba će vratiti nešto ovako:
Ovo su sve moguće opcije veličine koje se mogu postaviti za datu virtuelnu mašinu.
Hajde da promenimo veličinu auta
Na primjer, promijenit ćemo veličinu na novu veličinu Standard_B1ls - on je na prvom mestu na gornjoj listi. (U stvarnim aplikacijama, naravno, birate bilo koju veličinu koja vam je potrebna.)
- Prvo koristeći komandu
Get-AzVM
dobijamo informacije o našem objektu (virtuelnoj mašini) pohranjivanjem u varijablu$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- Zatim uzimamo svojstvo iz ovog objekta
.HardwareProfile.VmSize
i postavite željenu novu vrijednost:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- A sada jednostavno izvršavamo naredbu za ažuriranje VM-a -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- Uvjeravamo se da je sve prošlo kako treba - da bismo to učinili, ponovo tražimo informacije o našem objektu i razgledamo nekretninu
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Ako vidimo tamo Standard_B1ls - to znači da je sve u redu, veličina automobila je promijenjena. Možete ići dalje i nadograđivati svoj uspjeh tako što ćete promijeniti veličinu nekoliko VM odjednom koristeći niz.
Šta je sa brisanjem VM-a u Azureu?
Sa brisanjem nije sve tako jednostavno i jasno kao što se čini. Uostalom, potrebno je ukloniti niz resursa povezanih s ovom mašinom, uključujući:
- Kontejneri za pohranu dijagnostike pokretanja
- Mrežni interfejsi
- Javne IP adrese
- Sistemski disk i blob gdje je pohranjen njegov status
- Diskovi sa podacima
Stoga ćemo kreirati funkciju i pozvati je Remove-AzrVirtualMachine
- i to će izbrisati ne samo Azure VM, već i sve gore navedeno.
Idemo standardnim putem i prvo dobijemo naš objekat (VM) koristeći naredbu Get-AzVm
. Na primjer, neka to bude auto WINSRV19 iz grupe resursa MyTestVMs.
Sačuvajmo ovaj objekat zajedno sa svim njegovim svojstvima u varijablu $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
Uklanjanje kontejnera sa dijagnostičkim datotekama za pokretanje
Prilikom kreiranja VM-a u Azureu, od korisnika se također traži da kreira spremnik za pohranjivanje dijagnostike pokretanja (kontejner dijagnostike pokretanja), tako da ako dođe do problema s pokretanjem, ima čemu da se obrati za rješavanje problema. Međutim, kada se VM izbriše, ovaj kontejner ostaje da nastavi svoje sada besmisleno postojanje. Hajde da popravimo ovu situaciju.
- Prvo, otkrijmo kojem nalogu za pohranu pripada ovaj kontejner - za to moramo pronaći svojstvo
storageUri
u utrobi objektaDiagnosticsProfile
naš VM. Za ovo koristim ovaj regularni izraz:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- Sada morate saznati ime kontejnera, a za to trebate 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)
- Zatim dobijamo ime grupe resursa kojoj kontejner pripada:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- I sada imamo sve što nam je potrebno da naredbom izbrišemo kontejner
Remove-AzStorageContainer
:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Uklanjanje VM-a
Sada izbrišemo samu virtuelnu mašinu, pošto smo već kreirali varijablu $vm
za odgovarajući objekat. Pa, pokrenimo komandu Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
Uklanjanje mrežnog interfejsa i javne IP adrese
Naš VM još uvijek ima jedno (ili čak nekoliko) mrežnih sučelja (NIC) - da ih uklonimo kao nepotrebne, prođimo kroz svojstvo NetworkInterfaces
naš VM objekat i naredbom izbrišite NIC Remove-AzNetworkInterface
. U slučaju da postoji više od jednog mrežnog interfejsa, koristimo petlju. U isto vrijeme, za svaki NIC ćemo provjeriti imovinu IpConfiguration
da odredite da li interfejs ima javnu IP adresu. Ako se pronađe, mi ćemo ga ukloniti naredbom Remove-AzPublicIpAddress
.
Evo primjera upravo takvog koda, gdje pregledavamo sve NIC-ove u petlji, brišemo ih i provjeravamo da li postoji javna IP adresa. Ako postoji, onda analizirajte svojstvo PublicIpAddress
, pronađite naziv odgovarajućeg resursa po ID-u i obrišite 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 koji postoji naredba za brisanje Remove-AzStorageBlob
- ali prije nego što ga izvršite, morat ćete postaviti potrebne vrijednosti za njegove parametre. Da biste to učinili, posebno morate dobiti ime spremnika za pohranu koji sadrži sistemski disk, a zatim ga proslijediti ovoj komandi zajedno sa odgovarajućim nalogom za skladištenje.
$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 Bloba statusa sistemskog diska
Da bismo to učinili, kao što ste vjerovatno već pretpostavili, uzimamo spremnik za pohranu u kojem je pohranjen ovaj disk, i, podrazumijevajući da blob na kraju sadrži status
, proslijediti odgovarajuće parametre naredbi za brisanje Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
I na kraju uklanjamo diskove sa podacima
Naš VM bi još uvijek mogao imati diskove s podacima koji su mu bili pridruženi. Ako nisu potrebni, i njih ćemo izbrisati. Hajde da ga prvo raščlanimo StorageProfile
naš VM i pronađite nekretninu Uri
. Ako postoji nekoliko diskova, organiziramo ciklus prema URI
. Za svaki URI ćemo pronaći odgovarajući račun za pohranu koji koristi Get-AzStorageAccount
. Zatim raščlanite URI za skladištenje da biste izdvojili željeno ime blob-a i prosledili ga naredbi za brisanje Remove-AzStorageBlob
zajedno sa nalogom za skladištenje. Ovako bi to izgledalo 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]
}
}
A sada "došli smo do srećnog kraja!" Sada moramo sastaviti jednu celinu od svih ovih fragmenata. Ljubazni autor Adam Bertram upoznao je korisnike na pola puta i to sam uradio. Evo linka do konačne skripte pod nazivom Remove-AzrVirtualMachine.ps1:
→
Nadam se da će vam ovi praktični savjeti pomoći u uštedi truda, vremena i novca pri radu s Azure VM-ovima.
izvor: www.habr.com