Azure-VM's wijzigen en verwijderen met PowerShell

Met behulp van PowerShell kunnen ingenieurs en IT-beheerders met succes verschillende taken automatiseren wanneer ze niet alleen met on-premises werken, maar ook met cloudinfrastructuren, in het bijzonder met Azure. In sommige gevallen is het werken via PowerShell veel handiger en sneller dan het werken via de Azure portal. Dankzij het platformonafhankelijke karakter kan PowerShell op elk besturingssysteem worden gebruikt.

Of u nu Ubuntu, Red Hat of Windows gebruikt, PowerShell kan u helpen uw cloudbronnen te beheren. Gebruik van de module Azure PowerShellU kunt bijvoorbeeld alle eigenschappen van virtuele machines instellen.

In dit artikel bekijken we hoe u PowerShell kunt gebruiken om het formaat van een virtuele machine in de Azure-cloud te wijzigen, en om een ​​virtuele machine en de bijbehorende objecten te verwijderen.

Azure-VM's wijzigen en verwijderen met PowerShell

Belangrijk! Vergeet niet uw handen af ​​te vegen met een ontsmettingsmiddel ter voorbereiding op het werk:

  • Je hebt een module nodig Azure PowerShell-module - het kan worden gedownload van PowerShell Gallery met de opdracht Install-Module Az.
  • U moet zich verifiëren in de Azure-cloud waar de virtuele machine wordt uitgevoerd door de opdracht uit te voeren Connect-AzAccount.

Laten we eerst een script maken waarmee de grootte van een Azure-VM wordt aangepast. Laten we VS Code openen en een nieuw PowerShell-script opslaan met de naam Formaat wijzigen-AzVirtualMachine.ps1 — we zullen er stukjes code aan toevoegen naarmate het voorbeeld vordert.

Wij vragen de beschikbare VM-groottes op

Voordat u de VM-grootte wijzigt, moet u weten wat de acceptabele grootten zijn voor virtuele machines in de Azure-cloud. Om dit te doen, moet u de opdracht uitvoeren Get-AzVMSize.

Dus voor de virtuele machine devvm01 uit de resourcegroep dev Wij vragen alle mogelijke acceptabele maten:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Bij echte problemen natuurlijk, in plaats van ResourceGroupName=ontwikkelaar и VMNaam=devvm01 u specificeert uw eigen waarden voor deze parameters.)

Het commando retourneert ongeveer dit:

Azure-VM's wijzigen en verwijderen met PowerShell

Dit zijn allemaal mogelijke grootte-opties die voor een bepaalde virtuele machine kunnen worden ingesteld.

Laten we de auto groter maken

We passen het formaat bijvoorbeeld aan naar een nieuw formaat Standaard_B1ls - hij staat op de eerste plaats op de bovenstaande lijst. (In echte toepassingen kiest u natuurlijk de maat die u nodig heeft.)

  1. Gebruik eerst het commando Get-AzVM we krijgen informatie over ons object (virtuele machine) door het in een variabele op te slaan $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Vervolgens nemen we de eigendom van dit object .HardwareProfile.VmSize en stel de gewenste nieuwe waarde in:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. En nu voeren we eenvoudigweg de opdracht VM-update uit - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Wij zorgen ervoor dat alles goed is gegaan. Hiervoor vragen wij opnieuw informatie op over ons object en bekijken we de woning $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Als we het daar zien Standaard_B1ls - dat betekent dat alles in orde is, de grootte van de auto is gewijzigd. U kunt nog verder gaan en voortbouwen op uw succes door de grootte van meerdere VM's tegelijk aan te passen met behulp van een array.

Hoe zit het met het verwijderen van een virtuele machine in Azure?

Met verwijdering is niet alles zo eenvoudig en duidelijk als het lijkt. Het is immers noodzakelijk om een ​​aantal bronnen te verwijderen die aan deze machine zijn gekoppeld, waaronder:

  • Opslagcontainers voor diagnostische gegevens over opstarten
  • Netwerk interfaces
  • Openbare IP-adressen
  • Systeemschijf en blob waar de status ervan wordt opgeslagen
  • Gegevensschijven

Daarom zullen we een functie maken en deze aanroepen Remove-AzrVirtualMachine - en het zal niet alleen Azure VM verwijderen, maar ook al het bovenstaande.

We gaan op de standaardmanier en halen eerst ons object (VM) op met behulp van de opdracht Get-AzVm. Laat het bijvoorbeeld een auto zijn WINSRV19 uit de resourcegroep MijnTestVM's.

