Modificando y eliminando Azure VMs utilizando PowerShell

Los ingenieros y administradores de TI automatizan con éxito diversas tareas utilizando PowerShell, no solo con infraestructuras locales, sino también con nubes, en particular Azure. Trabajar a través de PowerShell es en muchos casos mucho más conveniente y rápido que a través del portal de Azure. Gracias a la multiplataforma de PowerShell, se puede utilizar en cualquier sistema operativo.

No importa si trabaja con Ubuntu, Red Hat o Windows: PowerShell le ayudará a controlar los recursos en la nube. Utilizando el módulo Azure PowerShell, por ejemplo, se pueden especificar propiedades de máquinas virtuales.

En este artículo, veremos cómo utilizar PowerShell para cambiar el tamaño de una máquina virtual en la nube de Azure, así como para eliminar una VM y los objetos asociados.

Modificando y eliminando Azure VMs utilizando PowerShell

¡Importante! No olvide desinfectarse las manos con gel antes de comenzar a trabajar:

  • Necesitará el módulo Azure PowerShell Module — se puede descargar desde PowerShell Gallery con el comando Install-Module Az.
  • Necesita autenticarse en la nube de Azure donde está ejecutándose la máquina virtual, ejecutando el comando Connect-AzAccount.

Primero, crearemos un script que redimensione una VM de Azure. Abriremos VS Code y guardaremos un nuevo script de PowerShell con el nombre Resize-AzVirtualMachine.ps1 — en él iremos agregando fragmentos de código a lo largo del ejemplo.

Solicitamos los tamaños de VM disponibles

Antes de cambiar el tamaño de la VM, necesitamos averiguar qué tamaños son válidos para las máquinas virtuales en la nube de Azure. Para esto, debe ejecutar el comando Get-AzVMSize.

Entonces, para la máquina virtual devvm01 del grupo de recursos dev solicitamos todos los tamaños válidos:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(En tareas reales, por supuesto, en lugar de ResourceGroupName=dev y VMName=devvm01 especificará sus propios valores para esos parámetros.)

El comando devolverá una lista similar a esta:

Modificando y eliminando Azure VMs utilizando PowerShell

Estas son todas las opciones de tamaños que se pueden asignar a esta máquina virtual.

Redimensionando la máquina

Para el ejemplo, cambiará el tamaño a Standard_B1ls — que está en primer lugar en la lista anterior. (En tareas reales, por supuesto, usted elegirá el tamaño que necesite.)

  1. Primero, utilizando el comando Get-AzVM obtenemos información sobre nuestro objeto (la máquina virtual), guardándola en la variable $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Luego, de este objeto, tomamos la propiedad .HardwareProfile.VmSize y establecemos el nuevo valor deseado:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Y ahora simplemente ejecutamos el comando de actualización de la VM — Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Asegurémonos de que todo ha salido bien; para ello, volvemos a solicitar información sobre nuestro objeto y observamos la propiedad $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Si allí vemos Standard_B1ls — entonces todo está bien, el tamaño de la máquina ha cambiado. Podemos continuar y llevar el éxito más allá — redimensionar varias máquinas virtuales a la vez utilizando un array.

¿Y qué hay sobre la eliminación de máquinas virtuales en Azure?

Eliminar no es tan simple y directo como podría parecer. Hay que eliminar otros recursos asociados a esta máquina, incluyendo:

  • Contenedores de almacenamiento para diagnósticos de arranque (Boot diagnostics storage containers)
  • Interfaces de red
  • Direcciones IP públicas
  • El disco del sistema y el blob donde se almacena su estado
  • Discos de datos (data disks)

Por lo tanto, vamos a crear una función y la llamaremos Remove-AzrVirtualMachine — y eliminará no solo la máquina virtual de Azure, sino también todo lo mencionado anteriormente.

Sigamos el camino estándar y primero obtenemos nuestro objeto (VM) con el comando Get-AzVm. Por ejemplo, digamos que esta sera la máquina WINSRV19 del grupo de recursos MyTestVMs.

