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
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.
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:
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.)
- 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
- Então pegamos a propriedade deste objeto
.HardwareProfile.VmSize
e defina o novo valor desejado:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- E agora simplesmente executamos o comando VM update -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- 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.
- Primeiro, vamos descobrir a qual conta de armazenamento esse contêiner pertence - para isso precisamos encontrar a propriedade
storageUri
nas entranhas do objetoDiagnosticsProfile
nossa VM. Para isso eu uso esta expressão regular:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- 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)
- A seguir, obtemos o nome do grupo de recursos ao qual o contêiner pertence:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- 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:
→
Espero que estas dicas práticas sejam úteis para poupar esforço, tempo e dinheiro ao trabalhar com VMs do Azure.
Fonte: habr.com