删除/删除通过Powershell旋转新VM时创建的所有资源

时间:2018-09-04 04:52:52

标签: azure powershell azure-virtual-machine azure-powershell

我已经使用template.json文件通过powershell创建了VM。这些是将创建的资源类型的列表。
1.虚拟机
2.网络接口
3.网络安全组
4.磁盘

现在,我要做的是在新创建的VM上更新一些应用程序,推广该VM并创建新VM的映像。直到这里,我都能通过powershell做到这一点。

现在,我的要求是删除在旋转虚拟机期间创建的所有资源。我知道删除VM的cmdlet是这个。

Remove-VM -Name "new 2" -Force

是否有单个命令可以执行此任务?

任何帮助或投入都将受到高度赞赏。谢谢

4 个答案:

答案 0 :(得分:1)

与虚拟机关联的资源在删除虚拟机时不会自动删除,主要是这样,因此您可以根据需要重新使用它们,例如,如果要删除虚拟机但要使用相同的虚拟机重新创建VHD等。如果您知道要删除VM和关联的资源,这可能会很烦人。除了手动删除所有内容外,您实际上只有2个选项

  1. 删除资源组-这在这里有助于将资源组的范围缩小到最小,从而有助于实现这一目标

  2. 编写脚本来为您删除VM和资源,一个很好的例子是here

我建议您对另一个Azure客户提交的想法进行投票。

https://feedback.azure.com/forums/216843-virtual-machines/suggestions/8945692-delete-vm-with-all-associated-resources

您在这些论坛中分享的所有反馈将由Azure团队监视和审查。

答案 1 :(得分:0)

使用这篇出色的文章。这是推荐文章,我在许多Technet论坛答复中都看到过。

Remove VM and its associated Resources

答案 2 :(得分:0)

如果将VM和所有相关资源关联到一个资源组,只需删除该资源组将删除所有附加资源及其自身的VM。

您可以像tat那样做:

Get-AzResourceGroup -Name "ContosoRG01" | Remove-AzResourceGroup -Force

这里还有一篇完整的博客文章,描述了如何使用AzureRM和powershell编写VM创建脚本。

Create a Windows Server virtual machine with PowerShell

答案 3 :(得分:-2)

我在链接下面准备了一个脚本。只需输入虚拟机名称和脚本即可处理其余的 http://cloudcompute.info/delete-azure-vm-and-all-associated-resources-using-powershell-script/

这是完整的脚本

Write-Host -NoNewline -ForegroundColor Green "Please enter the VM name you would like to remove:"
$VMName = Read-Host
$vm = Get-AzVm -Name $VMName
$RGName=$vm.ResourceGroupName
Write-Host -ForegroundColor Cyan 'Resource Group Name is identified as-' $RGName
$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
Write-Host -ForegroundColor Cyan 'Marking Disks for deletion...'
$tags = @{"VMName"=$VMName; "Delete Ready"="Yes"}
$osDiskName = $vm.StorageProfile.OSDisk.Name
$datadisks = $vm.StorageProfile.DataDisks
$ResourceID= (Get-Azdisk -Name $osDiskName).id
New-AzTag -ResourceId $ResourceID -Tag $tags | Out-Null
if ($vm.StorageProfile.DataDisks.Count -gt 0) {
    foreach ($datadisks in $vm.StorageProfile.DataDisks){
    $datadiskname=$datadisks.name 
    $ResourceID= (Get-Azdisk -Name $datadiskname).id 
    New-AzTag -ResourceId $ResourceID -Tag $tags | Out-Null
    }
}
if ($vm.Name.Length -gt 9) {
    $i = 9
} else {
    $i = $vm.Name.Length - 1
}
$azResourceParams = @{
    'ResourceName' = $VMName
    'ResourceType' = 'Microsoft.Compute/virtualMachines'
    'ResourceGroupName' = $RGName
}
$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
$saParams = @{
    'ResourceGroupName' = $diagSaRg
    'Name' = $diagSa
}
Write-Host -ForegroundColor Cyan 'Removing Boot Diagnostic disk..'
Get-AzStorageAccount @saParams | Get-AzStorageContainer | where {$_.Name-eq $diagContainerName} | Remove-AzStorageContainer -Force
Write-Host -ForegroundColor Cyan 'Removing Virtual Machine-' $VMName 'in Resource Group-' $RGName '...'
$null = $vm | Remove-AzVM -Force
Write-Host -ForegroundColor Cyan 'Removing Network Interface Cards, Public IP Address(s) used by the VM...'
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
        }
    }
}
Write-Host -ForegroundColor Cyan 'Removing OS disk and Data Disk(s) used by the VM..'
Get-AzResource -tag $tags | where{$_.resourcegroupname -eq $RGName}| Remove-AzResource -force | Out-Null
Write-Host -ForegroundColor Green 'Azure Virtual Machine-' $VMName 'and all the resources associated with the VM were removed sucesfully...'