Modifica ed eliminazione di macchine virtuali di Azure tramite PowerShell

Utilizzando PowerShell, ingegneri e amministratori IT automatizzano con successo varie attività quando lavorano non solo con infrastrutture locali, ma anche con infrastrutture cloud, in particolare con Azure. In alcuni casi, lavorare tramite PowerShell è molto più comodo e veloce rispetto al portale di Azure. Grazie alla sua natura multipiattaforma, PowerShell può essere utilizzato su qualsiasi sistema operativo.

Che tu utilizzi Ubuntu, Red Hat o Windows, PowerShell può aiutarti a controllare le tue risorse cloud. Utilizzando il modulo Azure PowerShell, ad esempio, puoi impostare qualsiasi proprietà delle macchine virtuali.

In questo articolo vedremo come utilizzare PowerShell per ridimensionare una macchina virtuale nel cloud di Azure ed eliminare una macchina virtuale e i relativi oggetti associati.

Modifica ed eliminazione di macchine virtuali di Azure tramite PowerShell

Importante! Non dimenticare di asciugarti le mani con un disinfettante per prepararti al lavoro:

  • Avrai bisogno di un modulo Modulo di Azure PowerShell - può essere scaricato da PowerShell Gallery con il comando Install-Module Az.
  • È necessario autenticarsi nel cloud di Azure in cui è in esecuzione la macchina virtuale eseguendo il comando Connect-AzAccount.

Innanzitutto, creiamo uno script che ridimensionerà una VM di Azure. Apriamo VS Code e salviamo un nuovo script PowerShell chiamato Ridimensiona-AzVirtualMachine.ps1 — aggiungeremo pezzi di codice man mano che l'esempio procede.

Richiediamo le dimensioni delle VM disponibili

Prima di modificare la dimensione della macchina virtuale, è necessario scoprire quali sono le dimensioni accettabili per le macchine virtuali nel cloud di Azure. Per fare ciò è necessario eseguire il comando Get-AzVMSize.

Quindi per la macchina virtuale devvm01 dal gruppo di risorse dev Richiediamo tutte le possibili dimensioni accettabili:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Nei problemi reali, ovviamente, invece di NomeGruppoRisorse=dev и NomeVM=devvm01 specificherai i tuoi valori per questi parametri.)

Il comando restituirà qualcosa del genere:

Modifica ed eliminazione di macchine virtuali di Azure tramite PowerShell

Queste sono tutte le possibili opzioni di dimensione che possono essere impostate per una determinata macchina virtuale.

Ridimensioniamo l'auto

Ad esempio, ridimensioneremo a una nuova dimensione Standard_B1ls - è al primo posto nell'elenco sopra. (Nelle applicazioni della vita reale, ovviamente, scegli la dimensione di cui hai bisogno.)

  1. Prima usando il comando Get-AzVM otteniamo informazioni sul nostro oggetto (macchina virtuale) memorizzandolo in una variabile $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Quindi prendiamo la proprietà da questo oggetto .HardwareProfile.VmSize e impostare il nuovo valore desiderato:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. E ora eseguiamo semplicemente il comando di aggiornamento della VM: Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Ci assicuriamo che tutto sia andato bene: per fare questo chiediamo nuovamente informazioni sul nostro oggetto e guardiamo la proprietà $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Se vediamo lì Standard_B1ls - ciò significa che è tutto in ordine, le dimensioni dell'auto sono state modificate. Puoi andare oltre e consolidare il tuo successo ridimensionando più VM contemporaneamente utilizzando un array.

Che ne dici di eliminare una VM in Azure?

Con la cancellazione, non tutto è così semplice e diretto come potrebbe sembrare. Dopotutto, è necessario rimuovere una serie di risorse associate a questa macchina, tra cui:

  • Contenitori di archiviazione per la diagnostica di avvio
  • Interfacce di rete
  • Indirizzi IP pubblici
  • Disco e BLOB di sistema in cui è archiviato il relativo stato
  • Dischi dati

Pertanto, creeremo una funzione e la chiameremo Remove-AzrVirtualMachine - ed eliminerà non solo la VM di Azure, ma anche tutto quanto sopra.

Seguiamo la strada standard e prima otteniamo il nostro oggetto (VM) usando il comando Get-AzVm. Ad esempio, lascia che sia un'auto WINSRV19 dal gruppo di risorse MyTestVM.

