Azure CLI - 删除资源而不删除资源组

Posted

技术标签:

【中文标题】Azure CLI - 删除资源而不删除资源组【英文标题】:Azure CLI - Delete resource without deleting resource group 【发布时间】:2020-12-23 22:38:22 【问题描述】:

目标是删除资源组中的所有资源,而不使用 azure CLI 删除它。

通过阅读文档,我可以做到这一点:

az resource delete -g MyResourceGroup -n MyVm

因此我假设我可以做到以下几点

az resource list   --resource-group MyResourceGroup | az resource delete 

Azure Powershell 中的类似命令可以像上面那样工作。我对 CLI 很陌生,这种方法可行吗?删除资源组中所有资源的有效方法是什么(如果我们有多种类型的资源)

【问题讨论】:

【参考方案1】:

有一种更快更简单的方法:

az deployment group create --mode complete --template-uri data:application/json,%7B%22%24schema%22%3A%22https%3A%2F%2Fschema.management.azure.com%2Fschemas%2F2019-04-01%2FdeploymentTemplate.json%23%22%2C%22contentVersion%22%3A%221.0.0.0%22%2C%22resources%22%3A%5B%5D%7D --name clear-resources --resource-group <RG_NAME>

上面的数据URI(也可能是Base64编码的)代表这个文件:


"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": []

在 Azure DevOps 管道中,您必须传递具有上述 JSON 内容的实际文件,因为 DevOps 仅允许带有 --template-uri 的 HTTP(s) 方案:

az deployment group create --mode complete --template-file ./clear-resources.json --resource-group <RG_NAME>

【讨论】:

【参考方案2】:

如果您可以在 powershell 中运行 Azure CLI,您可以使用 ConvertFrom-Json 将 JSON 结果转换为来自 az resource list 的对象列表,然后使用 foreach 循环在每个对象 ID 上运行 az resource delete

$resources = az resource list --resource-group myResourceGroup | ConvertFrom-Json

foreach ($resource in $resources) 
    az resource delete --resource-group myResourceGroup --ids $resource.id --verbose

我们也可以使用 Foreach-Object 在管道中完全运行它,这与您尝试做的很接近。

az resource list --resource-group myResourceGroup 
    | ConvertFrom-Json
        | Foreach-Object az resource delete --resource-group myResourceGroup --ids $_.id --verbose

如果您根本不想使用 powershell,我们可以使用 bash 使用 grepawk 自己解析 JSON 输出。

#!/bin/bash

resources="$(az resource list --resource-group myResourceGroup | grep id | awk -F \" 'print $4')"

for id in $resources; do
    az resource delete --resource-group myResourceGroup --ids "$id" --verbose
done

正如@Hong Ooi 在 cmets 中有用地指出的那样,上述的主要问题是某些资源依赖于其他资源,因此删除顺序很重要。一个例子是在删除虚拟机之前不能删除虚拟机磁盘。

为了解决这个问题,我们可以定义删除资源的资源类型的顺序,如下面的示例哈希表所示:

$resourceOrderRemovalOrder = [ordered]@
    "Microsoft.Compute/virtualMachines" = 0
    "Microsoft.Compute/disks" = 1
    "Microsoft.Network/networkInterfaces" = 2
    "Microsoft.Network/publicIpAddresses" = 3
    "Microsoft.Network/networkSecurityGroups" = 4
    "Microsoft.Network/virtualNetworks" = 5

然后按照资源类型对资源进行排序并删除:

$resources = az resource list --resource-group myResourceGroup | ConvertFrom-Json

$orderedResources = $resources 
    | Sort-Object @
        Expression = $resourceOrderRemovalOrder[$_.type]
        Descending = $False
    

$orderedResources | ForEach-Object 
    az resource delete --resource-group myResourceGroup --ids $_.id --verbose

如果您愿意,也可以在一个管道中:

az resource list --resource-group myResourceGroup 
    | ConvertFrom-Json
        | Sort-Object @Expression = $resourceOrderRemovalOrder[$_.type]; Descending = $False
            | ForEach-Object az resource delete --resource-group myResourceGroup --ids $_.id --verbose

【讨论】:

简单循环的问题是资源可以依赖于其他资源。您必须确保删除以正确的顺序进行,否则资源管理器会抱怨。

以上是关于Azure CLI - 删除资源而不删除资源组的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 Azure 警报以通知任何资源删除

当资源组上有删除锁时,如何使用 Powershell 停止 Azure 数据工厂的存储事件触发器?

如何在 Microsoft azure 存储资源管理器工具中删除表列名称?

如何根据 Azure 中的部署名称删除所有已部署的资源

Terraform 重命名资源而不删除

Azure SQL 大删除