2017-02-20 13 views
0

У меня есть родительский шаблон с 2 уровнями вложенных шаблонов, azuredeploy.json-> vmReferenceTemplate.json-> datadiskreference.json Когда я передаю требуемое значение со второго уровня до третьего, он развертывает отлично, но это не работает при передаче того же значения с 1-го уровня на 3-й уровень вложенного шаблона. Мне нужно значение numDataDisks от azuredeploy.json до datadiskreference.json У меня очень сложный шаблон, и для его работы я должен передать значение с 1-го уровня. Здесь работает полосатая версия. azuredeploy.json:Шаблон Azure RM. Передача комплексного значения в 3-й уровень вложенного шаблона

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 8, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "name": "[concat(parameters('vmName'), copyIndex(1),'-','reference')]", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "copy": { 
     "name": "vmReferenceTemplateLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('vmReferenceTemplateTemplateFolder'), '/', variables('vmReferenceTemplateTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "numDataDisks": { 
      "value": "[parameters('numberOfVMs')]" 
      } 
     } 
     } 
    } 
    ], 
... 

vmReferenceTemplate.json:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ... 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 2 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[parameters('dataDisksReferenceTemplateName')]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
     "name": "dataDiskReferenceLoop", 
     "count": "[parameters('copyNestedReference')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[variables('dataDiskReferenceTemplateUri')]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "vmName": { 
      "value": "[parameters('dataDisksVMnameReference')]" 
      }, 
      "storageAccountName": { 
      "value": "[variables('var_storageAccountName')]" 
      }, 
      "numDataDisks": { 
      "value": "[parameters('numberOfDataDisks')[copyIndex()]]" 
      }, 
      "sizeOfEachDataDiskInGB": { 
      "value": "[variables('sizeOfEachDataDiskInGB')]" 
      } 
     } 
     } 
    } 
    ], 
    ... 

И это, как я пытаюсь передать значение от 1-го уровня до 3-го уровня, но он терпит неудачу с ошибкой "Deployment template validation failed: 'The provided value for the template parameter 'numDataDisks' at line '36' and column '22' is not valid.'." azuredeploy .json

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 8, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "name": "[concat(parameters('vmName'), copyIndex(1),'-','reference')]", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "copy": { 
     "name": "vmReferenceTemplateLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('vmReferenceTemplateTemplateFolder'), '/', variables('vmReferenceTemplateTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "numDataDisks": { 
      "value": "[parameters('numberOfDataDisks')[copyIndex()]]" 
      } 
     } 
     } 
    } 
    ] 
... 

vmReferenceTemplate.json:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 2, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[parameters('dataDisksReferenceTemplateName')]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
     "name": "dataDiskReferenceLoop", 
     "count": "[parameters('copyNestedReference')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[variables('dataDiskReferenceTemplateUri')]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "vmName": { 
      "value": "[parameters('dataDisksVMnameReference')]" 
      }, 
      "storageAccountName": { 
      "value": "[variables('var_storageAccountName')]" 
      }, 
      "numDataDisks": { 
      "value": "[parameters('numDataDisks')]" 
      }, 
      "sizeOfEachDataDiskInGB": { 
      "value": "[variables('sizeOfEachDataDiskInGB')]" 
      } 
     } 
     } 
    } 
    ] 
... 
+0

Вы говорите, что передаете значение 1> 2> 3 и оно не распространяется должным образом от родителя к дочернему элементу ребенка? также MS советует использовать 2 уровня шаблонов;) так что вы считали 1> 3, вывод от 3 до 2? так что шаблон имеет только 2 уровня? – 4c74356b41

+0

Да 1> 2> 3 не проходит. Я боюсь, что 2 уровня для меня не подходят, поскольку я передаю ключи для копирования VM (может выполняться только с вложенным шаблоном в случае копий VM) и передавая переменное количество дисков данных на эти копии VM (может быть только сделанные с вложенным шаблоном в случае копий VM тоже). – Max

+0

У меня нет времени, но я вернусь к этому завтра и покажу вам, что я имею в виду. – 4c74356b41

ответ

3

Здесь мы идем, люди, как я уже сказал в комментариях, давайте совершить волшебный трюк! Давайте создадим шаблон с двумя вложенными шаблонами, но передадим вывод одного вложенного шаблона другому!

"resources": [ 
    { 
     ... 
     "dependsOn": [ 
      "datadiskcopy" << DEPENDS ON ANOTHER TEMPLATE COPY LOOP !!! 
     ], 
     ... 
      "parameters": { 
       "adminPassword": { 
        "reference": { 
         "keyVault": { 
          "id": "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.KeyVault/vaults/xxx" 
         }, 
         "secretName": "[concat('secret', copyindex(1))]" 
        } << KEYVAULT REFERENCE YOU NEED !! 
       }, 
       "diskObject": { 
        "value": "[reference(concat('nested-datadisk-', copyIndex())).outputs.result.value]" << REFERENCE ANOTHER NESTED DEPLOYMENT OUTPUT !! 
       } 
      } 
     } 
    }, 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[concat('nested-datadisk-', copyIndex())]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
      "name": "datadiskcopy", 
      "count": "[parameters('LoopCount')]" 
     }, 
     "properties": { 
      "mode": "Incremental", 
      "templateLink": { 
       "uri": "https://raw.githubusercontent.com/4c74356b41/armotron/master/ml-vm-ml-dd-kv-nst-dd", 
       "contentVersion": "1.0.0.0" 
      }, 
      "parameters": { 
       "numDataDisks": { 
        "value": "[parameters('numberOfDataDisksPerVM')[copyIndex()]]" 
       } 
      } 
     } 
    } 

Я буду обновлять ссылки в ближайшее время, как я решил переименовать мои шаблоны немного, но вы посмотрите на armotron repo на моем GitHub для образцов может уже.

Это использование управляемых дисков для простоты, но вы можете использовать неуправляемый (будет хардкор, ты)

PS. Возможно, вы снова столкнетесь с проблемой кеширования, скопируйте данные не из ссылки RAW. просто испытал эту вещь, работает для меня, вы можете расширить ее дальше.

+0

Это прекрасно! Именно то, что я искал. Я просто понял, что я не передавал значения из lvl1-> lvl2-> lvl3, а скорее lvl2-> lvl1-> lvl2-> lvl3, что невозможно, если только я не испортил код в этом коде. Это сообщение отвечает на мой вопрос. Спасибо, @ 4c74356b41! – Max

1

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

  1. Они оказались мало ценными с точки зрения повторного использования. Каждый раз, когда мы хотели повторно использовать общий шаблон, он почти всегда нуждался в некоторых корректировках для конкретного сценария. Это означало bump номер версии, внести коррективы и сделать новую версию доступной в общедоступном Интернете, а также иметь старые версии.
  2. Отсутствие конструкций для условных выражений (да, вы можете взломать их, но это делает шаблон неясным) сделало еще труднее получить многоразовые шаблоны.

Наши шаблоны ARM в настоящее время выглядят следующим образом: каждая группа ресурсов имеет свой собственный git-репозиторий в нашей учетной записи Github, и каждый ресурс в группе ресурсов имеет свой собственный шаблон. Репозиторий для группы ресурсов выглядит следующим образом:

my_group 
├── cloud-config.yaml 
├── deploy.ps1 
├── deploy.sh 
└── resources 
    ├── load_balancer.json 
    ├── nsg.json 
    ├── storage_account.json 
    └── virtual_machine.json 

Наличие отдельных шаблонов для каждого ресурса упрощает обслуживание. Файл deploy.sh в настоящий момент представляет собой только серию команд az group deployment create, которые развертывают все файлы, то же самое со сценарием powershell. Нам больше не нужно иметь наши ARM-шаблоны в общедоступном Интернете без аутентификации. Вы также заметите, что, поскольку этот ARM-шаблон предназначен только для одной группы причин, нам больше не нужны файлы параметров, параметры обрабатываются вместе с остальной частью кода.

Я считаю, что эта настройка обеспечивает гораздо большую гибкость, чем один гигантский шаблон ARM в зависимости от вложенных шаблонов. Мы можем управлять всем, что мы хотим изолировать (например, cloud-config.yaml), а затем использовать сценарии для создания ARM-шаблонов для развертывания. В настоящее время мы экспериментируем с созданием git-тега для каждого развертывания, а затем с помощью git, чтобы выяснить, какие файлы изменились с момента последнего развертывания.

+0

его дело несколько другое, ему нужны эти из-за «случайного» количества дисков для vm и из-за ключа. но я также немного расстроен шаблонами ARM, их несколько не хватает – 4c74356b41

+0

Правда, просто говоря, что если начальная точка является «очень сложным шаблоном» (поскольку ARM-шаблоны имеют тенденцию появляться), и ему нужны концепции для обработки условных операторов или других логических операторов, я бы создал как можно более простой ARM-шаблон и оставил остальную часть задания для более подходящих языков сценариев. – gogstad

+0

Спасибо за ввод. Ваша настройка выглядит невероятно эффективной. Тем не менее, я должен использовать вложенные шаблоны, так как это единственный способ реализовать переменные количество дисков для нескольких виртуальных машин. https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#create-multiple-instances-when-copy-wont-work, и я также должен использовать вложенные шаблоны для ссылки на секреты из ключевого хранилища в качестве пароля для этих виртуальных машин https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-keyvault-parameter#reference-a-secret-with-dynamic -id – Max

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

  • Нет связанных вопросов^_^