代码之家  ›  专栏  ›  技术社区  ›  Jan_V

链接的ARM模板导致模板无效

  •  0
  • Jan_V  · 技术社区  · 6 年前

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

    我想做的是创建一个arm模板,在那里我可以从azure密钥库中检索机密,而不需要指定太多关于特定密钥库的详细信息。听起来很简单,而且可能是在每个生产系统中实现的。

    快速搜索我发现 the syntax for such a thing is the following 是的。

    "parameters": {
      "adminPassword": {
        "reference": {
          "keyVault": {
            "id": "[resourceId(subscription().subscriptionId,  parameters('vaultResourceGroup'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
          },
          "secretName": "[parameters('secretName')]"
        }
      },
    

    据我所知,您需要将其添加到外部模板中,因为使用的方法不能在“main”方法中使用。

    所以我开始创建一个“main”arm模板和一个名为 appservice.json 其中包含了我的应用程序服务所需的所有内容,包括 appSettings 需要密钥库中的秘密的块。

    在我的主模板中,我做了以下工作, as described in the documentation 是的。

    {
          "apiVersion": "2017-05-10",
          "name": "linkedTemplate",
          "type": "Microsoft.Resources/deployments",
          "properties": {
            "mode": "Incremental",
            "templateLink": {
              "uri": "[uri(deployment().properties.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'.'"
      }
    

    我还尝试了以下操作,因为我注意到visual studio中的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.42047 20Z[Y]错误部署模板验证失败:“模板变量'SyrdMtPayull”无效:语言表达式属性“TimePeleLink”不存在,可用属性是“模板、参数、模式、调试设置、提供状态”。请看 https://aka.ms/arm-template-expressions 有关用法的详细信息。

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

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

    为了尝试修复它,已经对它进行了多次迭代,但是正如前面提到的,到目前为止没有任何效果。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jan_V    6 年前

    首先, this 是如何在嵌套模板中使用KV的。管理员密码示例:

    "adminPassword": {
        "reference": {
            "keyVault": {
                "id": "kv_resource_id"
            },
            "secretName": "[concat('secret', copyindex(1))]"
        }
    },
    

    当您调用此部分时,它应该位于嵌套模板参数中(只需查看示例链接)。

    你的错误似乎在变量中。因此,templatelink属性仅在从url部署主模板时可用,如果使用本地文件部署主模板,则它将不起作用。

    enter image description here

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

    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"
    }
    }