Salviamo questo oggetto insieme a tutte le sue proprietà in una variabile $vm:

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

Rimozione del contenitore con file di diagnostica di avvio

Quando si crea una VM in Azure, all'utente viene anche chiesto di creare un contenitore per archiviare la diagnostica di avvio (boot diagnostics container), in modo che se si verificano problemi con l'avvio, ci sia qualcosa a cui rivolgersi per la risoluzione dei problemi. Tuttavia, quando la VM viene eliminata, questo contenitore viene lasciato continuare la sua esistenza ormai senza scopo. Risolviamo questa situazione.

  1. Innanzitutto, scopriamo a quale account di archiviazione appartiene questo contenitore: per questo dobbiamo trovare la proprietà storageUri nelle viscere dell'oggetto DiagnosticsProfile la nostra VM. Per questo utilizzo questa espressione regolare:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Ora devi scoprire il nome del contenitore e per questo devi ottenere l'ID della VM utilizzando il comando 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. Successivamente, otteniamo il nome del gruppo di risorse a cui appartiene il contenitore:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. E ora abbiamo tutto ciò che ci serve per eliminare il contenitore con il comando Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Rimozione della VM

Ora eliminiamo la macchina virtuale stessa, poiché abbiamo già creato una variabile $vm per l'oggetto corrispondente. Bene, eseguiamo il comando Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Rimozione dell'interfaccia di rete e dell'indirizzo IP pubblico

La nostra VM ha ancora una (o anche più) interfacce di rete (NIC): per rimuoverle in quanto non necessarie, esaminiamo la proprietà NetworkInterfaces il nostro oggetto VM ed elimina la scheda NIC con il comando Remove-AzNetworkInterface. Nel caso in cui sia presente più di un'interfaccia di rete, utilizziamo un loop. Allo stesso tempo, per ogni NIC controlleremo la proprietà IpConfiguration per determinare se l'interfaccia ha un indirizzo IP pubblico. Se ne viene trovato uno, lo rimuoveremo con il comando Remove-AzPublicIpAddress.

Ecco un esempio proprio di questo codice, in cui esaminiamo tutte le NIC in un ciclo, le eliminiamo e controlliamo se esiste un IP pubblico. Se c'è, analizza la proprietà PublicIpAddress, trova il nome della risorsa corrispondente per ID ed eliminala:


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

Rimozione del disco di sistema

Il disco del sistema operativo è un BLOB, per il quale esiste un comando per eliminarlo Remove-AzStorageBlob - ma prima di eseguirlo dovrai impostare i valori richiesti per i suoi parametri. Per fare ciò, in particolare, è necessario ottenere il nome del contenitore di archiviazione contenente il disco di sistema, per poi passarlo a questo comando insieme allo storage account corrispondente.

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

Rimozione del BLOB di stato del disco di sistema

Per fare ciò, come probabilmente hai già intuito, prendiamo il contenitore di archiviazione in cui è archiviato questo disco e, implicando che il blob alla fine contenga status, passare i parametri corrispondenti al comando delete Remove-AzStorageBlob:

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

E infine, rimuoviamo i dischi dati

La nostra VM potrebbe ancora avere dischi con dati ad essa collegati. Se non sono necessari, elimineremo anche quelli. Analizziamolo prima StorageProfile la nostra VM e trova la proprietà Uri. Se sono presenti più dischi, organizziamo un ciclo in base URI. Per ogni URI troveremo l'account di archiviazione corrispondente utilizzando Get-AzStorageAccount. Analizzare quindi l'URI di archiviazione per estrarre il nome del BLOB desiderato e passarlo al comando delete Remove-AzStorageBlob insieme a un account di archiviazione. Questo è come apparirebbe nel codice:

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

E ora “siamo arrivati ​​al lieto fine!” Ora dobbiamo assemblare un unico insieme da tutti questi frammenti. Il gentile autore Adam Bertram è andato incontro agli utenti a metà strada e lo ha fatto lui stesso. Ecco un collegamento allo script finale chiamato Rimuovere-AzrVirtualMachine.ps1:

GitHub

Mi auguro che questi suggerimenti pratici ti siano utili per risparmiare fatica, tempo e denaro quando lavori con le VM di Azure.

Fonte: habr.com

Aggiungi un commento