Ändra och ta bort Azure VMs med PowerShell

Med PowerShell kan ingenjörer och IT-administratörer framgÄngsrikt automatisera olika uppgifter i arbetet med bÄde lokala och molninfrastrukturer, sÀrskilt med Azure. Att arbeta via PowerShell Àr i mÄnga fall bÄde enklare och snabbare Àn via Azure-portalen. Tack vare PowerShell:s plattformsoberoende kan det anvÀndas för alla operativsystem.

Oavsett om du arbetar med Ubuntu, Red Hat eller Windows — PowerShell hjĂ€lper till att kontrollera molnresurser. Genom att anvĂ€nda modulen Azure PowerShellkan du till exempel stĂ€lla in alla egenskaper för virtuella maskiner.

I den hÀr artikeln gÄr vi igenom hur man anvÀnder PowerShell för att Àndra storleken pÄ en VM i molnet Azure samt för att ta bort en VM och associerade objekt.

Ändra och ta bort Azure VMs med PowerShell

Viktigt! Glöm inte att desinfektera hÀnderna innan du börjar arbeta:

  • Du behöver modulen Azure PowerShell Module — den kan laddas ner frĂ„n PowerShell Gallery med kommandot Install-Module Az.
  • Du mĂ„ste autentisera dig i molnet Azure dĂ€r den virtuella maskinen körs genom att köra kommandot Connect-AzAccount.

Först skapar vi ett skript som Ă€ndrar storleken pĂ„ Azure VM. Vi öppnar VS Code och sparar ett nytt PowerShell-skript med namnet Resize-AzVirtualMachine.ps1 — i det kommer vi under exempelns gĂ„ng att lĂ€gga till kodstycken.

FrÄga de tillgÀngliga storlekarna för VM

Innan du byter storlek pÄ VM:n mÄste du ta reda pÄ vilka storlekar som Àr tillÄtna för virtuella maskiner i molnet Azure. 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 frÄgar vi om alla möjliga tillÄtna storlekar:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(I verkliga uppgifter kommer du naturligtvis att ange dina egna vÀrden för dessa parametrar i stÀllet för ResourceGroupName=dev och VMName=devvm01 ).

Kommandot kommer att returnera ungefÀr följande lista:

Ändra och ta bort Azure VMs med PowerShell

Detta Àr alla möjliga storlekar som kan anges för denna virtuella maskin.

Ändra storlek pĂ„ maskinen

Som exempel kommer vi att Ă€ndra storlek till den nya storleken Standard_B1ls — den ligger först pĂ„ listan ovan. (I verkliga uppgifter kommer du naturligtvis att vĂ€lja vilken storlek som helst du behöver.)

  1. Först fÄr vi information om vÄrt objekt (den virtuella maskinen) med kommandot Get-AzVM och sparar den i variabeln $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. DÀrefter hÀmtar vi egenskapen för detta objekt .HardwareProfile.VmSize och anger det nya vÀrdet:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Och nu utför vi helt enkelt kommandot för att uppdatera VM:n — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Vi verifierar att allt har gÄtt bra - för detta frÄgar vi Äterigen om informationen om vÄrt objekt och tittar pÄ egenskapen $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Om vi ser dĂ€r Standard_B1ls — betyder det att allt Ă€r i ordning, maskinstorleken har Ă€ndrats. Vi kan gĂ„ vidare och fortsĂ€tta framgĂ„ngen - Ă€ndra storlek pĂ„ flera VMer pĂ„ en gĂ„ng genom att anvĂ€nda en array.

Men vad sÀgs om att ta bort VMs i Azure?

Att ta bort Àr inte sÄ enkelt och rakt pÄ som det kan verka. Du mÄste ta bort flera resurser som Àr kopplade till denna maskin, inklusive:

  • LagringsbehĂ„llare för bootdiagnostik
  • NĂ€tverksgrĂ€nssnitt
  • Publika 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 den kommer att ta bort inte bara Azure VM, utan Ă€ven allt ovanstĂ„ende.

Vi gÄr den standardvÀgen och börjar med att hÀmta vÄrt objekt (VM) med kommandot Get-AzVm. För exemplet lÄt oss sÀga att detta Àr maskinen WINSRV19 frÄn resursgruppen MyTestVMs.

