【问题标题】:Pass tags (with spaces) to an ARM template using Azure Devops Pipeline使用 Azure Devops Pipeline 将标签(带空格)传递给 ARM 模板
【发布时间】:2020-08-14 06:53:57
【问题描述】:

我正在使用 Azure DevOps Pipelines 部署 ARM 模板。我的模板有一个 tags 参数,我使用 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')]"
    }
  ]
}

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

我正在使用ubuntu-latest 作为我的游泳池。标签可能有空格。

在我的 simplicity 管道中,我将标签设置为一个变量。

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

当我调用模板部署时,我将标签作为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)'

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

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

Azure DevOps Pipeline 是否支持此方案?

有人有建议吗?

【问题讨论】:

  • 你能分享你收到的错误吗?
  • 错误是##[error]部署模板验证失败:'模板参数JToken类型无效。预期的“对象”。实际的“字符串”。请参阅aka.ms/resource-manager-parameter-files 了解使用详情。'.

标签: azure azure-devops


【解决方案1】:

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

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

另外作为旁注,其他帖子建议您将 tags 以外的名称用于您的 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')]"
    }
  ]
}

如果要将模板对象设置为变量,则可以使用 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'

另外(作为旁注),由于某种原因,模块需要有一个csmParametersFile,否则它会因为所有大写的RESOURCEGROUP 失败而失败。不需要从命令行部署 param 文件,但 Pipelines 模块似乎确实需要它。 一个csmParamters 文件,其中几乎没有任何内容,但似乎需要它。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": { }
  }

这也适用于 pool image: windows-latest

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

【讨论】:

    【解决方案2】:

    如果您使用的参数值包含多个单词,请将它们括在引号中,即使您使用变量传递它们也是如此。

    例如,-name "参数值" -name2 "$(var)"。

    尝试使用以下格式:

    overrideParameters: -location "${{ parameters.location }}" -tags "$(tags)"
    

    更多详情请参考我们的官方文档--Azure Resource Group Deployment task

    【讨论】:

    • 非常感谢您的建议。我真的希望它会奏效。我已根据您的建议更新了模板,因此也许您可以重现该错误。不幸的是,错误仍然存​​在。
    • @Bruce 根据您的错误,似乎存在模板有效错误。此参数“tags”:{“type”:“object”,被视为字符串而不是对象。根据官方文档,您似乎应该使用不同的名称 docs.microsoft.com/en-us/azure/azure-resource-manager/… 。此外,您还可以尝试在本地使用您的模板,而不是通过 Azure DevOps 检查这是否有效。这将有助于缩小问题范围
    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多