Ändra och ta bort virtuella Azure-datorer med PowerShell

Med hjälp av PowerShell automatiserar ingenjörer och IT-administratörer framgångsrikt olika uppgifter när de arbetar inte bara med lokalt utan också med molninfrastruktur, särskilt med Azure. I vissa fall är det mycket bekvämare och snabbare att arbeta genom PowerShell än att arbeta genom Azure-portalen. Tack vare dess plattformsoberoende karaktär kan PowerShell användas på alla operativsystem.

Oavsett om du kör Ubuntu, Red Hat eller Windows kan PowerShell hjälpa dig att kontrollera dina molnresurser. Använda modulen Azure PowerShell, till exempel kan du ställa in alla egenskaper för virtuella maskiner.

I den här artikeln kommer vi att titta på hur du kan använda PowerShell för att ändra storlek på en virtuell dator i Azure-molnet, samt ta bort en virtuell dator och dess associerade objekt.

Ändra och ta bort virtuella Azure-datorer med PowerShell

Viktigt! Glöm inte att torka händerna med desinfektionsmedel för att förbereda dig för arbetet:

  • Du behöver en modul Azure PowerShell-modul - det kan laddas ner från PowerShell Gallery med kommandot Install-Module Az.
  • Du måste autentisera i Azure-molnet där den virtuella maskinen körs genom att köra kommandot Connect-AzAccount.

Låt oss först skapa ett skript som kommer att ändra storlek på en virtuell Azure-dator. Låt oss öppna VS Code och spara ett nytt PowerShell-skript som heter Resize-AzVirtualMachine.ps1 — vi kommer att lägga till bitar av kod till det allt eftersom exemplet fortskrider.

Vi begär de tillgängliga VM-storlekarna

Innan du ändrar VM-storleken måste du ta reda på vilka storlekar som är acceptabla för virtuella datorer i Azure-molnet. För att göra detta måste du köra kommandot Get-AzVMSize.

Så för den virtuella maskinen devvm01 från resursgruppen dev Vi begär alla möjliga acceptabla storlekar:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(I verkliga problem, naturligtvis, istället för ResourceGroupName=dev и VMName=devvm01 du kommer att ange dina egna värden för dessa parametrar.)

Kommandot kommer att returnera något så här:

Ändra och ta bort virtuella Azure-datorer med PowerShell

Dessa är alla möjliga storleksalternativ som kan ställas in för en given virtuell maskin.

Låt oss ändra storlek på bilen

Till exempel kommer vi att ändra storlek till en ny storlek Standard_B1ls – han ligger på första plats på listan ovan. (I verkliga applikationer väljer du självklart vilken storlek du behöver.)

  1. Använd först kommandot Get-AzVM vi får information om vårt objekt (virtuell maskin) genom att lagra det i en variabel $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Sedan tar vi egendomen från detta objekt .HardwareProfile.VmSize och ställ in önskat nya värde:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Och nu kör vi helt enkelt VM-uppdateringskommandot - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Vi ser till att allt gick bra - för att göra detta begär vi återigen information om vårt objekt och tittar på fastigheten $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Om vi ​​ser där Standard_B1ls – det betyder att allt är i sin ordning, storleken på bilen har ändrats. Du kan gå längre och bygga vidare på din framgång genom att ändra storlek på flera virtuella datorer samtidigt med hjälp av en array.

Vad sägs om att ta bort en virtuell dator i Azure?

Med radering är inte allt så enkelt och okomplicerat som det kan verka. När allt kommer omkring är det nödvändigt att ta bort ett antal resurser som är associerade med den här maskinen, inklusive:

  • Förvaringsbehållare för startdiagnostik
  • Nätverksgränssnitt
  • Offentliga IP-adresser
  • Systemdisk och blob där dess status lagras
  • Datadiskar

Därför kommer vi att skapa en funktion och kalla den Remove-AzrVirtualMachine - och det kommer att radera inte bara Azure VM, utan också allt ovanstående.

Vi går standardvägen och hämtar först vårt objekt (VM) med kommandot Get-AzVm. Låt det till exempel vara en bil WINSRV19 från resursgruppen MyTestVMs.

