Azure CLI - 删除资源而不删除资源组
Azure CLI - Delete resource without deleting resource group
目标是删除资源组中的所有资源,而不是使用 azure CLI 删除它。
通过阅读文档,我可以这样做:
az resource delete -g MyResourceGroup -n MyVm
因此我假设我可以执行以下操作
az resource list --resource-group MyResourceGroup | az resource delete
Azure Powershell 中的类似命令将像上面那样工作。我对 CLI 很陌生,这种方法可行吗?删除资源组中所有资源的有效方法是什么(如果我们有多种类型的资源)
如果可以 运行 Powershell 中的 Azure CLI,则可以使用 foreach
循环对每个对象 ID 使用 ConvertFrom-Json
to convert the JSON result to a list of objects from az resource list
, then run 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 使用 grep
and awk
.
自己解析 JSON 输出
#!/bin/bash
resources="$(az resource list --resource-group myResourceGroup | grep id | awk -F \" '{print }')"
for id in $resources; do
az resource delete --resource-group myResourceGroup --ids "$id" --verbose
done
正如 在评论中指出的那样,上面的主要问题是某些资源依赖于其他资源,因此删除顺序很重要。一个例子是在删除虚拟机之前不能删除虚拟机磁盘。
为了解决这个问题,我们可以定义一个资源类型的顺序来删除资源,如下面的示例散列 table 所示:
$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}
有一种更快更简单的方法:
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>
目标是删除资源组中的所有资源,而不是使用 azure CLI 删除它。
通过阅读文档,我可以这样做:
az resource delete -g MyResourceGroup -n MyVm
因此我假设我可以执行以下操作
az resource list --resource-group MyResourceGroup | az resource delete
Azure Powershell 中的类似命令将像上面那样工作。我对 CLI 很陌生,这种方法可行吗?删除资源组中所有资源的有效方法是什么(如果我们有多种类型的资源)
如果可以 运行 Powershell 中的 Azure CLI,则可以使用 foreach
循环对每个对象 ID 使用 ConvertFrom-Json
to convert the JSON result to a list of objects from az resource list
, then run 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 使用 grep
and awk
.
#!/bin/bash
resources="$(az resource list --resource-group myResourceGroup | grep id | awk -F \" '{print }')"
for id in $resources; do
az resource delete --resource-group myResourceGroup --ids "$id" --verbose
done
正如
为了解决这个问题,我们可以定义一个资源类型的顺序来删除资源,如下面的示例散列 table 所示:
$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}
有一种更快更简单的方法:
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>