Vi sparar detta objekt med alla dess egenskaper i en variabel $vm:

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

Vi tar bort behÄllaren med bootdiagnostikfiler

Vid skapande av VM i Azure erbjuds anvÀndaren ocksÄ att skapa en behÄllare för lagring av bootdiagnostik, för att ha nÄgot att vÀnda sig till för felsökning vid uppstartsproblem. Men nÀr VM tas bort, kvarstÄr denna behÄllare och fortsÀtter sin nu meningslösa existens. LÄt oss rÀtta till detta.

  1. Först tar vi reda pÄ vilken lagringskonto denna behÄllare tillhör - för detta mÄste vi leta upp egenskapen storageUri inuti objektet DiagnosticsProfile av vÄr VM. För detta anvÀnder jag ett sÄdant reguljÀrt uttryck:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Nu behöver vi fÄ reda pÄ namnet pÄ behÄllaren, och för detta behöver vi fÄ VM ID 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 som behövs för att ta bort containern med kommandot Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Tar bort VM

Nu tar vi bort den virtuella maskinen, eftersom vi redan har skapat en variabel $vm för den motsvarande objektet. LÄt oss köra kommandot Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Tar bort nÀtverksgrÀnssnittet och den offentliga IP-adressen

VĂ„r VM har minst ett (eller flera) nĂ€tverksgrĂ€nssnitt (NICs) — för att ta bort dem som inte lĂ€ngre behövs, gĂ„r vi igenom egenskapen NetworkInterfaces hos vĂ„rt VM-objekt och tar bort NIC med kommandot Remove-AzNetworkInterface. Om det finns fler Ă€n ett nĂ€tverksgrĂ€nssnitt anvĂ€nder vi en loop. Samtidigt kontrollerar vi varje NIC:s egenskap IpConfiguration för att se om grĂ€nssnittet har en offentlig IP-adress. Om en sĂ„dan upptĂ€cks tar vi bort den med kommandot Remove-AzPublicIpAddress.

HÀr Àr ett exempel pÄ sÄdana kod, dÀr vi i en loop gÄr igenom alla NICs, tar bort dem och kontrollerar om det finns en offentlig IP. Om det finns, extraherar vi egenskapen PublicIpAddress, hÀmtar namnet pÄ motsvarande resurs via ID och tar bort den:


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

Tar bort systemdisken

Disken för operativsystemet Ă€r ett blob, och för att ta bort det finns det ett kommando Remove-AzStorageBlob — men innan vi kan köra det mĂ„ste vi ange de nödvĂ€ndiga vĂ€rdena för dess parametrar. För detta mĂ„ste vi bland annat hĂ€mta namnet pĂ„ lagringscontainern som innehĂ„ller systemdisken, och sedan vidarebefordra det till kommandot tillsammans med det motsvarande lagringskontot.

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

Tar bort blob-statusen för systemdisken

För detta, som du kanske redan har gissat, tar vi lagringscontainern dÀr denna disk finns, och antaget att blobben i slutet innehÄller status, vidarebefordrar vi motsvarande parametrar till borttagningskommandot Remove-AzStorageBlob:

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

Och slutligen, tar vi bort datadiskarna

VÄr VM kan ha kvar datadiskar som var kopplade till den. Om de inte Àr nödvÀndiga, lÄt oss ta bort dem ocksÄ. LÄt oss börja med att parsa StorageProfile vÄr VM och hitta egenskapen Uri. Om det finns flera diskars, organiserar vi en slinga för URI. För varje URI, kommer vi att hitta motsvarande lagringskonto med hjÀlp av Get-AzStorageAccount. Sedan parser vi storage URI för att hÀmta namnet pÄ blobben och överföra det till borttagningskommandot Remove-AzStorageBlob tillsammans med lagringskontot. 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 vi har "nÄtt det lyckliga slutet!" Nu mÄste vi sÀtta ihop alla dessa bitar till en helhet. Den vÀnliga författaren Adam Bertram har tagit sig tid att göra detta sjÀlv. HÀr Àr lÀnken till det slutliga skriptet med namnet Remove-AzrVirtualMachine.ps1:

→ GitHub

Jag hoppas att dessa praktiska tips kommer att vara till hjÀlp för att spara kraft, tid och resurser nÀr man arbetar med Azure VMs.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster