Modificare ed eliminare le VM di Azure utilizzando PowerShell

Con PowerShell, ingegneri e amministratori IT automatizzano con successo varie operazioni non solo su infrastrutture on-premises, ma anche su quelle cloud, in particolare su Azure. Lavorare tramite PowerShell è, in molti casi, molto più comodo e veloce rispetto all'utilizzo del portale Azure. Grazie alla sua natura cross-platform, PowerShell può essere utilizzato su qualsiasi sistema operativo.

Che tu stia lavorando con Ubuntu, Red Hat o Windows, PowerShell ti aiuterà a gestire le risorse cloud. Utilizzando il modulo Azure PowerShell, ad esempio, puoi configurare qualsiasi proprietà delle macchine virtuali.

In questo articolo vedremo come utilizzare PowerShell per ridimensionare una VM nel cloud Azure e per eliminare una VM e gli oggetti a essa associati.

Modificare ed eliminare le VM di Azure utilizzando PowerShell

Attenzione! Non dimenticare di igienizzarti le mani prima di iniziare a lavorare:

  • Avrai bisogno del modulo Azure PowerShell Module — puoi scaricarlo dal PowerShell Gallery con il comando Install-Module Az.
  • Devi autenticarti nel cloud Azure dove si trova la macchina virtuale, eseguendo il comando Connect-AzAccount.

Per iniziare, creiamo uno script che ridimensiona una VM di Azure. Apriamo VS Code e salviamo un nuovo script PowerShell con il nome Resize-AzVirtualMachine.ps1 — in questo esempio aggiungeremo dei pezzi di codice.

Richiediamo le dimensioni disponibili delle VM

Prima di cambiare dimensione alla VM, è necessario scoprire quali sono le dimensioni consentite per le macchine virtuali nel cloud Azure. A tal fine, eseguire il comando Get-AzVMSize.

Quindi, per la macchina virtuale devvm01 del gruppo di risorse dev richiediamo tutte le dimensioni consentite:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Nei casi reali, ovviamente, invece di ResourceGroupName=dev e VMName=devvm01 indicherete i vostri valori per questi parametri.)

Il comando restituirà un elenco simile al seguente:

Modificare ed eliminare le VM di Azure utilizzando PowerShell

Queste sono tutte le possibili dimensioni che possono essere impostate per questa macchina virtuale.

Modifichiamo la macchina

Per esempio, cambiamo dimensione a Standard_B1ls — è il primo nella lista qui sopra. (Nei casi reali, naturalmente, sceglierete qualsiasi dimensione di vostro interesse.)

  1. Iniziamo con il comando Get-AzVM otteniamo informazioni sul nostro oggetto (macchina virtuale), conservandole in una variabile $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Dopo, per questo oggetto prendiamo la proprietà .HardwareProfile.VmSize e impostiamo il nuovo valore richiesto:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. E ora semplicemente eseguiamo il comando per aggiornare la VM — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Assicuriamoci che sia andato tutto bene — per fare ciò, chiediamo di nuovo informazioni sul nostro oggetto e osserviamo la proprietà $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Se lì vediamo Standard_B1ls — significa che tutto è a posto, la dimensione della macchina è stata modificata. Possiamo andare avanti e continuare il successo — ridimensionando immediatamente più VM utilizzando un array.

E per quanto riguarda la rimozione della VM in Azure?

La rimozione non è così semplice e diretta come può sembrare. Infatti, è necessario eliminare anche una serie di risorse associate a questa macchina, tra cui:

  • Contenitori di archiviazione per la diagnostica di avvio (Boot diagnostics storage containers)
  • Interfacce di rete
  • Indirizzi IP pubblici
  • Disco di sistema e blob che ne memorizza lo stato
  • Dischi dei dati (data disks)

Pertanto, creeremo una funzione e la chiameremo Remove-AzrVirtualMachine — e questa eliminerà non solo la VM di Azure, ma anche tutte le suddette risorse.

