嵌套数组的参数 - 是否可以迭代?

Parameter with nested array - is iteration possible?

是否可以在属性中使用嵌套数组?假设顶部数组是 parent 资源,嵌套数组是每个 parent 的 child 资源。然后我想迭代所有 parents,然后迭代每个 parent 关联的所有 childs。

这是一个示例 ARM 模板。我在其中创建带有主题和订阅的 ServiceBus。每个主题至少有一个与之关联的订阅。在嵌套数组中定义主题 - 订阅的属性是最简单的,如下例所示。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "serviceBus": {
      "defaultValue": {
        "location": "uksouth",
        "name": "myNewSB1",
        "skuCapacity": 1,
        "skuName": "Standard",
        "skuTier": "Standard"
      },
      "type": "object"
    },
    "serviceBusTopics": {
      "defaultValue": [
        {
          "name": "topic1",
          "subscriptions": [
            "topic1-sub1",
            "topic1-sub2"
          ]
        },
        {
          "name": "topic2",
          "subscriptions": [
            "topic2-subAbc"
          ]
        },
        {
          "name": "topicOther",
          "subscriptions": [
            "topicOther-subDef1",
            "topicOther-subDef2",
            "topicOther-subDef3",
            "topicOther-subDef4"
          ]
        }
      ],
      "type": "array"
    }
  },
  "resources": [
    {
      "apiVersion": "2017-04-01",
      "location": "[parameters('serviceBus').location]",
      "name": "[parameters('serviceBus').name]",
      "sku": {
        "capacity": "[parameters('serviceBus').skuCapacity]",
        "name": "[parameters('serviceBus').skuName]",
        "tier": "[parameters('serviceBus').skuTier]"
      },
      "type": "Microsoft.ServiceBus/namespaces"
    },
    {
      "apiVersion": "2017-04-01",
      "copy": {
        "count": "[length(parameters('serviceBusTopics'))]",
        "mode": "Parallel",
        "name": "topicsLoop"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ServiceBus/namespaces', parameters('serviceBus').name)]"
      ],
      "name": "[concat(parameters('serviceBus').name, '/', parameters('serviceBusTopics')[copyIndex()].name)]",
      "type": "Microsoft.ServiceBus/namespaces/topics"
    },
    {
      "apiVersion": "2017-04-01",
      "copy": {
        "count": "[length(<...>)]",
        "mode": "Parallel",
        "name": "subscriptionsLoop"
      },
      "dependsOn": [
        "topicsLoop"
      ],
      "name": "[concat(parameters('serviceBus').name, '/', <...>, '/', <...>)]",
      "type": "Microsoft.ServiceBus/namespaces/topics/subscriptions"
    }
  ]
}

所以你有两个选择:

  1. 对每个资源进行硬编码,因此为数组中的 1 个对象创建 1 个资源,这样您就可以迭代,但是当您 add\remove 数组中的对象时 - 您将需要调整模板 (显然不是最优的)
  2. 使用嵌套模板。让我详细说明一下:

not sure how to reset the list counter, lol

  1. 在迭代基本数组的模板中创建嵌套部署,因此 serviceBusTopics
  2. 将当前迭代传递给嵌套模板:"[parameters('serviceBusTopics')[copyIndex()]]"
  3. 在嵌套模板中,您只处理具有数组类型属性之一的单个对象,您可以对其进行迭代。