Modificando e excluindo VMs do Azure usando PowerShell

Usando o PowerShell, engenheiros e administradores de TI automatizam com sucesso várias tarefas ao trabalhar não apenas com infraestruturas locais, mas também com infraestruturas em nuvem, em particular com o Azure. Em alguns casos, trabalhar através do PowerShell é muito mais conveniente e rápido do que trabalhar através do portal Azure. Graças à sua natureza multiplataforma, o PowerShell pode ser usado em qualquer sistema operacional.

Esteja você executando Ubuntu, Red Hat ou Windows, o PowerShell pode ajudá-lo a controlar seus recursos de nuvem. Usando o módulo AzurePowerShell, por exemplo, você pode definir quaisquer propriedades de máquinas virtuais.

Neste artigo, veremos como você pode usar o PowerShell para redimensionar uma VM na nuvem do Azure, bem como excluir uma VM e seus objetos associados.

Modificando e excluindo VMs do Azure usando PowerShell

Importante! Não se esqueça de limpar as mãos com desinfetante para se preparar para o trabalho:

  • Você precisará de um módulo Módulo Azure PowerShell - pode ser baixado da Galeria do PowerShell com o comando Install-Module Az.
  • Você precisa se autenticar na nuvem do Azure onde a máquina virtual está sendo executada executando o comando Connect-AzAccount.

Primeiro, vamos criar um script que redimensionará uma VM do Azure. Vamos abrir o VS Code e salvar um novo script do PowerShell chamado Redimensionar-AzVirtualMachine.ps1 - adicionaremos pedaços de código à medida que o exemplo avança.

Solicitamos os tamanhos de VM disponíveis

Antes de alterar o tamanho da VM, você precisa descobrir quais são os tamanhos aceitáveis ​​para máquinas virtuais na nuvem do Azure. Para fazer isso você precisa executar o comando Get-AzVMSize.

Então, para a máquina virtual devvm01 do grupo de recursos dev Solicitamos todos os tamanhos aceitáveis ​​possíveis:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Em problemas reais, é claro, em vez de ResourceGroupName=dev и NomeVM=devvm01 você especificará seus próprios valores para esses parâmetros.)

O comando retornará algo assim:

Modificando e excluindo VMs do Azure usando PowerShell

Todas essas são opções de tamanho possíveis que podem ser definidas para uma determinada máquina virtual.

Vamos redimensionar o carro

Por exemplo, iremos redimensionar para um novo tamanho Padrão_B1ls - ele está em primeiro lugar na lista acima. (Em aplicações da vida real, é claro, você escolhe o tamanho que precisa.)

  1. Primeiro usando o comando Get-AzVM obtemos informações sobre nosso objeto (máquina virtual) armazenando-o em uma variável $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Então pegamos a propriedade deste objeto .HardwareProfile.VmSize e defina o novo valor desejado:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. E agora simplesmente executamos o comando VM update - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. Garantimos que tudo correu bem - para isso, solicitamos novamente informações sobre o nosso objeto e olhamos o imóvel $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Se vermos lá Padrão_B1ls - isso significa que está tudo em ordem, o tamanho do carro foi alterado. Você pode ir além e desenvolver seu sucesso redimensionando várias VMs de uma só vez usando um array.

Que tal excluir uma VM no Azure?

Com a exclusão, nem tudo é tão simples e direto quanto pode parecer. Afinal, é necessário remover uma série de recursos associados a esta máquina, incluindo:

  • Contêineres de armazenamento de diagnóstico de inicialização
  • Interfaces de rede
  • Endereços IP públicos
  • Disco do sistema e blob onde seu status é armazenado
  • Discos de dados

Portanto, criaremos uma função e a chamaremos Remove-AzrVirtualMachine - e excluirá não apenas a VM do Azure, mas também todas as opções acima.

Seguimos o caminho padrão e primeiro obtemos nosso objeto (VM) usando o comando Get-AzVm. Por exemplo, seja um carro WINSRV19 do grupo de recursos MyTestVMs.

