【问题标题】:Unable to run a correct Azure CLI command from Azure Devops CLI task (Bad request)无法从 Azure Devops CLI 任务运行正确的 Azure CLI 命令(错误请求)
【发布时间】:2021-09-23 07:59:45
【问题描述】:

我在 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

【问题讨论】:

    标签: azure-devops azure-pipelines azure-cli


    【解决方案1】:

    看起来您正在尝试从代理运行脚本。当您在门户中运行它时,它可能无法访问与您的用户相同的资源/权限。

    【讨论】:

    • 我不会这么说,因为运行az lock delete --ids [Lock ID] 来删除单个锁是可行的。但是,我需要自动执行此操作。我认为这与指挥管道有关。代理具有权限:用户访问管理员。
    【解决方案2】:

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

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

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

    返回:

    因此,我改为使用 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:

    删除资源的管理锁或低于该资源的任何级别 资源。要删除管理锁,您必须有权访问 Microsoft.Authorization/* 或 Microsoft.Authorization/locks/* 操作。 在内置角色中,只有所有者和用户访问管理员是 授予这些操作

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

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

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

    【讨论】:

    • 我的 Azure CLI 设置 gui 中没有脚本类型字段,只有“使用 Windows 代理时,使用批处理脚本,而使用基于 Linux 的代理时使用 shell 脚本。”
    • 检查了 Windows 和 Ubunt 代理,我有相同的脚本类型选项。请确保您使用了默认的 Azure CLI 任务:github.com/microsoft/azure-pipelines-tasks/tree/master/Tasks/…
    【解决方案3】:

    我设法通过在每个锁的以下代码中应用解决方法:

    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"
    

    【讨论】:

    • 很高兴知道它已解决,您可以将其标记为答案,这样也可以帮助遇到同样问题的其他人。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多