A PowerShell használatával a mérnökök és informatikai rendszergazdák sikeresen automatizálják a különféle feladatokat, amikor nemcsak a helyszíni, hanem a felhő-infrastruktúrákkal is dolgoznak, különösen az Azure-ban. Egyes esetekben a PowerShell-en keresztüli munka sokkal kényelmesebb és gyorsabb, mint az Azure Portalon. Platformok közötti jellegének köszönhetően a PowerShell bármilyen operációs rendszeren használható.
Akár Ubuntut, akár Red Hatet vagy Windowst futtat, a PowerShell segíthet a felhő-erőforrások vezérlésében. A modul használata
Ebben a cikkben megvizsgáljuk, hogyan használhatja a PowerShellt az Azure-felhőben lévő virtuális gépek átméretezésére, valamint a virtuális gépek és a hozzá tartozó objektumok törlésére.
Fontos! Ne felejtse el fertőtlenítőszerrel megtörölni a kezét, hogy felkészüljön a munkára:
- Szükséged lesz egy modulra Azure PowerShell-modul - paranccsal letölthető a PowerShell Gallery-ből
Install-Module Az
. - A parancs futtatásával hitelesítenie kell az Azure-felhőben, ahol a virtuális gép fut
Connect-AzAccount
.
Először is hozzunk létre egy szkriptet, amely átméretezi az Azure virtuális gépet. Nyissuk meg a VS Code-ot, és mentsünk el egy új PowerShell-szkriptet Resize-AzVirtualMachine.ps1 — a példa előrehaladtával kódrészleteket adunk hozzá.
Elkérjük a rendelkezésre álló VM méreteket
A virtuális gép méretének módosítása előtt meg kell találnia, hogy melyek az Azure-felhőben lévő virtuális gépek elfogadható méretei. Ehhez le kell futtatnia a parancsot Get-AzVMSize
.
Tehát a virtuális géphez devvm01 erőforráscsoportból dev Kérünk minden lehetséges elfogadható méretet:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(Valódi problémáknál természetesen ahelyett ResourceGroupName=dev и VMName=devvm01 ezekhez a paraméterekhez saját értékeit adja meg.)
A parancs valami ilyesmit ad vissza:
Ezek mind lehetséges méretbeállítások, amelyek beállíthatók egy adott virtuális géphez.
Méretezzük át az autót
Például átméretezzük egy új méretre Standard_B1ls - a fenti listán az első helyen áll. (Természetesen a valós alkalmazásoknál bármilyen méretet választhat.)
- Először használja a parancsot
Get-AzVM
objektumunkról (virtuális gépünkről) változóban tárolva kapunk információkat$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- Ezután ebből az objektumból vesszük ki az ingatlant
.HardwareProfile.VmSize
és állítsa be a kívánt új értéket:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- És most egyszerűen végrehajtjuk a VM frissítési parancsot -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- Gondoskodunk arról, hogy minden rendben menjen - ehhez ismételten információt kérünk objektumunkról és megnézzük az ingatlant
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Ha ott látjuk Standard_B1ls - ez azt jelenti, hogy minden rendben van, az autó mérete megváltozott. Továbbléphet és építhet a sikerre, ha egyszerre több virtuális gépet is átméretez egy tömb segítségével.
Mi a helyzet a virtuális gép törlésével az Azure-ban?
A törléssel nem minden olyan egyszerű és egyértelmű, mint amilyennek látszik. Végül is el kell távolítani számos ehhez a géphez kapcsolódó erőforrást, beleértve:
- Rendszerindítási diagnosztikai tárolókonténerek
- Hálózati interfészek
- Nyilvános IP-címek
- Rendszerlemez és blob, ahol az állapota tárolva van
- Adatlemezek
Ezért létrehozunk egy függvényt, és meghívjuk Remove-AzrVirtualMachine
- és nem csak az Azure virtuális gépet, hanem a fentieket is törölni fogja.
A szokásos módon megyünk, és először megkapjuk az objektumunkat (VM) a parancs segítségével Get-AzVm
. Például legyen egy autó WINSRV19 erőforráscsoportból MyTestVMs.
Mentsük el ezt az objektumot minden tulajdonságával együtt egy változóba $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
A rendszerindítási diagnosztikai fájlokat tartalmazó tároló eltávolítása
Amikor virtuális gépet hoz létre az Azure-ban, a felhasználót arra is kérik, hogy hozzon létre egy tárolót a rendszerindítási diagnosztika tárolására (boot diagnosztikai tároló), hogy ha a rendszerindítás során problémák merülnének fel, akkor legyen mihez fordulni a hibaelhárításhoz. A virtuális gép törlésekor azonban ez a tároló továbbra is céltalan létét folytatja. Javítsuk ezt a helyzetet.
- Először nézzük meg, melyik tárfiókhoz tartozik ez a tároló – ehhez meg kell találnunk a tulajdonságot
storageUri
a tárgy beleibenDiagnosticsProfile
a virtuális gépünk. Ehhez ezt a reguláris kifejezést használom:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- Most meg kell találnia a tároló nevét, és ehhez meg kell szereznie a VM azonosítót a paranccsal
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 az erőforráscsoportnak a nevét, amelyhez a tároló tartozik:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- Most pedig minden megvan, ami a tároló törléséhez szükséges a paranccsal
Remove-AzStorageContainer
:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
A virtuális gép eltávolítása
Most töröljük magát a virtuális gépet, mivel már létrehoztunk egy változót $vm
a megfelelő objektumhoz. Nos, futtassuk a parancsot Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
A hálózati interfész és a nyilvános IP-cím eltávolítása
A virtuális gépünknek még mindig van egy (vagy akár több) hálózati csatolója (NIC) – ha szükségtelennek akarjuk távolítani őket, menjünk végig a tulajdonságon. NetworkInterfaces
a VM objektumunkat, és törölje a hálózati kártyát a paranccsal Remove-AzNetworkInterface
. Ha egynél több hálózati interfész van, hurkot használunk. Ugyanakkor minden hálózati kártya esetén ellenőrizzük az ingatlant IpConfiguration
annak megállapítására, hogy az interfésznek van-e nyilvános IP-címe. Ha találunk ilyet, a paranccsal eltávolítjuk Remove-AzPublicIpAddress
.
Íme egy példa egy ilyen kódra, ahol egy ciklusban végignézzük az összes hálózati kártyát, töröljük őket, és ellenőrizzük, hogy van-e nyilvános IP-cím. Ha van, akkor elemezze a tulajdonságot PublicIpAddress
, keresse meg a megfelelő erőforrás nevét azonosító alapján, és törölje:
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
}
}
}
A rendszerlemez eltávolítása
Az operációs rendszer lemeze egy blob, amelyhez van egy parancs a törlésére Remove-AzStorageBlob
- de a végrehajtás előtt be kell állítania a paramétereihez szükséges értékeket. Ehhez különösen meg kell szereznie a rendszerlemezt tartalmazó tárolótároló nevét, majd át kell adnia ennek a parancsnak a megfelelő tárfió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 System Disk Status Blob eltávolítása
Ehhez, ahogy valószínűleg már sejtette, vesszük azt a tárolótartályt, amelyben ez a lemez található, és arra utalva, hogy a végén lévő blob status
, adja át a megfelelő paramétereket a delete parancsnak Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
És végül eltávolítjuk az adatlemezeket
A virtuális gépünknek továbbra is lehetnek lemezei a hozzá csatolt adatokkal. Ha nincs rájuk szükség, akkor azokat is töröljük. Először elemezzük StorageProfile
virtuális gépünket, és keresse meg az ingatlant Uri
. Ha több lemez van, akkor a szerint szervezünk egy ciklust URI
. Minden egyes URI-hoz megtaláljuk a megfelelő tárfiókot Get-AzStorageAccount
. Ezután elemezze a tárolási URI-t a kívánt blobnév kibontásához, és adja át a delete parancsnak Remove-AzStorageBlob
tárfiókkal együtt. Így nézne ki kódban:
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 most „elérkeztünk a happy endhez!” Most ezekből a töredékekből egyetlen egészet kell összeállítanunk. A kedves szerző, Adam Bertram félúton találkozott a felhasználókkal, és maga csinálta. Itt van egy link a végleges szkripthez Remove-AzrVirtualMachine.ps1:
→
Remélem, hasznosnak találja ezeket a gyakorlati tippeket az Azure virtuális gépekkel való munka során erőfeszítést, időt és pénzt takaríthat meg.
Forrás: will.com