2017-02-22 2 views
1

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

Вот отрывок из моего шаблона ARM:

"webApp-resources": "[variables(concat('webApp-', parameters('env'), '-resources'))]", 
"webApp-dev-resources": [], 
"webApp-prod-resources": [ 
    { 
    "name": "staging", 
    "type": "Microsoft.Web/sites/slots", 
    "location": "[resourceGroup().location]", 
    "apiVersion": "2015-08-01", 
    "dependsOn": [ 
     "[resourceId('Microsoft.Web/sites', variables('webApp-name'))]" 
    ] 
    } 
], 

Идея проста, переменная ресурсы создаётся с помощью параметра env. Параметр env может быть либо dev, либо prod, и, хотя это работает, я получаю следующую ошибку при попытке развернуть этот шаблон.

{ 
    "name": "[variables('webApp-name')]", 
    "type": "Microsoft.Web/sites", 
    ... 
    "resources": "[variables('webApp-resources')]" // <- culprit! 
}, 

Содержание запроса является недействительным и не может быть десериализаций: «Ошибка преобразования значения„[переменные („WebAPP-ресурсы“)]“к типу» Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Schema .TemplateResource []. Path 'properties.template.resources [1] .resources', строка 195, позиция 64. '

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

resources: [ 
    "[variables('webApp-resource')]" // <- this doesn't work! 
] 

Это привело к аналогичной ошибке, но с другой ошибкой, если я правильно напомнил.

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

У кого-нибудь были подобные проблемы, как вы справились с проблемой?

+0

Фактически, я даже не уверен, отвечаю ли я на правильный вопрос, я не совсем понимаю вашу проблему, не можете ли вы разработать немного? – 4c74356b41

+0

Слоты для развертывания поддерживаются только стандартными и расширенными планами обслуживания приложений, для среды разработки не нужны слоты для развертывания, поэтому я решил не использовать их. Однако теперь у меня есть шаблон развертывания, который должен меняться в зависимости от того, в какую среду он развертывается. Это мне удалось сделать хорошо, но я не смог добавить слот развертывания «этап», чтобы этот слот существовал только в среде * prod *. * dev * среда использует базовый уровень, но * prod * использует стандартный уровень. Ошибки в моем вопросе изображают различные (IMAO) простые попытки сделать это. –

+0

Вы пытаетесь использовать 'variable' вместо' resource'? Я уверен, что вы не можете этого сделать, но вы можете создать слоты условно – 4c74356b41

ответ

3

Вы можете сделать это без нескольких файлов шаблонов, но не без использования вложенных развертываний. Поэтому в зависимости от того, чего вы пытаетесь избежать, попробуйте следующее:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "contentVersion": "1.0.0.0", 
    "parameters": { 
    "env": { 
     "type": "string", 
     "allowedValues": [ "dev", "prod" ] 
    } 
    }, 
    "variables": { 
    "resourceArray": "[variables(concat('resources', parameters('env')))]", 
    "resourcesprod": [ 
     { 
      "name": "as", 
      "type": "Microsoft.Compute/availabilitySets", 
      "location": "[resourceGroup().location]", 
      "apiVersion": "2015-06-15", 
      "dependsOn": [], 
      "properties": { 
      } 
     } 
     ], 
    "resourcesdev": [] 
    }, 
    "resources": [ 
     { 
     "name": "nest", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "dependsOn": [], 
     "properties": { 
      "mode": "Incremental", 
      "template": { 
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
      "contentVersion": "1.0.0.0", 
      "resources": "[variables('resourceArray')]" 
      }, 
      "parameters": { 
      } 
     } 
     } 
    ], 
    "outputs": {} 
} 
+0

Интересно. Я в основном сделал это, но я попытался сложить вложенные ресурсы шаблонов непосредственно в массив ресурсов. Нужно ли несколько раз указывать '$ schema' и' contentVersion'? Я хочу сохранить файл небольшим и компактным, если это возможно. –

+0

Есть ли что-нибудь, в частности, нужно знать о вложенных развертываниях. Я отметил, что они отображаются как отдельные развертывания в группе ресурсов. Какие у вас есть проблемы? –

+0

Я отредактировал код в исходном ответе - вы можете сделать его немного меньше, проверка схемы вызовет некоторые предупреждения, но она должна работать нормально. re: gotchas - ничего не могу думать о вашем OP. –

Смежные вопросы