如何在Azure ARM模板中链接模板?

时间:2019-01-16 14:06:35

标签: azure azure-devops azure-template

我有多个要链接的ARM模板。但是,当我使用"[uri(deployment().properties.templateLink.uri, 'transform.json')]"时,出现一条错误消息,告诉我在本地运行或通过Azure DevOps管道运行时,deployment()提供的对象不包含templateLink。

因此,我然后尝试将路径发送到在Azure DevOps "[concat(parameters('templateDirectory'), '/transform.json')]"中构建项目时创建的工件,然后在调用模板时将其作为参数提供。 但是后来我得到了这个错误

At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-debug for usage details.
Details:
BadRequest: {
"error": {
    "code": "InvalidContentLink",
    "message": "The provided content link 'file:///D:/a/r1/a/_Infrastructure/ARM/shared/transform.json' is invalid or not supported. Content link must be an absolute URI not referencing local host or UNC path."
}
} undefined
Task failed while creating or updating the template deployment.

所以我的问题是,通过Azure DevOps管道进行部署时,应该如何处理模板的链接?

我是否必须在构建步骤中将其复制到存储中,以便在部署步骤中可以使用http或https访问它,如果可以,最好的方法是什么?似乎有点复杂。

2 个答案:

答案 0 :(得分:3)

因此,如果要使用deployment().properties.templateLink.uri,则必须从URL而不是从本地磁盘部署模板。

嵌套模板始终必须从url部署。因此,如果您想使用上述方法,则必须将所有内容上传到可公开访问的某个位置(或必须通过URL(例如SAS令牌)进行身份验证)。

我通常要做的-在部署前运行一个简单的powershell脚本,将所有模板上传到一个公共位置,然后我仅使用部署功能。

答案 1 :(得分:1)

如果要生成ARM,请在上面进行扩展 要么 使用AzureResourceManagerTemplateDeployment@3部署生成的模板,您可以覆盖这样的变量

 - task: AzureResourceManagerTemplateDeployment@3
    inputs:
      deploymentScope: 'Resource Group'
      ... other values 
      deploymentMode: 'Validation'
      overrideParameters: '-LinkedTemplatesBaseUrl "$(BASE_URL)" -LinkedTemplatesUrlQueryString $(SAS_TOKEN)'

必须在LinkedTemplatesBaseUrl文件中定义LinkedTemplatesUrlQueryString*-parameters.json 仅在从安全存储中提取时使用LinkedTemplatesUrlQueryString(这是首选方式)

您可以使用AzureFileCopy@4复制模板

steps:
  - task: AzureFileCopy@4
    name: AzureFileCopyTask
    inputs:
      SourcePath: '$(System.DefaultWorkingDirectory)/build_dir/*.json'
      azureSubscription: $(AZURE_SUBSCRIPTION)
      Destination: 'AzureBlob'
      storage: $(STORAGE_ACCOUNT)
      ContainerName: $(STORAGE_CONTAINER)
      CleanTargetBeforeCopy: true
      BlobPrefix: $(STORAGE_PREFIX)

并使用提及的here

这样的输出变量