Azure 链接的手臂模板导致模板无效

Azure 链接的手臂模板导致模板无效,azure,azure-devops,azure-keyvault,arm-template,Azure,Azure Devops,Azure Keyvault,Arm Template,让我们从我想要完成的事情开始 我想做的是创建一个ARM模板,在该模板中,我从Azure密钥库检索机密,而不需要在特定密钥库上指定太多细节。听起来很简单,可能在每个生产系统中都有实现 在快速搜索时我发现了 根据我收集的信息,您需要将此添加到外部模板中,因为所使用的方法不能用于“main”方法 因此,我开始创建一个“主”ARM模板和一个名为appservice.json的新模板,其中包含我的应用程序服务所需的所有内容,包括appSettings块,它需要密钥库中的机密 在我的主模板中,我完成了以下操

让我们从我想要完成的事情开始

我想做的是创建一个ARM模板,在该模板中,我从Azure密钥库检索机密,而不需要在特定密钥库上指定太多细节。听起来很简单,可能在每个生产系统中都有实现

在快速搜索时我发现了

根据我收集的信息,您需要将此添加到外部模板中,因为所使用的方法不能用于“main”方法

因此,我开始创建一个“主”ARM模板和一个名为
appservice.json
的新模板,其中包含我的应用程序服务所需的所有内容,包括
appSettings
块,它需要密钥库中的机密

在我的主模板中,我完成了以下操作

但是,在部署时,我会遇到以下错误

"error": {
    "code": "InvalidTemplate",
    "message": "Unable to process template language expressions for resource '/subscriptions/ba49bae7-2b37-4504-914b-441763a2bcd3/resourceGroups/cfpexchange-jan-test/providers/Microsoft.Resources/deployments/linkedTemplate' at line '1' and column '1526'. 'The language expression property 'templateLink' doesn't exist, available properties are 'name, properties'.'"
  }
我还尝试了以下方法,因为我注意到VisualStudio中的IntelliSense告诉我,
properties
不存在,我应该直接使用
templateLink

{
      "apiVersion": "2017-05-10",
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[uri(deployment().templateLink.uri, 'appservice.json')]",
          "contentVersion": "1.0.0.0"
        },
这当然也不对

   "error": {
    "code": "InvalidTemplate",
    "message": "Unable to process template language expressions for resource '/subscriptions/ba49bae7-2b37-4504-914b-441763a2bcd3/resourceGroups/cfpexchange-jan-test/providers/Microsoft.Resources/deployments/linkedTemplate' at line '1' and column '1526'. 'The language expression property 'templateLink' doesn't exist, available properties are 'name, properties'.'"
  }
当使用它作为变量时,就像在文档中一样

"variables": {
    "sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
  },
...
"properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[variables('sharedTemplateUrl')]",
          "contentVersion": "1.0.0.0"
        },
我也有一个错误

2018-07-04T19:14:34.4204720Z###[错误]部署模板验证失败:“模板变量'sharedTemplateUrl'无效:语言表达式属性'templateLink'不存在,可用属性为'template、parameters、mode、debugSetting、provisioningState'。。有关用法的详细信息,请参阅“”

这个时候我有点迷路了。从我对文档的理解来看,似乎我做的每件事都是正确的。显然我不是。关于如何继续这样做有什么想法吗

为了完整起见,我现在使用的两个实际文件:

  • 主臂模板:

  • 链接的模板:

为了尝试修复它,已经对它进行了多次迭代,但如前所述,到目前为止似乎没有任何效果。

首先,您应该如何在嵌套模板中使用KV。管理员密码示例:

"adminPassword": {
    "reference": {
        "keyVault": {
            "id": "kv_resource_id"
        },
        "secretName": "[concat('secret', copyindex(1))]"
    }
},
调用该部分时,该部分应该位于嵌套模板参数中(只需查看示例链接)

您的错误似乎在变量中。因此,templateLink属性仅在从url部署主模板时可用,如果使用本地文件部署主模板,则无法使用

将此与远程模板执行进行比较:

New-AzureRmResourceGroupDeployment -ResourceGroupName xxx -TemplateUri 'https://paste.ee/d/XI1Rc/0'
由于这是一个远程url,它应该向您显示相同的输出,但这次使用了
templateLink
属性

Name             Type                       Value
===============  =========================  ==========
test             Object                     {

"name": "theDeploymentName",
"properties": {
  "templateLink": {
    "uri": "theRemoteTemplateUri"
  },
  "template": {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [],
    "outputs": {
      "test": {
        "type": "Object",
        "value": "[deployment()]"
      }
    }
  },
  "parameters": {},
  "mode": "Incremental",
  "provisioningState": "Accepted"
}
}

谢谢让模板使用您提到的指定KV id(
“id”:“/subscriptions/c6af39f7-0fce-432b-98cd-c34fe14e6a66/resourceGroups/testo/providers/Microsoft.KeyVault/vaults/vaulty”
)确实可以解决这个问题。但是链接的文档和示例()显示,这些硬编码的值也可以(或者应该)用动态函数代替。今天晚些时候我会尝试一下templateLink的建议!是的,您可以使用函数来确定KV资源id,这只是一个示例。我主要在模板中使用
resourceId()
。关于KV reference,我的观点是:您在错误的位置使用它,它只能在模板的参数部分使用
,因此templateLink属性仅在您从url部署主模板时可用,如果您使用本地文件部署主模板,它将不起作用。
这可能是指向正确方向的一个好指针!我正在使用VST来处理部署。我猜buildserver正在本地下载所有工件,并从本地文件而不是远程文件中部署它。我会深入研究的,谢谢!
New-AzureRmResourceGroupDeployment -ResourceGroupName xxx -TemplateUri 'https://paste.ee/d/XI1Rc/0'
Name             Type                       Value
===============  =========================  ==========
test             Object                     {

"name": "theDeploymentName",
"properties": {
  "templateLink": {
    "uri": "theRemoteTemplateUri"
  },
  "template": {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [],
    "outputs": {
      "test": {
        "type": "Object",
        "value": "[deployment()]"
      }
    }
  },
  "parameters": {},
  "mode": "Incremental",
  "provisioningState": "Accepted"
}
}