Com o PowerShell, engenheiros e administradores de TI automatizam com sucesso várias tarefas ao trabalhar não apenas com infraestruturas on-premises, mas também com serviços em nuvem, especialmente Azure. Trabalhar com PowerShell, em muitos casos, é muito mais conveniente e rápido do que através do portal do Azure. Graças à compatibilidade multiplataforma, o PowerShell pode ser usado em qualquer sistema operacional.
Não importa se você está trabalhando com Ubuntu, Red Hat ou Windows — o PowerShell ajuda a controlar os recursos em nuvem. Usando o módulo , por exemplo, é possível definir quaisquer propriedades das máquinas virtuais.
Neste artigo, vamos explorar como usar o PowerShell para redimensionar uma VM na nuvem Azure, bem como para excluir a VM e os objetos associados.

Importante! Não se esqueça de desinfetar as mãos e se preparar para o trabalho:
- Você precisará do módulo Azure PowerShell Module — ele pode ser baixado do PowerShell Gallery com o comando
Install-Module Az. - É necessário se autenticar na nuvem Azure onde a máquina virtual está sendo executada, executando o comando
Connect-AzAccount.
Para começar, vamos criar um script que redimensiona a VM do Azure. Abra o VS Code e salve um novo script PowerShell com o nome Resize-AzVirtualMachine.ps1 — nele, ao longo do exemplo, iremos adicionar trechos de código.
Solicitamos os tamanhos disponíveis das VMs
Antes de mudar o tamanho da VM, precisamos saber quais tamanhos válidos estão disponíveis para as máquinas virtuais na nuvem Azure. Para isso, devemos executar o comando Get-AzVMSize.
Assim, para a máquina virtual devvm01 do grupo de recursos dev solicitamos todos os tamanhos válidos:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(Nas tarefas reais, claro, ao invés de ResourceGroupName=dev e VMName=devvm01 você irá especificar os seus próprios valores para esses parâmetros.)
O comando retornará uma lista semelhante a esta:

Essas são todas as opções de tamanhos que podem ser atribuídas a esta máquina virtual.
Redimensionando a máquina
Por exemplo, faremos o redimensionamento para o novo tamanho Standard_B1ls — ele é o primeiro da lista acima. (Em tarefas reais, evidentemente, você escolhe qualquer tamanho necessário.)
- Primeiro, usando o comando
Get-AzVMobtemos informações sobre nosso objeto (máquina virtual), salvando-as na variável$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - Em seguida, deste objeto, pegamos a propriedade
.HardwareProfile.VmSizee definimos o novo valor necessário:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - E agora simplesmente executamos o comando de atualização da VM —
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - Certificamo-nos de que tudo ocorreu com sucesso — para isso, novamente solicitamos informações sobre nosso objeto e observamos a propriedade
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Se a vermos Standard_B1ls — significa que tudo está certo, o tamanho da máquina foi alterado. Podemos seguir em frente e aproveitar o sucesso — redimensionar várias VMs de uma vez usando uma matriz.
E quanto à remoção da VM no Azure?
A remoção não é tão simples e direta quanto pode parecer. É preciso excluir também vários recursos associados a essa máquina, incluindo:
- Contêineres de armazenamento para diagnósticos de inicialização (Boot diagnostics storage containers)
- Interfaces de rede
- Endereços IP públicos
- O disco do sistema e o blob onde seu status é armazenado
- Discos de dados (data disks)
Portanto, criaremos uma função e a chamaremos de Remove-AzrVirtualMachine — e ela irá remover não apenas a VM do Azure, mas também todos os recursos mencionados acima.
Vamos seguir o caminho padrão e primeiro obter nosso objeto (VM) usando o comando Get-AzVm. Para exemplo, digamos que seja a máquina WINSRV19 do grupo de recursos MyTestVMs.
Armazenaremos esse objeto juntamente com todas as suas propriedades em uma variável $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsRemovemos o contêiner com os 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 (boot diagnostics container), para que, em caso de problemas de inicialização, haja um recurso para consultar sobre solução de problemas. No entanto, ao excluir a VM, esse contêiner permanece com sua existência agora sem propósito. Vamos corrigir essa situação.
- Primeiro, vamos descobrir a qual conta de armazenamento pertence esse contêiner — para isso, precisamos encontrar a propriedade
storageUrinas entranhas do objetoDiagnosticsProfileda nossa VM. Para isso, uso a seguinte expressão regular:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - Agora é necessário descobrir o nome do contêiner, e para isso precisamos 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) - Em seguida, obtemos o nome do grupo de recursos ao qual pertence o contêiner:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - E agora temos tudo o que precisamos para remover 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 remover a própria máquina virtual, já que já criamos a variável $vm para o objeto correspondente. Bom, vamos executar o comando Remove-AzVm:
$null = $vm | Remove-AzVM -ForceRemovendo a interface de rede e o IP público
A nossa VM tem uma (ou até várias) interfaces de rede (NICs) — para removê-las quando não forem mais necessárias, vamos percorrer a propriedade NetworkInterfaces do nosso objeto VM e remover a NIC com o comando Remove-AzNetworkInterface. Caso haja mais de uma interface de rede, usaremos um loop. Também para cada NIC verificaremos a propriedade IpConfiguration para verificar se a interface tem um endereço IP público. Se assim for, vamos removê-lo com o comando Remove-AzPublicIpAddress.
Aqui está um exemplo de código em que percorremos todas as NICs em um loop, removemos elas, checamos se há um IP público. Se houver, então extraímos a propriedade PublicIpAddress, retiramos pelo ID o nome do recurso correspondente e o removemos:
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 SO é um blob, que pode ser removido com o comando Remove-AzStorageBlob — mas antes de executá-lo, será necessário definir os valores exigidos para os seus parâmetros. Para isso, em particular, é necessário obter o nome do container de storage que contém o disco do sistema, e então passar isso para este comando junto com a conta de storage 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 isso, como você já deve ter adivinhado, pegamos o container de storage em que este disco está armazenado, e, presumindo que o blob no final contém status, passamos os parâmetros correspondentes para o comando de remoção Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobE, finalmente, removemos os discos de dados
Nossa VM pode ter discos de dados que estavam anexados a ela. Se eles não forem necessários, vamos removê-los também. Primeiro, vamos analisá-los. StorageProfile nossa VM e encontraremos a propriedade Uri. Se houver vários discos, organizaremos um ciclo por URI. Para cada URI, encontraremos a conta de armazenamento correspondente usando Get-AzStorageAccount. Em seguida, analisaremos a URI do storage para extrair o nome do blob necessário e passá-lo para o comando de remoção Remove-AzStorageBlob junto com a conta de armazenamento. Veja como isso ficará 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 aqui “chegamos ao final feliz!” Agora, a partir de todos esses fragmentos, precisamos juntar tudo em um só. O simpático autor Adam Bertram atendeu aos usuários e fez isso. Aqui está o link para o script final chamado Remove-AzrVirtualMachine.ps1:
→
Espero que estas dicas práticas sejam úteis para você economizar esforço, tempo e recursos ao trabalhar com Azure VMs.
Fonte: habr.com
