Вложенные шаблоны ARM: параметр _artifactLocation не заполняется правильно при развертывании шаблона с вложенными шаблонами - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь выяснить, как работают вложенные шаблоны, и у меня есть шаблоны ниже. Я пытаюсь выполнить развертывание из VS с использованием механизма развертывания VS:

  1. Щелкните правой кнопкой мыши проект> Развернуть> Новый
  2. Поле «Учетная запись хранилища артефактов» заполняется полем «Автоматически создавать учетную запись хранения», и я оставляю это так
  3. Нажмите на кнопку Deploy

Если вы посмотрите на шаблон HelloWorldParent.json в переменных, вы увидите две переменные "nestedTemplateUri" и "nestedTemplateUriWithBlobContainerName".

Насколько я понимаю, "nestedTemplateUri" должен содержать "имя контейнера BLOB-объектов", но это не так.

Если я развертываю с ресурсами> свойства> templateLink> "uri": "[variable ('nestedTemplateUri')]"

  • Развертывание завершается неудачно с:

Ошибка: Code = InvalidContentLink; Сообщение = невозможно загрузить развертывание содержание от «https://********.blob.core.windows.net/NestedTemplates/HelloWorld.json?sv=2017-07-29&sr=c&sig=ZCJAoOdp08qDWxbzKbXSZzX1VBCf7%2FNSt4aIznFCTPQ%3D&se=2019-03-12T03:39:09Z&sp=r'

  • Создана учетная запись хранения, загружены шаблоны, параметры и скрипт PS1
  • Новое развертывание не создано в группе ресурсов / развертываниях

Если я внедряю с ресурсами> properties> templateLink> "uri": "[variable ('nestedTemplateUriWithBlobContainerName')]"

  • Развертывание выполнено успешно.

Есть идеи? Любая помощь высоко ценится!

HelloWorldParent.json

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "_artifactsLocation": {
      "type": "string",
      "metadata": {
        "description": "The base URI where artifacts required by this template are located including a trailing '/'"
      }
    },
    "_artifactsLocationSasToken": {
      "type": "securestring",
      "metadata": {
        "description": "The sasToken required to access _artifactsLocation.  When the template is deployed using the accompanying scripts, a sasToken will be automatically generated. Use the defaultValue if the staging location is not secured."
      },
      "defaultValue": ""
    }
  },
  "variables": {
    "blobContainerName": "[concat(resourceGroup().name, '-stageartifacts/')]",
    "nestedTemplateUriWithBlobContainerName": "[uri(parameters('_artifactsLocation'), concat(variables('blobContainerName'), 'NestedTemplates/HelloWorld.json', parameters('_artifactsLocationSasToken')))]",
    "nestedTemplateUri": "[uri(parameters('_artifactsLocation'), concat('NestedTemplates/HelloWorld.json', parameters('_artifactsLocationSasToken')))]"
  },
  "resources": [
    {
      "apiVersion": "2017-05-10",
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "incremental",
        "templateLink": {
          "uri": "[variables('nestedTemplateUri')]",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
    "messageFromLinkedTemplate": {
      "type": "string",
      "value": "[reference('linkedTemplate').outputs.greetingMessage.value]"
    },
    "_artifactsLocation": {
      "type": "string",
      "value": "[parameters('_artifactsLocation')]"
    }
  }
}

HelloWorldParent.parameters.json

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

NestedTemplates / HelloWorld.json

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [],
  "outputs": {
    "greetingMessage": {
      "value": "Hello World (1)",
      "type": "string"
    }
  }
}

1 Ответ

1 голос
/ 13 марта 2019

К сожалению, VS немного «устарел» в своей поддержке вашего сценария ... проблема в том, что вы используете функцию URI, а у _artifactsLocation нет косой черты.Поэтому у вас есть несколько вариантов исправления:

1) в файле PS1 в VS есть строка, которая выглядит следующим образом:

$OptionalParameters[$ArtifactsLocationName] = $StorageAccount.Context.BlobEndPoint + $StorageContainerName

Если вы измените ее на это (добавьтеtrailing /):

$OptionalParameters[$ArtifactsLocationName] = $StorageAccount.Context.BlobEndPoint + $StorageContainerName + "/"

Это должно работать - в качестве альтернативы вы можете просто заменить весь скрипт следующим: https://github.com/Azure/azure-quickstart-templates/blob/master/Deploy-AzureResourceGroup.ps1

Обратите внимание, что если у вас есть другие шаблоны, которые работают без завершающегокосая черта, это будет серьезное изменение.

2) используйте concat () для создания uri вместо функции uri ().Вам все еще нужно знать, есть ли косая черта, но это изменение можно сделать в шаблоне, а не в файле PS1.

   "nestedTemplateUri": "[concat(parameters('_artifactsLocation'), '/NestedTemplates/HelloWorld.json', parameters('_artifactsLocationSasToken'))]"

Любой из них должен работать.

...