Параметр с вложенным массивом - возможна ли итерация? - PullRequest
0 голосов
/ 16 апреля 2020

Можно ли использовать вложенные массивы в свойствах? Предполагая, что верхний массив будет родительским ресурсом, а вложенный массив - дочерними для каждого родителя. Я хотел бы затем повторить все родители, а затем все дочерние элементы, связанные для каждого родителя.

Вот пример шаблона ARM. Где я создаю ServiceBus с Темами и Подписками. С каждой версией c будет связана как минимум одна подписка. Было бы проще всего определить свойства для Темы - Подписки во вложенных массивах, как в примере ниже.

{
  "$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 Ответ

0 голосов
/ 16 апреля 2020

так что у вас есть 2 варианта:

  1. Жесткий код каждого ресурса, поэтому создайте 1 ресурс для 1 объекта в массиве и таким образом вы сможете выполнять итерации, но при добавлении \ удалении объектов из массив - вам нужно будет настроить шаблон (не оптимально, очевидно)
  2. Использовать вложенный шаблон. Позвольте мне уточнить немного:

not sure how to reset the list counter, lol

  1. Создать вложенное развертывание в шаблоне, который выполняет итерацию базового массива, так что serviceBusTopics
  2. pass текущая итерация к вложенному шаблону: "[parameters('serviceBusTopics')[copyIndex()]]"
  3. во вложенном шаблоне вы имеете дело только с одним объектом, который имеет одно из свойств массива типов, и вы можете выполнять итерацию этого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...