PowerShell segítségével a mérnökök és IT-adminisztrátorok sikeresen automatizálnak különböző feladatokat nemcsak on-premises, hanem felhőinfrastruktúrákkal, különösen az Azure-ra vonatkozóan is. A PowerShell használata sok esetben kényelmesebb és gyorsabb, mint az Azure portál. A PowerShell platformfüggetlensége lehetővé teszi, hogy bármilyen operációs rendszeren használhassuk.
Nem számít, hogy Ubuntu, Red Hat vagy Windows rendszeren dolgozik-e — a PowerShell segít a felhőerőforrások irányításában. A modul használatával például bármilyen virtuális gép tulajdonságait beállíthatja.
Ez a cikk azt vizsgálja, hogyan lehet a PowerShell-t használni egy Azure VM méretének módosítására, valamint a VM és a hozzá kapcsolódó objektumok törlésére.

Fontos! Ne felejtsd el fertőtlenítani a kezed, és készülni a munkára:
- Szükséged lesz a Azure PowerShell Module modulra — ezt a PowerShell Gallery-ből töltheted le a következő parancsot futtatva:
Install-Module Az. - Be kell jelentkezned az Azure felhőbe, ahol a virtuális gép fut, a következő parancs kiadásával:
Connect-AzAccount.
Kezdjük el egy szkript létrehozását, amely átméretezi az Azure VM-et. Nyissuk meg a VS Code-ot és mentsük el az új PowerShell szkriptet a következő néven: Resize-AzVirtualMachine.ps1 — ebbe folyamatosan hozzá fogjuk adni a kódrészleteket a példa során.
Kérdezzük le a meglévő VM méreteket
Mielőtt megváltoztatnánk a VM méretét, tudnunk kell, hogy milyen elfogadható méretek állnak rendelkezésre az Azure felhőben. Ehhez futtassuk a következő parancsot: Get-AzVMSize.
Tehát a devvm01 virtuális géphez a dev erőforráscsoportból kérjük le a lehetséges méreteket:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(Valós feladatok során természetesen a ResourceGroupName=dev és VMName=devvm01 paraméterekhez a saját értékeidet fogod használni.)
A parancs körülbelül a következő listát fogja visszaadni:

