Az Azure virtuális gépek módosítása és törlése PowerShell használatával

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 Azure PowerShell, például beállíthatja a virtuális gépek bármilyen tulajdonságát.

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.

Az Azure virtuális gépek módosítása és törlése PowerShell használatával

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:

Az Azure virtuális gépek módosítása és törlése PowerShell használatával

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

  1. 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
  2. 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"
  3. És most egyszerűen végrehajtjuk a VM frissítési parancsot - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. 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.

  1. 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 beleiben DiagnosticsProfile 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
  2. 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)
    
  3. Ezután megkapjuk annak az erőforráscsoportnak a nevét, amelyhez a tároló tartozik:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. 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:

GitHub

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

Hozzászólás