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

Usando PowerShell, os enxeñeiros e os administradores de TI automatizan con éxito varias tarefas cando traballan non só con infraestruturas locais, senón tamén con infraestruturas na nube, en particular con Azure. Nalgúns casos, traballar a través de PowerShell é moito máis cómodo e rápido que traballar a través do portal de Azure. Grazas á súa natureza multiplataforma, PowerShell pódese usar en calquera sistema operativo.

Tanto se estás executando Ubuntu, Red Hat ou Windows, PowerShell pode axudarche a controlar os teus recursos na nube. Usando o módulo Azure PowerShell, por exemplo, pode definir calquera propiedade das máquinas virtuais.

Neste artigo, veremos como pode usar PowerShell para cambiar o tamaño dunha máquina virtual na nube de Azure, así como eliminar unha máquina virtual e os seus obxectos asociados.

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

Importante! Non esquezas lavar as mans con desinfectante para prepararte para o traballo:

  • Necesitarás un módulo Módulo Azure PowerShell - pódese descargar da Galería PowerShell co comando Install-Module Az.
  • Debe autenticarse na nube de Azure onde se está a executar a máquina virtual executando o comando Connect-AzAccount.

Primeiro, imos crear un script que redimensionará unha máquina virtual de Azure. Abramos VS Code e gardemos un novo script de PowerShell chamado Resize-AzVirtualMachine.ps1 — engadirémoslle pezas de código a medida que avance o exemplo.

Solicitamos os tamaños de VM dispoñibles

Antes de cambiar o tamaño da máquina virtual, debes descubrir cales son os tamaños aceptables para as máquinas virtuais na nube de Azure. Para iso cómpre executar o comando Get-AzVMSize.

Entón, para a máquina virtual devvm01 do grupo de recursos dev Solicitamos todos os tamaños aceptables posibles:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(En problemas reais, por suposto, no canto de ResourceGroupName=dev и VMName=devvm01 especificará os seus propios valores para estes parámetros.)

O comando devolverá algo así:

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

Estas son todas as opcións de tamaño posibles que se poden configurar para unha determinada máquina virtual.

Imos cambiar o tamaño do coche

Por exemplo, cambiaremos o tamaño a un novo tamaño Estándar_B1ls - está no primeiro lugar da lista anterior. (En aplicacións da vida real, por suposto, escolles o tamaño que necesites).

  1. Primeiro usando o comando Get-AzVM obtemos información sobre o noso obxecto (máquina virtual) almacenándoo nunha variable $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Despois tomamos a propiedade deste obxecto .HardwareProfile.VmSize e establece o novo valor desexado:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. E agora simplemente executamos o comando de actualización de VM - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Asegurámonos de que todo saíu ben; para facelo, volvemos solicitar información sobre o noso obxecto e miramos a propiedade $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Se vemos alí Estándar_B1ls - isto significa que todo está en orde, cambiouse o tamaño do coche. Podes ir máis lonxe e aproveitar o teu éxito cambiando o tamaño de varias máquinas virtuales á vez usando unha matriz.

Que tal se elimina unha máquina virtual en Azure?

Coa eliminación, non todo é tan sinxelo e directo como parece. Despois de todo, é necesario eliminar unha serie de recursos asociados con esta máquina, incluíndo:

  • Contedores de almacenamento de diagnóstico de arranque
  • Interfaces de rede
  • Enderezos IP públicos
  • Disco do sistema e blob onde se almacena o seu estado
  • Discos de datos

Polo tanto, imos crear unha función e chamala Remove-AzrVirtualMachine - e eliminará non só Azure VM, senón tamén todo o anterior.

Seguimos o camiño estándar e primeiro obtemos o noso obxecto (VM) usando o comando Get-AzVm. Por exemplo, que sexa un coche WINSRV19 do grupo de recursos MyTestVMs.

