无法从 Azure Devops CLI 任务 运行 正确的 Azure CLI 命令(错误请求)

Unable to run a correct Azure CLI command from Azure Devops CLI task (Bad request)

我是 运行 Azure 门户中 Azure CLI 的以下命令,它有效。

az resource list -g RG_SE_Polisen_Dev --query "[?type=='Microsoft.Storage/storageAccounts'].name" --output tsv | xargs -n 1 -t -I "{}" az lock delete -n "DevTestLabs Lock" -g RG_SE_Polisen_Dev --resource "{}" --resource-type "Microsoft.Storage/storageAccounts"

运行 通过 Azure Devops 管道中的 Azure CLI 任务执行相同的命令以实现自动化,出现以下错误:

在文本中:

E:\agent_1\_work\r30\a>az resource list -g RG_SE_Polisen_Dev --query "[?type=='Microsoft.KeyVault/vaults'].name" --output tsv   | xargs -n 1 -t -I '{}' az lock delete -n "DevTestLabs Lock" -g RG_SE_Polisen_Dev --resource '{}' --resource-type "Microsoft.KeyVault/vaults" 
2021-09-23T07:31:36.4258125Z az lock delete -n DevTestLabs Lock -g RG_SE_Polisen_Dev --resource SEDEVDTL9342
2021-09-23T07:31:36.4258390Z  --resource-type Microsoft.KeyVault/vaults 
2021-09-23T07:31:37.8440554Z ERROR: Operation returned an invalid status 'Bad Request'
2021-09-23T07:31:37.9668128Z ##[error]Script failed with error: Error: E:\agent_1\_work\_temp\azureclitaskscript1632382287742.bat failed with return code: 123

您似乎在尝试 运行 来自代理的脚本。当您在门户中 运行 它可能无法访问与您的用户相同的 resources/permissions。

已成功删除具有以下任务的所有存储帐户的锁:

  1. 观察你的问题截图,命令分为两行。无法使用 Azure CLI 任务中的命令正确获取 storageaccount 资源名称(但它在本地工作)。例如,我使用以下命令进行验证:

    az 资源列表 -g wadetestrg --query "[?type=='Microsoft.Storage/storageAccounts'].name" --output tsv | xargs -I "{}" echo "{}"

它returns:

因此,我改为使用 foreach 命令,它工作正常:

az resource list -g wadetestrg --query "[?type=='Microsoft.Storage/storageAccounts'].name" --output tsv | foreach-object {az lock delete -n "testlock3" -g wadetestrg --resource $_ --resource-type "Microsoft.Storage/storageAccounts"}
  1. 将所有者角色添加到在服务连接中创建的服务主体。

勾选doc:

Deletes the management lock of a resource or any level below the resource. To delete management locks, you must have access to Microsoft.Authorization/* or Microsoft.Authorization/locks/* actions. Of the built-in roles, only Owner and User Access Administrator are granted those actions.

在 Azure CLI 任务中,它使用服务连接来连接到您的订阅,这与本地计算机上的本地用户不同。

一个。转到项目设置 -> 服务连接 -> 找到你在 Azure CLI 任务中使用的服务连接 -> 管理服务主体 -> 它将重定向到 azure 门户服务主体 -> 请记下名称和客户端 ID。

b。转到您的资源组 -> 访问控制 (IAM) -> 将上一步中的服务主体添加为所有者角色。

我设法通过在以下代码中为每个锁应用变通方法:

for /f "delims=" %%i in ('az resource list -g RG_SE_Polisen_Dev --query "[?type=='Microsoft.KeyVault/vaults'].name" --output tsv') do set output=%%i
        
  az lock delete --ids "/subscriptions/{SubID}/resourcegroups/{Rg_name}/providers/Microsoft.KeyVault/vaults/%output%/providers/Microsoft.Authorization/locks/DevTestLabs Lock"