Låt oss spara detta objekt tillsammans med alla dess egenskaper i en variabel $vm:

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

Ta bort behållaren med startdiagnostikfiler

När man skapar en virtuell dator i Azure ombeds användaren också att skapa en behållare för lagring av startdiagnostik (bootdiagnostikbehållare), så att om det uppstår problem med uppstart finns det något att vända sig till för felsökning. Men när den virtuella datorn raderas lämnas denna behållare för att fortsätta sin nu ändamålslösa existens. Låt oss fixa den här situationen.

  1. Låt oss först ta reda på vilket lagringskonto denna behållare tillhör - för detta måste vi hitta fastigheten storageUri i föremålets tarm DiagnosticsProfile vår VM. För detta använder jag det här reguljära uttrycket:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Nu måste du ta reda på namnet på behållaren, och för detta måste du få VM-ID:t med kommandot 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. Därefter får vi namnet på resursgruppen som behållaren tillhör:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Och nu har vi allt vi behöver för att ta bort behållaren med kommandot Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Ta bort den virtuella datorn

Låt oss nu ta bort själva den virtuella maskinen, eftersom vi redan har skapat en variabel $vm för motsvarande objekt. Nåväl, låt oss köra kommandot Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Ta bort nätverksgränssnittet och den offentliga IP-adressen

Vår virtuella dator har fortfarande ett (eller till och med flera) nätverksgränssnitt (NIC) - för att ta bort dem som onödiga, låt oss gå igenom egenskapen NetworkInterfaces vårt VM-objekt och ta bort NIC med kommandot Remove-AzNetworkInterface. Om det finns mer än ett nätverksgränssnitt använder vi en loop. Samtidigt kommer vi att kontrollera fastigheten för varje NIC IpConfiguration för att avgöra om gränssnittet har en offentlig IP-adress. Om en hittas tar vi bort den med kommandot Remove-AzPublicIpAddress.

Här är ett exempel på just sådan kod, där vi tittar igenom alla NIC i en slinga, tar bort dem och kontrollerar om det finns en publik IP. Om det finns, analysera sedan egenskapen PublicIpAddress, hitta namnet på motsvarande resurs efter ID och radera det:


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

Ta bort systemdisken

OS-disken är en blob, för vilken det finns ett kommando för att ta bort den Remove-AzStorageBlob - men innan du kör det måste du ställa in de nödvändiga värdena för dess parametrar. För att göra detta måste du i synnerhet få namnet på lagringsbehållaren som innehåller systemdisken och sedan skicka det till det här kommandot tillsammans med motsvarande lagringskonto.

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

Ta bort System Disk Status Blob

För att göra detta, som du antagligen redan gissat, tar vi lagringsbehållaren i vilken den här skivan är lagrad, och antyder att klumpen i slutet innehåller status, skicka motsvarande parametrar till kommandot delete Remove-AzStorageBlob:

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

Och slutligen tar vi bort datadiskarna

Vår virtuella dator kunde fortfarande ha diskar med data som var anslutna till den. Om de inte behövs tar vi bort dem också. Låt oss analysera det först StorageProfile vår VM och hitta fastigheten Uri. Om det är flera diskar organiserar vi en cykel enl URI. För varje URI hittar vi motsvarande lagringskonto med hjälp av Get-AzStorageAccount. Analysera sedan lagrings-URI för att extrahera det önskade blobnamnet och skicka det till raderingskommandot Remove-AzStorageBlob tillsammans med ett lagringskonto. Så här skulle det se ut i koden:

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

Och nu "vi har nått det lyckliga slutet!" Nu måste vi sätta ihop en enda helhet från alla dessa fragment. Den snälle författaren Adam Bertram träffade användarna halvvägs och gjorde det själv. Här är en länk till det sista manuset som heter Remove-AzrVirtualMachine.ps1:

GitHub

Jag hoppas att du tycker att dessa praktiska tips är användbara för att spara ansträngning, tid och pengar när du arbetar med virtuella Azure-datorer.

Källa: will.com

Lägg en kommentar