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')]" 
      } 
     } 
     } 
    } 
    ] 
... 
+0

你是说你正在传递值1> 2> 3,它不能正确地从父母传播给孩子的孩子?另外,MS建议使用2级模板;)所以你认为1> 3,输出3到2?这样该模板只有2个级别? – 4c74356b41

+0

是1> 2> 3未通过。我担心2级别不适合我,因为我将密钥库传递给了复制虚拟机(只能在复制虚拟机时使用嵌套模板完成),并将可变数量的数据磁盘传递给该副本虚拟机(只能是如果是复制虚拟机,也使用嵌套模板完成)。 – Max

+0

我现在没时间了,但明天我会回到这里,告诉你我的意思。 – 4c74356b41

在这里,我们走吧,伙计,就像我在评论中所说的,让我们做一个魔术!让我们创建一个带有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链接的数据。只是测试了这个东西,对我有用,你可以进一步扩展它。

+0

这是完美的!正是我在找什么。我只是意识到我没有传递来自lvl1-> lvl2-> lvl3的值,而是lvl2-> lvl1-> lvl2-> lvl3,这是不可能的,除非我在代码中的某处代码搞乱了。这条消息确实回答了我的问题。谢谢,@ 4c74356b41! – Max

虽然这不能直接回答你的问题,但它可能会对更好的解决方案提供一些启示。我们用ARM模板进行了几轮配置,以配置我们的Azure基础架构,包括您现在正在执行的嵌套模板。由于以下原因,我们最终放弃了嵌套模板:

  1. 它们最终在重用方面没有多大价值。每次我们想要重复使用共享模板时,它总是需要对相关特定场景进行一些调整。这意味着会影响版本号,进行调整并在公共互联网上提供新版本,同时还可以使用旧版本。
  2. 缺少条件结构(是的,你可以将它们入侵,但它使模板不清楚)使得实现可重用模板变得更加困难。

我们的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来确定哪些文件自上次部署以来发生了更改。

+0

他的情况有些不同,他需要那些因为vm和“keyvault”的“随机”数量的磁盘。但我对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我也必须使用嵌套模板用于将密钥保管库中的机密作为这些VM的密码进行引用https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-keyvault-parameter#reference-a-secret-with-dynamic -id – Max