是否可以在 YAML 管道中创建带有标签的 Azure 资源组?

Is it possible to create an Azure Resource Group with tags in a YAML pipeline?

我们的订阅政策禁止任何人在未同时为其提供标签的情况下创建资源组。

Failed to create the resource group. Error: "Resource 'my-new-resource-group' was disallowed by policy. Policy identifiers: '[{"policyAssignment":{"name":"Require a tag on resource groups" etc...

在 ARM 模板中,我可以在创建资源时指定标签。我似乎无法对实际资源组执行此操作...

我使用的任务如下:

    - task: AzureResourceManagerTemplateDeployment@3
      displayName: Deploy ARM Template
      inputs:
        deploymentScope: 'Resource Group'
        azureResourceManagerConnection: '<<SERVICE CONNECTION>>'
        subscriptionId: '<<SUBSCRIPTIONID>>'
        action: 'Create Or Update Resource Group'
        resourceGroupName: "rg-$(resourcePrefix)-$(environmentShortName)"
        location: 'North Europe'
        templateLocation: 'Linked artifact'
        csmFile: '$(Pipeline.Workspace)/drop-iac/webapi.json'
        csmParametersFile: '$(Pipeline.Workspace)/drop-iac/webapi.parameters.json'
        deploymentMode: 'Incremental'

有没有办法在这个任务中指定标签?搜索文档没有得到任何有用的信息

无法使用 AzureResourceManagerTemplateDeployment@3 任务将 deploymentScope 设置为 Resource Group 来设置标签,如文档所述 here 没有执行此操作的参数。但是,如果您将 deploymentScope 更改为 Subscription 是可能的,但这将需要您将模板重构为订阅模板。这将允许您在模板中定义资源组及其标签,而不是依赖 AzureResourceManagerTemplateDeployment@3 任务来创建它。

有关于订阅模板的文档here,但简而言之,您需要:

如果您的 ARM 模板存储在应该很简单的 public 存储库中,否则您需要以某种方式通过 https 访问它们。过去我使用过 Azure 存储帐户并使用 SAS 令牌授予对文件的访问权限,但还有许多其他方法可以解决该问题。

尼克的回答非常全面,据我所知是正确的。

此处可行的一项添加是根据需要在 ARM 模板部署 Creating/Updating the Resource Group 之上执行 PowerShell 任务。在 YAML 管道中,这可能类似于:

- powershell: New-AzResourceGroup -Name RG01 -Location "South Central US" -Tag @{Department="Marketing"}

缺点当然是 PowerShell 是一次性的 运行,因为它创建了资源组。更好的建议可能是让一个单独的 PowerShell 脚本检查资源组是否存在,如果存在则创建它,如果不存在则执行 nothing/update 标记。此脚本将在部署 ARM 模板之前调用。