Ezek az összes lehetséges méret, amit beállíthatunk az adott virtuális géphez.
A VM átméretezése
Példaként az új méretet állítjuk be Standard_B1ls — ez az első helyen áll a fenti listán. (Valós feladatok során természetesen bármilyen szükséges méretet választhat.)
- Először, a
Get-AzVMparancs segítségével szerezzük meg a VM-ről (virtuális gépről) szóló információt, és tároljuk azokat a$virtualMachine:változóban: - $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
Ezután ebből az objektumból kinyerjük a.HardwareProfile.VmSizetulajdonságot, és beállítjuk a szükséges új értéket: - Most már csak végrehajtjuk a VM frissítő parancsot —
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Biztosítjuk, hogy minden sikeresen ment — ehhez ismét lekérjük az objektumunk adatait, és megnézzük a következő tulajdonságot
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Ha ott látjuk, Standard_B1ls — akkor minden rendben, a gép mérete megváltozott. Tovább léphetünk, és kihasználhatjuk a sikert — egyszerre több VM-et is átméretezhetünk egy tömb használatával.
Mi a helyzet az Azure VM-ek törlésével?
A törlés nem olyan egyszerű és egyenes, mint ahogy azt elsőre gondolnánk. Hiszen számos egyéb erőforrást is el kell távolítani, amely ehhez a géphez kapcsolódik, például:
- Indítási diagnosztika tároló (Boot diagnostics storage containers)
- Hálózati interfészek
- Nyilvános IP címek
- A rendszerlemez és blob, amely tárolja annak állapotát
- Adatlemezek (data disks)
Ezért létrehozunk egy funkciót, amelyet Remove-AzrVirtualMachine — és ez nemcsak az Azure VM-et fogja törölni, hanem mindezeket az erőforrásokat is.
A szokásos módon járunk el, először lekérjük az objektumunkat (VM) a Get-AzVmparancs segítségével. Például legyen ez a gép WINSRV19 virtuális géphez a MyTestVMs.
Ezt az objektumot és annak összes tulajdonságát egy változóba mentjük $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsTöröljük a diagnostic boot file-ok tárolóját.
Az Azure VM létrehozásakor a felhasználónak lehetősége van indítási diagnosztikai tároló létrehozására is, hogy ha probléma adódik az indítással, legyen mibe belefuttatni a hibaelhárítást. Azonban a VM törlésekor ez a tároló továbbra is létezik, már céltalanul. Helyrehozzuk ezt a helyzetet.
- Először meg kell találnunk, hogy melyik tárolóhoz tartozik ez a tároló — ehhez meg kell találnunk a következő tulajdonságot
storageUriaz objektum mélyénDiagnosticsProfilea VM-ünkben. Ezt a következő reguláris kifejezést használom:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - Most meg kell tudnunk a tároló nevét, ehhez a VM ID-t kell lekérnünk a
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) - Ezután megkapjuk annak a tárolócsoportnak a nevét, amelyikhez a tároló tartozik:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - Most már minden szükséges információnk megvan a tároló parancssal való törléséhez
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
Virtuális gép törlése
Most töröljük magát a virtuális gépet, mivel már létrehoztuk a megfelelő objektum változót. Nos, futtassuk a parancsot $vm Remove-AzVm $null = $vm | Remove-AzVM -Force:
Hálózati interfész és nyilvános IP-cím törléseA virtuális gépünknél egy (vagy akár több) hálózati interfész (NIC) maradt – hogy töröljük őket, mivel nem szükségesek, nézzük át a "
NetworkInterfaces " tulajdonságát a VM objektumunkon, és töröljük a NIC-et a következő parancs segítségével Remove-AzNetworkInterface . Ha több hálózati interfész van, akkor ciklust használunk. Mindeközben minden NIC-nél ellenőrizzük az "IpConfiguration " tulajdonságot, hogy van-e nyilvános IP-cím. Ha van, a következő paranccsal töröljük Remove-AzPublicIpAddress Itt egy példa arra a kódra, ahol ciklusban végigjárjuk az összes NIC-t, töröljük őket, ellenőrizzük, hogy van-e nyilvános IP. Ha van, akkor a ".
PublicIpAddress ", azonosítóra hivatkozva megszerezzük a megfelelő erőforrás nevét, és töröljük azt: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 -Forceforeach($ipConfig in $nic.IpConfigurations) { if($ipConfig.PublicIpAddress -ne $null) { Remove-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $ipConfig.PublicIpAddress.Id.Split('\/')[-1] -Force } } }
Rendszerlemez törlése
A rendszerlemez egy blob, amelynek törléséhez parancs érhető el
Remove-AzStorageBlob – de a parancs végrehajtása előtt szükséges megadni a paramétereihez a szükséges értékeket. Ehhez például meg kell szerezni a rendszerlemez tároló konténerének nevét, és aztán ezt az információt továbbítani a megadott parancshoz a megfelelő tárolófiókkal együtt. $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]
A rendszerlemez állapotának blob törlése
Ehhez, ahogy már bizonyára kitaláltad, a tároló konténert vesszük, amelyben ez a lemez található, és, feltételezve, hogy a blob végén található
, átadjuk a megfelelő paramétereket a törlési parancsnak status, átadjuk a megfelelő paramétereket az eltávolító csapatnak – de a parancs végrehajtása előtt szükséges megadni a paramétereihez a szükséges értékeket. Ehhez például meg kell szerezni a rendszerlemez tároló konténerének nevét, és aztán ezt az információt továbbítani a megadott parancshoz a megfelelő tárolófiókkal együtt.:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobVégül eltávolítjuk az adatlemezeket
A virtuális gépünkhöz csatlakoztatott adatlemezek maradhattak. Ha nincs rájuk szükség, azokat is törölni fogjuk. Először feldolgozzuk őket. StorageProfile a virtuális gépünkön, és megkeressük a tulajdonságot Uri. Ha több lemez áll rendelkezésre, ciklust hozunk létre a URI. Minden URI-hoz megkeressük a megfelelő tárolófiókot a Get-AzStorageAccount. Ezután feldolgozzuk a storage URI-t, hogy kivonjuk a szükséges blob nevét, és átadjuk a törlési parancsnak – de a parancs végrehajtása előtt szükséges megadni a paramétereihez a szükséges értékeket. Ehhez például meg kell szerezni a rendszerlemez tároló konténerének nevét, és aztán ezt az információt továbbítani a megadott parancshoz a megfelelő tárolófiókkal együtt. a tárolófiókkal együtt. Így fog kinézni a kód:
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]
}
}
És itt vagyunk, elérkeztünk a boldog véghez! Most ezeket a részeket egy egységgé kell összeállítani. A kedves szerző, Adam Bertram, a felhasználók kedvéért megtette ezt. Íme a végső szkript, amelynek címe Remove-AzrVirtualMachine.ps1:
→
Remélem, ezek a gyakorlati tanácsok segítenek Önnek, hogy energiát, időt és pénzt takarítson meg az Azure VM-ekkel való munkavégzés során.
Forrás: habr.com
