Связанные шаблоны ARM приводят к неверному шаблону - PullRequest
0 голосов
/ 05 июля 2018

Давайте начнем с того, что я пытаюсь достичь.

То, что я хотел бы сделать, - это создать шаблон ARM, в котором я получаю секреты из хранилища ключей Azure, не указывая слишком много подробностей о конкретном хранилище ключей. Звучит достаточно легко и, вероятно, что-то, что реализовано в каждой производственной системе.

При быстром поиске я обнаружил синтаксис такой вещи: .

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

Из того, что я понял, вам нужно добавить это во внешний шаблон, поскольку используемые методы нельзя использовать в методе main.

Итак, я начал создавать «основной» шаблон ARM и новый шаблон под названием appservice.json, который содержит все необходимое для моей службы приложений, включая блок appSettings, который нуждается в секретах из хранилища ключей.

В моем основном шаблоне я сделал следующее: , как описано в документации .

{
      "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'.'"
  }

Я также попробовал следующее, потому что заметил, что IntelliSense в Visual Studio сказал мне, что 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 »не существует, доступные свойства» шаблон, параметры, режим, debugSetting, provisioningState '.. Подробную информацию об использовании см. в https://aka.ms/arm-template-expressions.'.

В это время я немного растерялся. Из того, что я понимаю из документации, видно, что я все делаю правильно. Видимо, я нет. Любые идеи о том, как продолжить это?

Для полноты, два фактических файла, которые я сейчас использую:

Было предпринято несколько итераций, чтобы попытаться исправить это, но, как уже упоминалось, пока замечено, что это работает.

1 Ответ

0 голосов
/ 05 июля 2018

Прежде всего, это , как вы должны использовать 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"
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...