Laten we dit object samen met al zijn eigenschappen opslaan in een variabele $vm:

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

De container met diagnostische opstartbestanden verwijderen

Bij het maken van een VM in Azure wordt de gebruiker ook gevraagd om een ​​container te maken voor het opslaan van opstartdiagnostiek (boot diagnostics container), zodat als er problemen zijn met het opstarten, er iets is waar hij terecht kan voor het oplossen van problemen. Wanneer de VM echter wordt verwijderd, kan deze container zijn nu doelloze bestaan ​​voortzetten. Laten we deze situatie oplossen.

  1. Laten we eerst eens kijken tot welk opslagaccount deze container behoort. Hiervoor moeten we de eigenschap vinden storageUri in de ingewanden van het object DiagnosticsProfile onze VM. Om dit te doen gebruik ik deze reguliere expressie:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Nu moet je de naam van de container achterhalen, en hiervoor moet je de VM-ID ophalen met behulp van de opdracht 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. Vervolgens krijgen we de naam van de resourcegroep waartoe de container behoort:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. En nu hebben we alles wat we nodig hebben om de container met de opdracht te verwijderen Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

De virtuele machine verwijderen

Laten we nu de virtuele machine zelf verwijderen, omdat we al een variabele hebben gemaakt $vm voor het bijbehorende object. Laten we het commando uitvoeren Remove-AzVm:

$null = $vm | Remove-AzVM -Force

De netwerkinterface en het openbare IP-adres verwijderen

Onze VM heeft nog steeds één (of zelfs meerdere) netwerkinterfaces (NIC's). Om ze als onnodig te verwijderen, gaan we door de eigenschap NetworkInterfaces ons VM-object en verwijder de NIC met de opdracht Remove-AzNetworkInterface. Als er meer dan één netwerkinterface is, gebruiken we een lus. Tegelijkertijd zullen we voor elke NIC de eigendom controleren IpConfiguration om te bepalen of de interface een openbaar IP-adres heeft. Als er een wordt gevonden, verwijderen we deze met het commando Remove-AzPublicIpAddress.

Hier is een voorbeeld van zo'n code, waarbij we alle NIC's in een lus bekijken, ze verwijderen en controleren of er een openbaar IP-adres is. Als dat het geval is, parseert u de eigenschap PublicIpAddress, zoek de naam van de overeenkomstige bron op ID en verwijder deze:


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

De systeemschijf verwijderen

De besturingssysteemschijf is een blob, waarvoor een opdracht bestaat om deze te verwijderen Remove-AzStorageBlob - maar voordat u het uitvoert, moet u de vereiste waarden voor de parameters instellen. Om dit in het bijzonder te doen, moet u de naam ophalen van de opslagcontainer die de systeemschijf bevat, en deze vervolgens samen met het bijbehorende opslagaccount doorgeven aan deze opdracht.

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

De statusblob van de systeemschijf verwijderen

Om dit te doen, zoals je waarschijnlijk al geraden had, nemen we de opslagcontainer waarin deze schijf is opgeslagen, en, wat impliceert dat de blob aan het einde status, geef de overeenkomstige parameters door aan de verwijderopdracht Remove-AzStorageBlob:

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

En ten slotte verwijderen we de gegevensschijven

Onze VM kan nog steeds schijven hebben met daaraan gekoppelde gegevens. Als ze niet nodig zijn, verwijderen we ze ook. Laten we het eerst analyseren StorageProfile onze VM en vind de woning Uri. Als er meerdere schijven zijn, organiseren we een cyclus volgens URI. Voor elke URI vinden we het bijbehorende opslagaccount met behulp van Get-AzStorageAccount. Parseer vervolgens de opslag-URI om de gewenste blobnaam te extraheren en deze door te geven aan de verwijderopdracht Remove-AzStorageBlob samen met een opslagaccount. Dit is hoe het er in code uit zou zien:

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

En nu “hebben we het gelukkige einde bereikt!” Nu moeten we uit al deze fragmenten één geheel samenstellen. De vriendelijke auteur Adam Bertram ontmoette de gebruikers halverwege en deed het zelf. Hier is een link naar het uiteindelijke script genaamd Verwijder-AzrVirtualMachine.ps1:

GitHub

Ik hoop dat u deze praktische tips nuttig vindt om u moeite, tijd en geld te besparen bij het werken met Azure VM's.

Bron: www.habr.com

Voeg een reactie