使用Powershell脚本删除Azure VM

最近在做交流的时候很多朋友都反馈说在Azure中删除VM的时删除的不彻底,每次都是将实例本身删除了,但是实例所用的网卡、磁盘以及安全组等资源并没被彻底删除,导致每次删除后,都要花大量的时间去分辨对应的依赖资源,然后在手动的将其删除掉,这操作起来十分的麻烦。那是否有什么方式可以做到在删除VM实例的时候就将其所依赖的磁盘、网卡等文件都删除呢?其实是可以的,我们可以通过两种方式来实现,

 第一种方式是在创建VM的时候勾选“Delete with VM”:

“Delete with VM”这个选项,会在VM实例被删除的时候,将其所使用的网卡和磁盘也一并的会被删除掉,具体如下图所示:

在磁盘配置位置,勾选“Delete with VM”:

使用Powershell脚本删除Azure VM_资源清理

在网络配置位置勾选“Delete with VM”:

使用Powershell脚本删除Azure VM_Azure_02


第二中方式则是使用Powersell脚本的方式进行删除:

我们可以通过编写对应的Powershell脚本来实现在删除VM的时候删除与其关联的磁盘和网卡资源,具体大家可以参考如下的PS脚本:

$StopVMs = Get-AzVM | Select-Object Name, ResourceGroupName, @{Name='Status';Expression={(Get-AzVM -Name $_.Name -ResourceGroupName $_.ResourceGroupName -status).Statuses[1].displayStatus}} | Where-Object {$_.Status -in "VM running"}
foreach($vm in $StopVMs)
{
    Write-Host "Remove VM $vm.Name"
    $vms = Get-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName
    Remove-AzVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Force
    foreach($nicUri in $vms.NetworkProfile.NetworkInterfaces.Id)
    {
        $nic = Get-AzNetworkInterface -ResourceGroupName $vms.ResourceGroupName -Name $nicUri.Split('/')[-1]
        Write-Host $nic.IpConfigurationsText
        Remove-AzNetworkInterface -Name $nic.Name -ResourceGroupName $nic.ResourceGroupName -Force
        $nsgnic = $nic.NetworkSecurityGroupText | ConvertFrom-Json 
        Remove-AzNetworkSecurityGroup -Name $nsgnic.Id.Split('/')[-1] -ResourceGroupName $nsgnic.Id.Split('/')[-5] -Force
        $jnics = $nic.IpConfigurationsText | ConvertFrom-Json 
        #Write-Host $jnics.PublicIpAddress.Id
        foreach($ipconfig in $jnics)
        {
            Write-Host $ipconfig.PublicIpAddress.Id
            if($ipconfig.PublicIpAddress.Id -ne $null)
            {
                Remove-AzPublicIpAddress -Name $ipconfig.PublicIpAddress.Id.Split('/')[-1] -ResourceGroupName $ipconfig.PublicIpAddress.Id.Split('/')[-5] -Force
            }
        }

    }

    foreach($vm in $vms)
    {
        Get-AzDisk | Where-Object {$_.ManagedBy -eq $vm.Id} | Remove-AzDisk -Force
            if('DataDiskNames' -in $vm.PSObject.Properties.Name -and @($vm.DataDiskNames).Count -gt 0)
            {
                foreach($diskName in $vm.DataDiskNames)
                {
                    Get-AzDisk | Where-Object {$_.Name -eq $diskName} | Remove-AzDisk -Force
                }
            }
    }
}