Imos gardar este obxecto xunto con todas as súas propiedades nunha variable $vm:

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

Eliminando o contedor cos ficheiros de diagnóstico de arranque

Ao crear unha máquina virtual en Azure, tamén se lle pide ao usuario que cree un contenedor para almacenar os diagnósticos de arranque (contedor de diagnóstico de arranque), de xeito que se hai problemas co arranque, haxa algo ao que acudir para solucionar problemas. Non obstante, cando se elimina a máquina virtual, este contedor déixase continuar coa súa existencia sen propósito. Imos arranxar esta situación.

  1. En primeiro lugar, imos descubrir a que conta de almacenamento pertence este contedor; para iso necesitamos atopar a propiedade storageUri nas entrañas do obxecto DiagnosticsProfile o noso VM. Para iso uso esta expresión regular:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Agora cómpre descubrir o nome do contedor e para iso necesitas obter o ID de VM usando o 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, obtemos o nome do grupo de recursos ao que pertence o contedor:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. E agora temos todo o que necesitamos para eliminar o contedor co comando Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Eliminando a VM

Agora imos eliminar a propia máquina virtual, xa que xa creamos unha variable $vm para o obxecto correspondente. Ben, imos executar o comando Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Eliminando a interface de rede e o enderezo IP público

A nosa máquina virtual aínda ten unha (ou incluso varias) interfaces de rede (NIC) - para eliminalas como innecesarias, imos pasar pola propiedade NetworkInterfaces o noso obxecto VM e elimine o NIC co comando Remove-AzNetworkInterface. No caso de que exista máis dunha interface de rede, usamos un bucle. Ao mesmo tempo, para cada NIC comprobaremos a propiedade IpConfiguration para determinar se a interface ten un enderezo IP público. Se se atopa algún, eliminarémolo co comando Remove-AzPublicIpAddress.

Aquí tes un exemplo de tal código, onde miramos todas as NIC nun bucle, eliminámolas e comprobamos se hai unha IP pública. Se o hai, analiza a propiedade PublicIpAddress, busca o nome do recurso correspondente por ID e elimínao:


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 o disco do sistema

O disco do SO é un blob, para o que hai un comando para eliminalo Remove-AzStorageBlob - pero antes de executalo, terás que establecer os valores necesarios para os seus parámetros. Para iso, en particular, cómpre obter o nome do contedor de almacenamento que contén o disco do sistema e, a continuación, pasalo a este comando xunto coa conta de almacenamento correspondente.

$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 o Blob de estado do disco do sistema

Para iso, como probablemente xa adiviñaches, tomamos o recipiente de almacenamento no que se almacena este disco, e, dando a entender que o blob ao final contén status, pase os parámetros correspondentes ao comando delete Remove-AzStorageBlob:

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

E finalmente, eliminamos os discos de datos

A nosa máquina virtual aínda podería ter discos con datos que estaban conectados a ela. Se non son necesarios, tamén os borraremos. Imos analizalo primeiro StorageProfile nosa VM e atopar a propiedade Uri. Se hai varios discos, organizamos un ciclo segundo URI. Para cada URI, atoparemos a conta de almacenamento correspondente usando Get-AzStorageAccount. Despois analiza o URI de almacenamento para extraer o nome do blob desexado e pásao ao comando delete Remove-AzStorageBlob xunto cunha conta de almacenamento. Así se vería no 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]
    }
}

E agora "chegamos ao final feliz!" Agora necesitamos montar un único todo a partir de todos estes fragmentos. O amable autor Adam Bertram coñeceu aos usuarios a medio camiño e fíxoo el mesmo. Aquí tes unha ligazón ao guión final chamado Eliminar-AzrVirtualMachine.ps1:

GitHub

Espero que estes consellos prácticos sexan útiles para aforrarche esforzo, tempo e diñeiro cando traballas con máquinas virtuales de Azure.

Fonte: www.habr.com

Engadir un comentario