Modificación y eliminación de máquinas virtuales de Azure mediante PowerShell

Con PowerShell, los ingenieros y administradores de TI automatizan con éxito diversas tareas cuando trabajan no solo con infraestructuras locales, sino también con infraestructuras en la nube, en particular con Azure. En algunos casos, trabajar a través de PowerShell es mucho más cómodo y rápido que trabajar a través de Azure Portal. Gracias a su naturaleza multiplataforma, PowerShell se puede utilizar en cualquier sistema operativo.

Ya sea que esté ejecutando Ubuntu, Red Hat o Windows, PowerShell puede ayudarlo a controlar sus recursos en la nube. Usando el módulo PowerShell de Azure, por ejemplo, puede configurar cualquier propiedad de las máquinas virtuales.

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

Modificación y eliminación de máquinas virtuales de Azure mediante PowerShell

¡Importante! No olvide limpiarse las manos con desinfectante para prepararse para el trabajo:

  • Necesitarás un módulo Módulo Azure PowerShell - se puede descargar desde PowerShell Gallery con el comando Install-Module Az.
  • Debe autenticarse en la nube de Azure donde se ejecuta la máquina virtual ejecutando el comando Connect-AzAccount.

Primero, creemos un script que cambiará el tamaño de una máquina virtual de Azure. Abramos VS Code y guardemos un nuevo script de PowerShell llamado Cambiar tamaño-AzVirtualMachine.ps1 – le agregaremos fragmentos de código a medida que avance el ejemplo.

Solicitamos los tamaños de VM disponibles

Antes de cambiar el tamaño de la máquina virtual, debe averiguar cuáles son los tamaños aceptables para las máquinas virtuales en la nube de Azure. Para hacer esto necesitas ejecutar el comando. Get-AzVMSize.

Entonces para la máquina virtual devvm01 del grupo de recursos dev Solicitamos todos los tamaños posibles aceptables:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(En problemas reales, por supuesto, en lugar de Nombre del grupo de recursos = desarrollador и NombreVM=devvm01 especificará sus propios valores para estos parámetros).

El comando devolverá algo como esto:

Modificación y eliminación de máquinas virtuales de Azure mediante PowerShell

Estas son todas las opciones de tamaño posibles que se pueden configurar para una máquina virtual determinada.

Cambiemos el tamaño del auto

Por ejemplo, cambiaremos el tamaño a un nuevo tamaño. Estándar_B1ls - ocupa el primer lugar en la lista anterior. (En aplicaciones de la vida real, por supuesto, usted elige el tamaño que necesita).

  1. Primero usando el comando Get-AzVM obtenemos información sobre nuestro objeto (máquina virtual) almacenándolo en una variable $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Luego tomamos la propiedad de este objeto. .HardwareProfile.VmSize y establezca el nuevo valor deseado:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. Y ahora simplemente ejecutamos el comando de actualización de VM: Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Nos aseguramos de que todo haya ido bien; para ello, volvemos a solicitar información sobre nuestro objeto y examinamos la propiedad. $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Si vemos allí Estándar_B1ls - Eso significa que todo está en orden, se ha cambiado el tamaño del coche. Puede ir más allá y aprovechar su éxito cambiando el tamaño de varias máquinas virtuales a la vez utilizando una matriz.

¿Qué pasa con la eliminación de una máquina virtual en Azure?

Con la eliminación no todo es tan sencillo y directo como podría parecer. Después de todo, es necesario eliminar una serie de recursos asociados con esta máquina, incluidos:

  • Contenedores de almacenamiento de diagnóstico de arranque
  • Interfaces de red
  • Direcciones IP públicas
  • Disco del sistema y blob donde se almacena su estado
  • Discos de datos

Por lo tanto, crearemos una función y la llamaremos. Remove-AzrVirtualMachine - y eliminará no solo la máquina virtual de Azure, sino también todo lo anterior.

Seguimos el camino estándar y primero obtenemos nuestro objeto (VM) usando el comando Get-AzVm. Por ejemplo, que sea un coche. WINSRV19 del grupo de recursos MisTestVM.

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

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

Eliminación del contenedor con archivos de diagnóstico de arranque

Al crear una máquina virtual en Azure, también se le pide al usuario que cree un contenedor para almacenar los diagnósticos de arranque (contenedor de diagnóstico de arranque), de modo que si hay problemas con el arranque, haya algo a quien recurrir para solucionarlos. Sin embargo, cuando se elimina la VM, se deja que este contenedor continúe con su existencia ahora sin propósito. Arreglemos esta situación.

  1. Primero, averigüemos a qué cuenta de almacenamiento pertenece este contenedor; para ello necesitamos encontrar la propiedad storageUri en las entrañas del objeto DiagnosticsProfile nuestra máquina virtual. Para esto utilizo esta expresión regular:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Ahora necesita averiguar el nombre del contenedor y para ello necesita obtener el ID de la VM usando 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. A continuación, 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 que necesitamos 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 máquina virtual

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

$null = $vm | Remove-AzVM -Force

Eliminación de la interfaz de red y la dirección IP pública

Nuestra máquina virtual todavía tiene una (o incluso varias) interfaces de red (NIC); para eliminarlas por considerarlas innecesarias, revisemos la propiedad NetworkInterfaces nuestro objeto VM y eliminar la NIC con el comando Remove-AzNetworkInterface. En caso de que haya más de una interfaz de red, utilizamos un bucle. Al mismo tiempo, para cada NIC verificaremos la propiedad. IpConfiguration para determinar si la interfaz tiene una dirección IP pública. Si encontramos uno, lo eliminaremos con el comando Remove-AzPublicIpAddress.

A continuación se muestra un ejemplo de dicho código, donde revisamos todas las NIC en un bucle, las eliminamos y verificamos si hay una IP pública. Si es así, analice la propiedad. PublicIpAddress, busque el nombre del recurso correspondiente por ID y elimínelo:


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

Extracción del disco del sistema

El disco del sistema operativo es un blob, para el cual existe un comando para eliminarlo. Remove-AzStorageBlob - pero antes de ejecutarlo, deberá establecer los valores requeridos para sus parámetros. Para hacer esto, en particular, necesita obtener el nombre del contenedor de almacenamiento que contiene el disco del sistema y luego pasarlo 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]

Eliminación del blob de estado del disco del sistema

Para hacer esto, como probablemente ya habrás adivinado, tomamos el contenedor de almacenamiento en el que está almacenado este disco y, lo que implica que el blob al final contiene status, pase 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 retiramos los discos de datos.

Nuestra máquina virtual aún podría tener discos con datos adjuntos. Si no son necesarios, también los eliminaremos. Analicémoslo primero StorageProfile nuestra VM y encontrar la propiedad Uri. Si hay varios discos, organizamos un ciclo según URI. Para cada URI, encontraremos la cuenta de almacenamiento correspondiente usando Get-AzStorageAccount. Luego, analice el URI de almacenamiento para extraer el nombre del blob deseado y páselo al comando de eliminación. Remove-AzStorageBlob junto con una cuenta de almacenamiento. Así es como se vería 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 ahora “¡hemos llegado al final feliz!” Ahora necesitamos ensamblar un todo único a partir de todos estos fragmentos. El amable autor Adam Bertram se encontró con los usuarios y lo hizo él mismo. Aquí hay un enlace al script final llamado Quitar-AzrVirtualMachine.ps1:

GitHub

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

Fuente: habr.com

Añadir un comentario