使用 PowerShell 修改和删除 Azure VM

使用 PowerShell,工程师和 IT 管理员不仅在本地工作,而且在使用云基础设施(尤其是 Azure)时成功地自动化了各种任务。 在某些情况下,通过 PowerShell 进行工作比通过 Azure 门户进行工作更加方便和快捷。 由于其跨平台特性,PowerShell 可以在任何操作系统上使用。

无论您运行的是 Ubuntu、Red Hat 还是 Windows,PowerShell 都可以帮助您控制云资源。 使用模块 Azure PowerShell例如,您可以设置虚拟机的任何属性。

在本文中,我们将了解如何使用 PowerShell 调整 Azure 云中 VM 的大小以及删除 VM 及其关联对象。

使用 PowerShell 修改和删除 Azure VM

重要的信息! 不要忘记用消毒剂擦拭双手以准备工作:

  • 你将需要一个模块 Azure PowerShell 模块 - 可以使用以下命令从 PowerShell Gallery 下载 Install-Module Az.
  • 您需要通过运行以下命令在运行虚拟机的 Azure 云中进行身份验证 Connect-AzAccount.

首先,让我们创建一个用于调整 Azure VM 大小的脚本。 让我们打开 VS Code 并保存一个名为的新 PowerShell 脚本 调整大小-AzVirtualMachine.ps1 - 随着示例的进展,我们将向其中添加代码片段。

我们请求可用的 VM 大小

在更改 VM 大小之前,需要了解 Azure 云中虚拟机可接受的大小。 为此,您需要运行命令 Get-AzVMSize.

那么对于虚拟机 devvm01 来自资源组 开发 我们要求所有可能可接受的尺寸:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(当然,在实际问题中,而不是 资源组名称=dev и 虚拟机名称=devvm01 您将为这些参数指定您自己的值。)

该命令将返回如下内容:

使用 PowerShell 修改和删除 Azure VM

这些都是可以为给定虚拟机设置的所有可能的大小选项。

让我们调整一下汽车的大小

例如,我们将调整大小到新的大小 标准_B1ls - 他在上面的名单上名列第一。 (当然,在实际应用中,您可以选择所需的任何尺寸。)

  1. 首先使用命令 Get-AzVM 我们通过将对象(虚拟机)存储在变量中来获取有关该对象(虚拟机)的信息 $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. 然后我们从这个对象中获取属性 .HardwareProfile.VmSize 并设置所需的新值:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. 现在我们只需执行 VM 更新命令 - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. 我们确保一切顺利 - 为此,我们再次请求有关我们对象的信息并查看属性 $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

如果我们看到那里 标准_B1ls - 这意味着一切都井然有序,汽车的尺寸已经改变。 您可以使用阵列一次调整多个虚拟机的大小,从而更进一步并取得成功。

在 Azure 中删除 VM 怎么样?

通过删除,并非所有事情都像看起来那么简单和直接。 毕竟,需要删除与该机器相关的许多资源,包括:

  • 启动诊断存储容器
  • 网络接口
  • 公共IP地址
  • 系统磁盘和存储其状态的 blob
  • 数据盘

因此,我们将创建一个函数并调用它 Remove-AzrVirtualMachine - 它不仅会删除 Azure VM,还会删除上述所有内容。

我们采用标准方式,首先使用命令获取我们的对象(VM) Get-AzVm。 例如,假设它是一辆汽车 WINSRV19 来自资源组 我的测试虚拟机.

让我们将该对象及其所有属性保存到一个变量中 $vm:

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

删除带有启动诊断文件的容器

在Azure中创建VM时,还要求用户创建一个用于存储启动诊断的容器(启动诊断容器),以便在启动出现问题时可以求助于故障排除。 但是,当虚拟机被删除时,该容器将继续其现在毫无目的的存在。 让我们解决这个问题。

  1. 首先,让我们找出该容器属于哪个存储帐户 - 为此我们需要找到属性 storageUri 在物体的内部 DiagnosticsProfile 我们的虚拟机。 为此,我使用这个正则表达式:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. 现在您需要找出容器的名称,为此您需要使用以下命令获取虚拟机 ID 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. 接下来,我们获取容器所属资源组的名称:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. 现在我们已经拥有了使用命令删除容器所需的一切 Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

删除虚拟机

现在让我们删除虚拟机本身,因为我们已经创建了一个变量 $vm 为对应的对象。 好吧,让我们运行命令 Remove-AzVm:

$null = $vm | Remove-AzVM -Force

删除网络接口和公共 IP 地址

我们的虚拟机仍然有一个(甚至多个)网络接口(NIC) - 为了删除不必要的它们,让我们检查一下属性 NetworkInterfaces 我们的 VM 对象并使用命令删除 NIC Remove-AzNetworkInterface。 如果有多个网络接口,我们使用循环。 同时,对于每个NIC我们都会检查属性 IpConfiguration 判断接口是否有公网IP地址。 如果找到,我们将使用以下命令将其删除 Remove-AzPublicIpAddress.

下面是此类代码的示例,我们循环查看所有网卡,将其删除,然后检查是否有公共 IP。 如果有,则解析该属性 PublicIpAddress,通过ID找到对应资源的名称并删除:


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

取出系统盘

OS磁盘是一个blob,有一个命令可以删除它 Remove-AzStorageBlob - 但在执行之前,您需要为其参数设置所需的值。 为此,特别需要获取包含系统磁盘的存储容器的名称,然后将其与相应的存储帐户一起传递给此命令。

$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]

删除系统磁盘状态 Blob

为此,正如您可能已经猜到的那样,我们采用存储该磁盘的存储容器,并且意味着末尾的 blob 包含 status,将相应的参数传递给删除命令 Remove-AzStorageBlob:

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

最后,我们删除数据磁盘

我们的虚拟机仍然可以拥有附加了数据的磁盘。 如果不需要,我们也会将其删除。 我们先来解析一下 StorageProfile 我们的虚拟机并找到该属性 Uri。 如果有多个磁盘,我们根据 URI。 对于每个 URI,我们将使用以下命令找到相应的存储帐户 Get-AzStorageAccount。 然后解析存储 URI 以提取所需的 blob 名称并将其传递给删除命令 Remove-AzStorageBlob 以及存储帐户。 代码如下:

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

现在“我们已经达到了幸福的结局!” 现在我们需要将所有这些碎片组装成一个整体。 好心的作者Adam Bertram半路遇见了用户,自己也做了。 这是最终脚本的链接,名为 删除-AzrVirtualMachine.ps1:

GitHub上

我希望这些实用技巧有助于您在使用 Azure VM 时节省精力、时间和金钱。

来源: habr.com

添加评论