使用 Azure Devops Pipeline 将标签(带空格)传递到 ARM 模板

Bru*_*uce 4 azure azure-devops

我正在使用 Azure DevOps Pipelines 来部署 ARM 模板。我的模板有一个标签参数,我使用它传递到管道中AzureResourceManagerTemplateDeployment@3

我的 ARM 模板在参数部分有一个值作为对象。tags是一个对象,这是许多示例模板所显示的内容:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "resourceName": {
      "type": "string",
      "metadata": {
        "description": "Specifies the name of the resource, including its prefix."
      }
    },
    "tags": {
      "type": "object",
      "defaultValue": {
        "Cost Center": "Admin"
      }
    }
  },
  "resources": [
    {
      "apiVersion": "2019-06-01",
      "kind": "StorageV2",
      "location": "[resourceGroup().location]",
      "name": "[parameters('resourceName')]",
      "properties": {
        "supportsHttpsTrafficOnly": true
      },
      "sku": {
        "name": "Standard_LRS"
      },
      "type": "Microsoft.Storage/storageAccounts",
      "tags": "[parameters('tags')]"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

[编辑以匹配随后的线程]

我用于ubuntu-latest我的游泳池。标签可能有空格。

为了简单起见,在我的管道中,我将标签设置为变量。

pool:
  vmImage: 'ubuntu-latest'
variables:
  - name: tags
    value: ("Location Region=West US 2" "Environment=${{ parameters.environment }}")
Run Code Online (Sandbox Code Playgroud)

当我调用模板部署时,我将标签作为overrideParameters

  - task: AzureResourceManagerTemplateDeployment@3
    displayName: "Deploy my templateaccount"
    inputs:
      deploymentScope: 'Resource Group'
      azureResourceManagerConnection: 'ResourceManager-connection'
      subscriptionId: ${{ parameters.subscriptionid }}
      action: 'Create Or Update Resource Group'
      resourceGroupName: '$(resourceGroupName)'
      location: '${{ parameters.location }}'
      templateLocation: 'Linked artifact'
      csmFile: 'mytemplatelocation/azuredeploy.json'
      overrideParameters: -resourceName abcdefg76534 -tags "$(tags)"
      deploymentMode: 'Incremental'
      deploymentOutputs: resourceOutput
  - pwsh: Write-Output '$(resourceOutput)'
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还不明白AzureResourceManagerTemplateDeployment@3Ubuntu 上如何期望发送标签。

在每种情况下,模板都无法部署。

Azure DevOps Pipeline 是否支持此场景?

有人有建议吗?

Bru*_*uce 5

Azure DevOps 管道中使用的标签格式AzureResourceManagerTemplateDeployment@3是对 ARM 模板对象(例如标签)使用 JSON。

  • 左大括号,冒号分隔键值对,逗号分隔标签。
  • 在我的例子中,每个键和值都使用引号。
  • 右花括号。

但以下模板通过传入 JSON 对象来工作:{"Cost Center":"DevTest","Location":"West US"}作为模板参数。在上下文中,这看起来像:

- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'ResourceManager-connection'
    subscriptionId: 'XXXXX'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'rg-wus2-exampletest'
    location: 'West US 2'
    templateLocation: 'Linked artifact'
    csmFile: 'storageaccount/example.azuredeploy.json'
    csmParametersFile: 'storageaccount/azuredeploy.parameters.json'
    overrideParameters: '-resourceName oweruhsow -resourceTags {"Cost Center":"DevTest","Location":"West US"}'
    deploymentMode: 'Complete'
Run Code Online (Sandbox Code Playgroud)

此管道模块需要 JSON 对象,而不是在其他地方使用 PowerShell ( https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/tag-resource ) 从命令部署的相同格式线。

另外,作为旁注,其他帖子建议您使用tags标签参数以外的名称。对我有用的是resourceTags. 这是我的 ARM 模板:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "resourceName": {
      "type": "string",
      "metadata": {
        "description": "Specifies the name of the resource"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for the resources."
      }
    },
    "resourceTags": {
      "type": "object",
      "defaultValue": {
        "Cost Center": "Admin"
      }
    }
  },
  "resources": [
    {
      "apiVersion": "2019-06-01",
      "kind": "StorageV2",
      "location": "[parameters('location')]",
      "name": "[parameters('resourceName')]",
      "properties": {
        "supportsHttpsTrafficOnly": true
      },
      "sku": {
        "name": "Standard_LRS"
      },
      "type": "Microsoft.Storage/storageAccounts",
      "tags": "[parameters('resourceTags')]"
    }
  ]
}

Run Code Online (Sandbox Code Playgroud)

如果要将模板对象设置为变量,则可以使用 DevOps 变量将其传递,例如$(tags)

variables:
  tags: '{"Cost Center":"DevTest","Location":"West US"}'
steps:
- task: AzureResourceManagerTemplateDeployment@3
  inputs:
    deploymentScope: 'Resource Group'
    azureResourceManagerConnection: 'ResourceManager-connection'
    subscriptionId: '9f241d6e-16e2-4b2b-a485-cc546f04799b'
    action: 'Create Or Update Resource Group'
    resourceGroupName: 'rg-wus2-exampletest'
    location: 'West US 2'
    templateLocation: 'Linked artifact'
    csmFile: 'storageaccount/example.azuredeploy.json'
    csmParametersFile: 'storageaccount/azuredeploy.parameters.json'
    overrideParameters: '-resourceName oweruhso11w -resourceTags $(tags)'
    deploymentMode: 'Complete'
Run Code Online (Sandbox Code Playgroud)

另外(作为旁注),由于某种原因,模块需要有一个,csmParametersFile否则它就会失败,并出现RESOURCEGROUP所有大写失败的情况。从命令行部署不需要参数文件,但管道模块似乎需要它。一个csmParamters文件中几乎什么都没有,但似乎是需要的。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": { }
  }
Run Code Online (Sandbox Code Playgroud)

这也可以使用pool image: windows-latest

非常感谢https://github.com/MicrosoftDocs/azure-devops-docs/issues/9051中的 ToMakesSense