使用Powershell脚本删除Azure VM
最近在做交流的时候很多朋友都反馈说在Azure中删除VM的时删除的不彻底,每次都是将实例本身删除了,但是实例所用的网卡、磁盘以及安全组等资源并没被彻底删除,导致每次删除后,都要花大量的时间去分辨对应的依赖资源,然后在手动的将其删除掉,这操作起来十分的麻烦。那是否有什么方式可以做到在删除VM实例的时候就将其所依赖的磁盘、网卡等文件都删除呢?其实是可以的,我们可以通过两种方式来实现,
第一种方式是在创建VM的时候勾选“Delete with VM”:
“Delete with VM”这个选项,会在VM实例被删除的时候,将其所使用的网卡和磁盘也一并的会被删除掉,具体如下图所示:
在磁盘配置位置,勾选“Delete with VM”:
在网络配置位置勾选“Delete with VM”:
第二中方式则是使用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
}
}
}
}