使用 PowerShell,工程师和 IT 管理员不仅在本地工作,而且在使用云基础设施(尤其是 Azure)时成功地自动化了各种任务。 在某些情况下,通过 PowerShell 进行工作比通过 Azure 门户进行工作更加方便和快捷。 由于其跨平台特性,PowerShell 可以在任何操作系统上使用。
无论您运行的是 Ubuntu、Red Hat 还是 Windows,PowerShell 都可以帮助您控制云资源。 使用模块
在本文中,我们将了解如何使用 PowerShell 调整 Azure 云中 VM 的大小以及删除 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 您将为这些参数指定您自己的值。)
该命令将返回如下内容:
这些都是可以为给定虚拟机设置的所有可能的大小选项。
让我们调整一下汽车的大小
例如,我们将调整大小到新的大小 标准_B1ls - 他在上面的名单上名列第一。 (当然,在实际应用中,您可以选择所需的任何尺寸。)
- 首先使用命令
Get-AzVM
我们通过将对象(虚拟机)存储在变量中来获取有关该对象(虚拟机)的信息$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- 然后我们从这个对象中获取属性
.HardwareProfile.VmSize
并设置所需的新值:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- 现在我们只需执行 VM 更新命令 -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- 我们确保一切顺利 - 为此,我们再次请求有关我们对象的信息并查看属性
$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时,还要求用户创建一个用于存储启动诊断的容器(启动诊断容器),以便在启动出现问题时可以求助于故障排除。 但是,当虚拟机被删除时,该容器将继续其现在毫无目的的存在。 让我们解决这个问题。
- 首先,让我们找出该容器属于哪个存储帐户 - 为此我们需要找到属性
storageUri
在物体的内部DiagnosticsProfile
我们的虚拟机。 为此,我使用这个正则表达式:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- 现在您需要找出容器的名称,为此您需要使用以下命令获取虚拟机 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)
- 接下来,我们获取容器所属资源组的名称:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- 现在我们已经拥有了使用命令删除容器所需的一切
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:
→
我希望这些实用技巧有助于您在使用 Azure VM 时节省精力、时间和金钱。
来源: habr.com