根据你删除 VM 的方式,可能只会删除 VM 资源,而不会删除网络和磁盘资源。 可以更改删除 VM 时删除其他哪些资源的默认设置。
创建 VM 时设置删除选项
若要指定附加的资源在你删除 VM 时会发生什么情况,请使用 delete-option 参数。 每个都可以设置为 Delete(这会在你删除 VM 时永久删除资源),或者设置为 Detach(这只会拆离资源并将其保留在 Azure 中,以便以后可以重用)。 针对使用 CLI 创建的 VM 的默认设置为拆离 OS 磁盘。 你为其设置了 Detach 的资源(如磁盘)会继续产生费用(如果适用)。
--os-disk-delete-option - OS 磁盘。 
--data-disk-delete-option - 数据磁盘。 
--nic-delete-option - NIC。 
在此示例中,我们使用名为 myImage 的映像,在名为 myResourceGroup 的资源组中创建名为 myVM 的 VM,并将 OS 磁盘和 NIC 设置为在删除 VM 时删除。
az vm create \
    --resource-group myResourceGroup \
    --name myVM \
    --image myImage \
    --public-ip-sku Standard \
    --nic-delete-option delete \
    --os-disk-delete-option delete \
    --admin-username azureuser \
    --generate-ssh-keys
若要指定附加的资源在你删除 VM 时会发生什么情况,请使用 DeleteOption 参数。 每个都可以设置为 Delete(这会在你删除 VM 时永久删除资源),或者设置为 Detach(这只会拆离资源并将其保留在 Azure 中,以便以后可以重用)。 针对使用 PowerShell 创建的 VM 的默认设置为当你删除 VM 时会拆离 OS 磁盘。 你为其设置了 Detach 的资源(如磁盘)会继续产生费用(如果适用)。
DeleteOption 参数包括:
-OSDiskDeleteOption - OS 磁盘。 
-DataDiskDeleteOption - 数据磁盘。 
-NetworkInterfaceDeleteOption - NIC。 
在此示例中,我们将创建一个 VM,并将 OS 磁盘和 NIC 设置为在我们删除 VM 时删除。
New-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Name "myVM" `
    -OSDiskDeleteOption Delete `
    -NetworkInterfaceDeleteOption Delete `
    -Location "China East" `
    -VirtualNetworkName "myVnet" `
    -SubnetName "mySubnet" `
    -SecurityGroupName "myNetworkSecurityGroup" `
    -PublicIpAddressName "myPublicIpAddress"
此示例演示如何将数据磁盘和 NIC 设置为在删除 VM 时删除。 请注意,api-version 参数中指定的 API 版本必须为“2021-03-01”或更高才能配置删除选项。
PUT
https://management.chinacloudapi.cn/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Compute/virtualMachines/myVM?api-version=xx
{
  "storageProfile": {
    "dataDisks": [
        {
          "diskSizeGB": 1023,
          "name": "myVMdatadisk",
          "createOption": "Empty",
          "lun": 0,
          "deleteOption": "Delete"
       }
    ]
  },
  "networkProfile": {
      "networkInterfaces": [
        {
          "id": "/subscriptions/.../Microsoft.Network/networkInterfaces/myNIC",
          "properties": {
            "primary": true,
  	        "deleteOption": "Delete"
          }
        }
      ]
  }
}
你还可以为与 NIC 关联的公共 IP 设置此属性,以便在删除 NIC 时自动删除该公共 IP。
PUT https://management.chinacloudapi.cn/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.Network/networkInterfaces/test-nic?api-version=xx
{
  "properties": {
    "enableAcceleratedNetworking": true,
    "ipConfigurations": [
      {
        "name": "ipconfig1",
        "properties": {
          "publicIPAddress": {
            "id": "/subscriptions/../publicIPAddresses/test-ip",
            "properties": {
              "deleteOption": "Delete"
            }
          },
          "subnet": {
            "id": "/subscriptions/../virtualNetworks/rg1-vnet/subnets/default"
          }
        }
      }
    ]
  },
  "location": "chinaeast"
}
 
更新现有 VM 上的删除行为
可以在删除 VM 时更改行为。
以下示例将删除选项设置为 detach,以便可以重用磁盘。
az resource update --resource-group myResourceGroup --name myVM --resource-type virtualMachines --namespace Microsoft.Compute --set properties.storageProfile.osDisk.deleteOption=detach
以下示例在删除 VM 时更新 VM 以删除操作系统磁盘、所有数据磁盘和所有 NIC。
$vmConfig = Get-AzVM -ResourceGroupName myResourceGroup -Name myVM
$vmConfig.StorageProfile.OsDisk.DeleteOption = 'Delete'
$vmConfig.StorageProfile.DataDisks | ForEach-Object { $_.DeleteOption = 'Delete' }
$vmConfig.NetworkProfile.NetworkInterfaces | ForEach-Object { $_.DeleteOption = 'Delete' }
$vmConfig | Update-AzVM
以下示例更新 VM 以在删除 VM 时删除 NIC、OS 磁盘和数据磁盘。 请注意,api-version 参数中指定的 API 版本必须为“2021-03-01”或更高才能配置删除选项。
PATCH https://management.chinacloudapi.cn/subscriptions/subID/resourceGroups/resourcegroup/providers/Microsoft.Compute/virtualMachines/testvm?api-version=2021-07-01
{
    "properties": {
        "hardwareProfile": {
            "vmSize": "Standard_D2s_v3"
        },
        "storageProfile": {
            "imageReference": {
                "publisher": "MicrosoftWindowsServer",
                "offer": "WindowsServer",
                "sku": "2019-Datacenter",
                "version": "latest",
                "exactVersion": "17763.3124.2111130129"
            },
            "osDisk": {
                "osType": "Windows",
                "name": "OsDisk_1",
                "createOption": "FromImage",
                "caching": "ReadWrite",
                "managedDisk": {
                    "storageAccountType": "Premium_LRS",
                    "id": "/subscriptions/subID/resourceGroups/resourcegroup/providers/Microsoft.Compute/disks/OsDisk_1"
                },
                "deleteOption": "Delete",
                "diskSizeGB": 127
            },
            "dataDisks": [
                {
                    "lun": 0,
                    "name": "DataDisk_0",
                    "createOption": "Attach",
                    "caching": "None",
                    "writeAcceleratorEnabled": false,
                    "managedDisk": {
                        "storageAccountType": "Premium_LRS",
                        "id": "/subscriptions/subID/resourceGroups/resourcegroup/providers/Microsoft.Compute/disks/DataDisk_0"
                    },
                    "deleteOption": "Delete",
                    "diskSizeGB": 1024,
                    "toBeDetached": false
                },
                {
                    "lun": 1,
                    "name": "DataDisk_1",
                    "createOption": "Attach",
                    "caching": "None",
                    "writeAcceleratorEnabled": false,
                    "managedDisk": {
                        "storageAccountType": "Premium_LRS",
                        "id": "/subscriptions/subID/resourceGroups/resourcegroup/providers/Microsoft.Compute/disks/DataDisk_1"
                    },
                    "deleteOption": "Delete",
                    "diskSizeGB": 1024,
                    "toBeDetached": false
                }
            ]
        },
        "osProfile": {
            "computerName": "testvm",
            "adminUsername": "azureuser",
            "windowsConfiguration": {
                "provisionVMAgent": true,
                "enableAutomaticUpdates": true,
                "patchSettings": {
                    "patchMode": "AutomaticByOS",
                    "assessmentMode": "ImageDefault",
                    "enableHotpatching": false
                }
            },
            "secrets": [],
            "allowExtensionOperations": true,
            "requireGuestProvisionSignal": true
        },
        "networkProfile": {
            "networkInterfaces": [
                {
                   "id": "/subscriptions/subID/resourceGroups/resourcegroup/providers/Microsoft.Network/networkInterfaces/nic336",
                   "properties": {
                     "deleteOption": "Delete"
                    }
                }
            ]
        }
    }
}
 
VM 的强制删除
使用强制删除,你可以强制删除虚拟机,降低删除延迟并立即释放附加的资源。 对于不需要正常关闭的 VM,Force Delete 将尽快删除 VM,同时从 VM 中缓解逻辑资源,从而绕过正常关闭和某些清理操作。 Force Delete 不会立即释放与 VM 关联的 MAC 地址,因为这是一种物理资源,可能需要最多 10 分钟才能释放。 如果需要在新虚拟机上立即重用 MAC 地址,则不建议强制删除。 仅当不打算重用虚拟硬盘时,才应使用强制删除。 可以通过门户、CLI、PowerShell 和 Rest API 来使用强制删除。
要删除现有 VM 时,可以在“删除”窗格中找到相应选项来应用强制。
- 打开门户。
 
- 导航到虚拟机。
 
- 在“概览”  页上,选择“删除”  。
 
- 在“删除虚拟机”窗格中,选中“应用强制删除”复选框。
 
- 选择“确定”。
 
为 az vm delete 使用 --force-deletion 参数。
az vm delete \
    --resource-group myResourceGroup \
    --name myVM \
    --force-deletion none
将 -ForceDeletion 参数用于 Remove-AzVm。
Remove-AzVm `
    -ResourceGroupName "myResourceGroup" `
    -Name "myVM" `
    -ForceDeletion $true