Vamos salvar este objeto junto com todas as suas propriedades em uma variável $vm:

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

Removendo o contêiner com arquivos de diagnóstico de inicialização

Ao criar uma VM no Azure, o usuário também é solicitado a criar um contêiner para armazenar diagnósticos de inicialização (contêiner de diagnóstico de inicialização), para que, se houver problemas com a inicialização, haja algo a quem recorrer para solucionar problemas. No entanto, quando a VM é excluída, esse contêiner continua com sua existência agora sem propósito. Vamos consertar esta situação.

  1. Primeiro, vamos descobrir a qual conta de armazenamento esse contêiner pertence - para isso precisamos encontrar a propriedade storageUri nas entranhas do objeto DiagnosticsProfile nossa VM. Para isso eu uso esta expressão regular:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Agora você precisa descobrir o nome do contêiner, e para isso você precisa obter o ID da 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 seguir, obtemos o nome do grupo de recursos ao qual o contêiner pertence:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. E agora temos tudo que precisamos para deletar o container com o comando Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

Removendo a VM

Agora vamos deletar a própria máquina virtual, pois já criamos uma variável $vm para o objeto correspondente. Bem, vamos executar o comando Remove-AzVm:

$null = $vm | Remove-AzVM -Force

Removendo a interface de rede e o endereço IP público

Nossa VM ainda possui uma (ou até várias) interfaces de rede (NICs) - para removê-las como desnecessárias, vamos examinar a propriedade NetworkInterfaces nosso objeto VM e exclua a NIC com o comando Remove-AzNetworkInterface. Caso haja mais de uma interface de rede, utilizamos um loop. Ao mesmo tempo, para cada NIC verificaremos a propriedade IpConfiguration para determinar se a interface possui um endereço IP público. Se algum for encontrado, iremos removê-lo com o comando Remove-AzPublicIpAddress.

Aqui está um exemplo desse código, onde examinamos todas as NICs em um loop, as excluímos e verificamos se há um IP público. Se houver, analise a propriedade PublicIpAddress, encontre o nome do recurso correspondente por ID e exclua-o:


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

Removendo o disco do sistema

O disco do sistema operacional é um blob, para o qual existe um comando para excluí-lo Remove-AzStorageBlob - mas antes de executá-lo, você precisará definir os valores necessários para seus parâmetros. Para fazer isso, em particular, você precisa obter o nome do contêiner de armazenamento que contém o disco do sistema e, em seguida, passá-lo para este comando junto com a conta de armazenamento 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]

Removendo o blob de status do disco do sistema

Para fazer isso, como você provavelmente já adivinhou, pegamos o contêiner de armazenamento no qual este disco está armazenado e, o que implica que o blob no final contém status, passe os parâmetros correspondentes para o comando delete Remove-AzStorageBlob:

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

E finalmente, removemos os discos de dados

Nossa VM ainda pode ter discos com dados anexados a ela. Se não forem necessários, iremos excluí-los também. Vamos analisar primeiro StorageProfile nossa VM e encontre a propriedade Uri. Se houver vários discos, organizamos um ciclo de acordo com URI. Para cada URI, encontraremos a conta de armazenamento correspondente usando Get-AzStorageAccount. Em seguida, analise o URI de armazenamento para extrair o nome do blob desejado e passe-o para o comando delete Remove-AzStorageBlob juntamente com uma conta de armazenamento. Seria assim 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 precisamos montar um único todo a partir de todos esses fragmentos. O gentil autor Adam Bertram encontrou os usuários no meio do caminho e fez isso sozinho. Aqui está um link para o script final chamado Remover-AzrVirtualMachine.ps1:

GitHub

Espero que estas dicas práticas sejam úteis para poupar esforço, tempo e dinheiro ao trabalhar com VMs do Azure.

Fonte: habr.com

Adicionar um comentário