在arm模板中引用嵌套数组中的对象

时间:2016-11-02 14:53:05

标签: arrays json azure azure-resource-manager arm-template

我正在尝试基于几个数组创建多个资源。其中一个资源是一些存储帐户。我在嵌套数组中有这些存储帐户的名称:

"storageAccountArray": [
  "uniqueStringArray0",
  [
    "[toLower(concat(parameters('prefix'), 'vhd0', variables('uniqueSuffixID'), '0'))]",
    "[toLower(concat(parameters('prefix'), 'vhd0', variables('uniqueSuffixID'), '1'))]",
    "[toLower(concat(parameters('prefix'), 'vhd0', variables('uniqueSuffixID'), '2'))]",
    "[toLower(concat(parameters('prefix'), 'vhd0', variables('uniqueSuffixID'), '3'))]",
    "[toLower(concat(parameters('prefix'), 'vhd0', variables('uniqueSuffixID'), '4'))]"
  ],
  "uniqueStringArray1",
  [
    "[toLower(concat(parameters('prefix'), 'vhd1', variables('uniqueSuffixID'), '0'))]",
    "[toLower(concat(parameters('prefix'), 'vhd1', variables('uniqueSuffixID'), '1'))]",
    "[toLower(concat(parameters('prefix'), 'vhd1', variables('uniqueSuffixID'), '2'))]",
    "[toLower(concat(parameters('prefix'), 'vhd1', variables('uniqueSuffixID'), '3'))]",
    "[toLower(concat(parameters('prefix'), 'vhd1', variables('uniqueSuffixID'), '4'))]"
  ],
  "uniqueStringArray2",
  [
    "[toLower(concat(parameters('prefix'), 'vhd2', variables('uniqueSuffixID'), '0'))]",
    "[toLower(concat(parameters('prefix'), 'vhd2', variables('uniqueSuffixID'), '1'))]",
    etc....

我以为我可以这样迭代:

{
  "apiVersion": "[variables('storageApiVersion')]",
  "type": "Microsoft.Storage/storageAccounts",
  "name": "[variables('storageAccountArray')[0][copyIndex()]]",
  "location": "[variables('computeLocation')]",
  "copy": {
    "name": "storageLoop0",
    "count": "[variables('saCount0')]"

我将拥有其中几个存储帐户资源,所有资源都带有副本,因此名称将取自0,0然后是0,1 0,2等,并且在下一个资源上名称为:

"name": "[variables('storageAccountArray')[1][copyIndex()]]"

所以1,0 1,1 1,2等。

但是,当我尝试部署时,我收到此错误:

  

'模板资源   '[variables('storageAccountArray')[0] [copyIndex()]]'无效:   模板语言表达式属性   'Microsoft.WindowsAzure.ResourceStack.Frontdoor.Templates.Expressions.TemplateFunctionExpression'   无法评估。

根据这样的问题:Access / process (nested) objects, arrays or JSON json通常可以通过这种方式进行评估。 arm评估模板的方式是否阻止我这样做?

当我尝试将这些磁盘用作我的VM的操作系统磁盘时,也会循环创建许多虚拟机,我无法添加它们,因为我需要访问嵌套数组:

 "osDisk": {
          "vhdContainers": [
            "[concat('https://', variables('storageAccountArray')[copyIndex()][0], '.blob.core.windows.net/', parameters('vmStorageAccountContainerNameType0'))]",
            "[concat('https://', variables('storageAccountArray')[copyIndex()][1], '.blob.core.windows.net/', parameters('vmStorageAccountContainerNameType0'))]",
            "[concat('https://', variables('storageAccountArray')[copyIndex()][2], '.blob.core.windows.net/', parameters('vmStorageAccountContainerNameType0'))]",
etc...

我也尝试将嵌套数组分成多个,但是当我循环需要自己的存储帐户的VM时,我仍然需要增加一个数字,这似乎要求我不能在一个数字中创建VM循环。

我还可以将资源拆分为循环嵌套模板。我是否能够创建许多指向同一外部模板的“Microsoft.Resources / deployments”资源,然后每次传入一个不同的数字作为参数来增加数字?

有什么想法吗?谢谢你的时间

1 个答案:

答案 0 :(得分:1)

我认为您的数组语法错误,请在变量声明中尝试:

"m": [
  [ "a", "b", "c" ],
  [ "1", "2", "3" ]
]

IOW,删除你的" uniqueStringArray0"声明的一部分,即创建一个数组元素,它是一个字符串而不是一个数组,因此[0] [0]无效,但[1] [0]不是。