可以使用 Azure REST API 将强制删除应用到虚拟机。 将 forceDeletion 参数用于虚拟机 - 删除。
 
规模集的强制删除
使用强制删除,你可以强制删除虚拟机规模集,降低删除延迟并立即释放附加的资源。 Force Delete 不会立即释放与 VM 关联的 MAC 地址,因为这是一种物理资源,可能需要最多 10 分钟才能释放。 如果需要立即在新 VM 上重用 MAC 地址,则建议不要使用强制删除。 仅当不打算重用虚拟硬盘时,才应使用强制删除。 可以通过门户、CLI、PowerShell 和 Rest API 来使用强制删除。
要删除现有规模集时,可以在“删除”窗格中找到相应选项来应用强制。
- 打开门户。
 
- 导航到你的虚拟机规模集。
 
- 在“概览”  页上,选择“删除”  。
 
- 在“删除虚拟机规模集”窗格中,选中“应用强制删除”复选框。
 
- 选择“确定”。
 
对 --force-deletion 使用 az vmss delete 参数。
az vmss delete \
    --resource-group myResourceGroup \
    --name myVMSS \
    --force-deletion true
为 Remove-AzVmss 使用 -ForceDeletion 参数。
Remove-AzVmss `
    -ResourceGroupName "myResourceGroup" `
    -Name "myVMSS" `
    -ForceDeletion $true
可以使用 Azure REST API 对规模集应用强制删除。 需要使用 forceDeletion 参数,请参阅虚拟机规模集 - 删除。
 
FAQ
问:此功能是否适用于共享磁盘?
答:对于共享磁盘,不能将“deleteOption”属性设置为“Delete”。 可以将其留空,或将其设置为“Detach”
问:哪些 Azure 资源支持此功能?
答:用作 OS 磁盘和数据磁盘的所有托管磁盘类型、NIC 和公共 IP 都支持此功能
问:是否可以在未与 VM 关联的磁盘和 NIC 上使用此功能?
答:不可以,此功能仅适用于与 VM 关联的磁盘和 NIC。
问:此功能如何与灵活虚拟机规模集配合使用?
答:对于灵活虚拟机规模集,磁盘、NIC 和 PublicIP 会将 deleteOption 默认设置为 Delete,因此在删除 VM 时,会自动清理这些资源。
对于显式创建并附加到 VM 的数据磁盘,如果希望在删除 VM 后保留磁盘,可以将此属性修改为“Detach”而不是“Delete”。
问:如何保留与 VM 关联的磁盘、NIC 和公共 IP?
答:默认情况下,在删除 VM 时,将会保留与该 VM 关联的磁盘、NIC 和公共 IP。 如果将这些资源配置为自动删除,则可以更新设置,使这些资源在删除 VM 后得以保留。 若要保留这些资源,请将 deleteOption 属性设置为 Detach。
后续步骤
若要了解有关基本 VM 管理的详细信息,请参阅教程:使用 Azure CLI 创建和管理 Linux VM。