Guardaremos este objeto junto con todas sus propiedades en una variable $vm:

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

Eliminamos el contenedor con los archivos de diagnóstico de arranque

Al crear una máquina virtual en Azure, se le ofrece al usuario la opción de crear un contenedor para el almacenamiento de diagnósticos de arranque (boot diagnostics container), para que, en caso de problemas de arranque, haya algo a lo que recurrir para solucionar problemas. Sin embargo, al eliminar la máquina virtual, este contenedor continúa su existencia ahora sin propósito. Vamos a arreglar esta situación.

  1. Primero descubramos a cuál cuenta de almacenamiento pertenece este contenedor; para ello, necesitamos encontrar la propiedad storageUri en las profundidades del objeto DiagnosticsProfile de nuestra VM. Para ello, utilizo la siguiente expresión regular:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value
  2. Ahora necesitamos averiguar el nombre del contenedor, para lo cual obtendremos el ID de la VM con el 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. Luego obtenemos el nombre del grupo de recursos al que pertenece el contenedor:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. Y ahora tenemos todo lo necesario para eliminar el contenedor con el comando Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Eliminando la VM

Ahora eliminaremos la máquina virtual, afortunadamente ya hemos creado una variable $vm para el objeto correspondiente. Bien, ejecutemos el comando Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Eliminando la interfaz de red y la IP pública

Nuestra VM tiene una (o incluso varias) interfaces de red (NICs), para eliminarlas por innecesarias, revisaremos la propiedad NetworkInterfaces de nuestro objeto VM y eliminaremos la NIC con el comando Remove-AzNetworkInterface. En caso de que haya más de una interfaz de red, usaremos un ciclo. Además, para cada NIC verificaremos la propiedad IpConfiguration para ver si la interfaz tiene una dirección IP pública. Si se encuentra, la eliminaremos con el comando Remove-AzPublicIpAddress.

Aquí hay un ejemplo de tal código, donde recorremos todas las NICs en un ciclo, las eliminamos y verificamos si hay una IP pública. Si existe, extraemos la propiedad PublicIpAddress, obtenemos por ID el nombre del recurso correspondiente y lo eliminamos:


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

Eliminando el disco del sistema

El disco del SO es un blob, para eliminar el cual existe el comando Remove-AzStorageBlob — pero antes de ejecutarlo, será necesario establecer los valores requeridos para sus parámetros. Para ello, en particular, se necesita obtener el nombre del contenedor de almacenamiento que contiene el disco del sistema, y luego pasar eso a este comando junto con la cuenta de almacenamiento correspondiente.

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

Eliminando el Blob del estado del disco del sistema

Para ello, como probablemente ya has adivinado, tomamos el contenedor de almacenamiento en el que se encuentra este disco, y suponiendo que el blob al final contiene status, pasamos los parámetros correspondientes al comando de eliminación Remove-AzStorageBlob:

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

Y, por último, eliminamos los discos de datos

Nuestra máquina virtual podría tener discos de datos que se le han adjuntado. Si no son necesarios, también los eliminaremos. Primero, analizamos StorageProfile de nuestra máquina virtual y encontramos la propiedad Uri. Si hay varios discos, organizaremos un ciclo por URI. Para cada URI encontraremos la cuenta de almacenamiento correspondiente usando Get-AzStorageAccount. Luego analizamos el URI de almacenamiento para extraer el nombre del blob necesario y pasarlo al comando de eliminación Remove-AzStorageBlob junto con la cuenta de almacenamiento. Así es como se verá en el código:

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

Y así "hemos llegado a un final feliz!" Ahora, de todos estos fragmentos, necesitamos ensamblar un todo. El amable autor Adam Bertram se ha tomado la molestia de hacerlo por los usuarios. Aquí está el enlace al script final titulado Remove-AzrVirtualMachine.ps1:

→ GitHub

Espero que estos consejos prácticos te sean útiles para ahorrar esfuerzo, tiempo y recursos al trabajar con máquinas virtuales de Azure.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster