Azure RM模板。将复数值传递到第三级嵌套模板
我有一个包含2级嵌套模板的父级模板,azuredeploy.json-> vmReferenceTemplate.json-> datadiskreference.json当我将所需值从第二级传递到第三级时,它将部署很好,但是当从第一级到第三级嵌套模板传递完全相同的值时,它不起作用。我想从azuredeploy.json numDataDisks值datadiskreference.json我有一个非常复杂的模板,为了它的工作,我必须传递第一级的值。这是条纹的版本,工作。 azuredeploy.json:Azure RM模板。将复数值传递到第三级嵌套模板
{
"$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')]"
}
}
}
}
]
...
在这里,我们走吧,伙计,就像我在评论中所说的,让我们做一个魔术!让我们创建一个带有2个嵌套模板的模板,但是将1个嵌套模板的输出传递给另一个!
"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()]]"
}
}
}
}
我会更新链接不久,我决定重新命名我的模板了一点,但你可以把我的github上的样品来看看armotron repo了。
这是使用管理的磁盘为了简单,但您可以使用非托管(将是铁杆,你)
PS。您可能会再次遇到缓存问题,请复制不是来自RAW
链接的数据。只是测试了这个东西,对我有用,你可以进一步扩展它。
这是完美的!正是我在找什么。我只是意识到我没有传递来自lvl1-> lvl2-> lvl3的值,而是lvl2-> lvl1-> lvl2-> lvl3,这是不可能的,除非我在代码中的某处代码搞乱了。这条消息确实回答了我的问题。谢谢,@ 4c74356b41! – Max
虽然这不能直接回答你的问题,但它可能会对更好的解决方案提供一些启示。我们用ARM模板进行了几轮配置,以配置我们的Azure基础架构,包括您现在正在执行的嵌套模板。由于以下原因,我们最终放弃了嵌套模板:
- 它们最终在重用方面没有多大价值。每次我们想要重复使用共享模板时,它总是需要对相关特定场景进行一些调整。这意味着会影响版本号,进行调整并在公共互联网上提供新版本,同时还可以使用旧版本。
- 缺少条件结构(是的,你可以将它们入侵,但它使模板不清楚)使得实现可重用模板变得更加困难。
我们的ARM模板目前如下所示:每个资源组在Github帐户中都有自己的git-repository,并且资源组中的每个资源都有自己的模板。一个资源组的存储库看起来像这样:
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脚本相同。我们不再需要在没有身份验证的情况下在公共Internet上使用我们的ARM模板。您还会注意到,由于此ARM模板仅用于组的一个原因,因此我们不再需要参数文件,参数与其余代码一起处理。
我相信这个设置比一个巨大的ARM模板提供了更多的灵活性,这取决于嵌套的模板。我们可以孤立地管理我们想要的所有东西(如cloud-config.yaml
),并稍后使用脚本生成用于部署的ARM模板。我们目前正在尝试为每个部署创建一个git-tag,然后使用git来确定哪些文件自上次部署以来发生了更改。
他的情况有些不同,他需要那些因为vm和“keyvault”的“随机”数量的磁盘。但我对ARM模板也有些不满,他们有些缺乏 – 4c74356b41
没错,只是说如果起点是“一个非常复杂的模板”(正如ARM模板往往会出现的那样),并且他需要处理概念条件或其他基于逻辑的操作符,我会尽可能简单地创建ARM模板,并将其余部分留给更适合的脚本语言。 – gogstad
感谢您的输入。你的设置看起来非常有效。但是,我必须使用嵌套模板,因为它是实现多个虚拟机的变量数量的唯一方法。 https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#create-multiple-instances-when-copy-wont-work我也必须使用嵌套模板用于将密钥保管库中的机密作为这些VM的密码进行引用https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-keyvault-parameter#reference-a-secret-with-dynamic -id – Max
你是说你正在传递值1> 2> 3,它不能正确地从父母传播给孩子的孩子?另外,MS建议使用2级模板;)所以你认为1> 3,输出3到2?这样该模板只有2个级别? – 4c74356b41
是1> 2> 3未通过。我担心2级别不适合我,因为我将密钥库传递给了复制虚拟机(只能在复制虚拟机时使用嵌套模板完成),并将可变数量的数据磁盘传递给该副本虚拟机(只能是如果是复制虚拟机,也使用嵌套模板完成)。 – Max
我现在没时间了,但明天我会回到这里,告诉你我的意思。 – 4c74356b41