Seguiamo il percorso standard e iniziamo a ottenere il nostro oggetto (VM) utilizzando il comando Get-AzVm. Per esempio, supponiamo che sia la macchina WINSRV19 del gruppo di risorse MyTestVMs.

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

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

Rimuoviamo il contenitore con i file di diagnostica di avvio

Creando una VM in Azure, all'utente viene anche proposto di creare un contenitore per la memorizzazione della diagnostica di avvio (boot diagnostics container), per avere un riferimento in caso di problemi di avvio. Tuttavia, quando la VM viene eliminata, questo contenitore continua a esistere senza senso. Risolviamo questa situazione.

  1. Innanzitutto, scopriamo a quale account di storage appartiene questo contenitore: dobbiamo trovare la proprietà storageUri all'interno dell'oggetto DiagnosticsProfile della nostra VM. Per farlo, utilizzo la seguente espressione regolare:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Ora dobbiamo scoprire il nome del contenitore, per fare ciò dobbiamo ottenere l'ID della VM tramite 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. Poi 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 il necessario 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

Eliminiamo la VM

Ora elimineremo effettivamente la macchina virtuale, dato che abbiamo già creato la variabile $vm per l'oggetto corrispondente. Bene, eseguiamo il comando Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Eliminiamo l'interfaccia di rete e l'indirizzo IP pubblico

La nostra VM potrebbe avere una (o anche più) interfacce di rete (NIC) — per eliminarle non più necessarie, controlleremo la proprietà NetworkInterfaces del nostro oggetto VM e elimineremo la NIC con il comando Remove-AzNetworkInterface. Nel caso in cui ci siano più interfacce di rete, utilizziamo un ciclo. Per ogni NIC verificheremo anche la proprietà IpConfiguration per vedere se l'interfaccia ha un indirizzo IP pubblico. Se ne troviamo uno, lo elimineremo con il comando Remove-AzPublicIpAddress.

Ecco un esempio di codice in cui, in un ciclo, esaminiamo tutte le NIC, le eliminiamo e controlliamo se c'è un IP pubblico. Se sì, analizziamo la proprietà PublicIpAddress, otteniamo il nome della risorsa corrispondente tramite l'ID e lo rimuoviamo:


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

Rimuoviamo il disco di sistema

Il disco del sistema operativo è un blob, per rimuovere il quale esiste un comando Remove-AzStorageBlob — ma prima di eseguirlo, è necessario impostare i valori richiesti per i suoi parametri. A questo fine, è necessario ottenere il nome del contenitore di archiviazione che contiene il disco di sistema, e quindi passarlo a questo comando insieme al corrispondente account di archiviazione.

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

Rimuoviamo il Blob dello stato del disco di sistema

Per fare ciò, come sicuramente avrete già indovinato, prendiamo il contenitore di archiviazione in cui è memorizzato questo disco, e, presupponendo che il blob alla fine contenga status, passiamo i parametri corrispondenti al comando di eliminazione Remove-AzStorageBlob:

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

E, infine, eliminiamo i dischi dati

La nostra VM potrebbe avere dischi dati che erano stati attaccati ad essa. Se non sono necessari, eliminiamo anche quelli. Prima di tutto, analizziamo StorageProfile della nostra VM e troviamo la proprietà Uri. Se ci sono più dischi, organizziamo un ciclo su URI. Per ogni URI, troveremo l'account di storage corrispondente usando Get-AzStorageAccount. Poi analizziamo l'URI di storage per estrarre il nome del blob necessario e passarlo al comando di eliminazione Remove-AzStorageBlob insieme all'account di storage. Ecco come apparirà 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 alla felice conclusione!” Ora dobbiamo raccogliere tutti questi frammenti in un tutto unico. Il simpatico autore Adam Bertram ha fatto un favore agli utenti realizzando tutto questo. Ecco il link allo script finale chiamato Remove-AzrVirtualMachine.ps1:

GitHub

Spero che questi consigli pratici ti siano utili per risparmiare energie, tempo e risorse nella gestione delle Azure VMs.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster