Цикл по сложным переменным JSON в шаблонах ARM - PullRequest
0 голосов
/ 22 июня 2019

В моем шаблоне ARM у меня есть переменная под названием «подсети», которая может быть трех типов.

Если это тип А, то я хочу 4 подсети с заданными именами и адресами; если это typeB, то 2 подсети и так далее.

"variables": {
    "subnets" : {
        "typeA" : {
            "network" : "3.0/24",
            "directory" : "5.0/24",
            "documents" : "8.0/24",
            "security" : "10.0/24",
        },
        "typeB" : {
            "directory" : "10.0/24",
            "database" : "11.0/24",
        },
        "dmz" : {
            "directory" : "12.0/24",
            "database" : "15.0/24",        }
    }
}  

В шаблоне ARM у меня есть параметр, который говорит мне, какой тип использовать. Итак, у меня есть сегмент, подобный приведенному ниже, который использует condition для сопоставления с subnetType, являющимся typeA, и соответственно создает виртуальную сеть.

{
    "type": "Microsoft.Network/virtualNetworks",
    "condition" : "[contains(parameters('subnetType'), 'typeA')]",
    "apiVersion": "2018-10-01",
        ...

      "copy" : [ {
            "name" : "subnets",
            "count" : "[length(array(variables('subnets').typeA))]",
            "input": {
                "name": "...",
                "properties": {
                    "addressPrefix": "..."

                }
            }
        } ]
    }
}

Как вы можете видеть выше, у меня есть блок copy в этом ресурсе VirtualNetwork, и я хочу создать различные подсети для сети typeA. Я полагаю, что я мог бы преобразовать subnets.typeA в массив и получить длину его для цикла ( это идея, я не знаю, работает ли она на самом деле ), но мне не ясно, как извлечь имя подсети и адрес префикса из моей переменной выше.

1 Ответ

0 голосов
/ 22 июня 2019

поэтому здесь есть 2 проблемы:

  1. нет способа зацикливания ключей объекта в шаблонах arm
  2. использование различных ресурсов в шаблоне для создания подсетей

нет способа обойти первое ограничение, о котором я знаю, тогда как второе ограничение в основном связано с тем, что вы пытаетесь обойти первое ограничение.Я бы пошел на совершенно другой подход:

"networks": [
    {
        "name": "typeA",
        "subnets": [
            {
                "name": "network",
                "addressSpace": "3.0/24"
            },
            {
                "name": "directory",
                "addressSpace": "5.0/24"
            },
            {
                "name": "documents",
                "addressSpace": "8.0/24"
            },
            {
                "name": "security",
                "addressSpace": "10.0/24"
            }
        ]
    },
    {
        // second virtual network
    },
    {
        // x virtual network
    }
]

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

Вы можете обратиться к по этой ссылке за примером такого точного подхода или по официальным материалам Azure Building Blocks thingie способ сделать это (что довольно похоже в подходе, но реализация отличается).

Вы могли бы обходиться с другими ресурсами вместо итераций, но это означает, что вы меньшегибкий и каждый раз, когда вы вносите изменения во входные данные, все ломается или просто не работает так, как вы думаете (ваш способ сделать это развалится, если dmz не существует в этой переменной, вы получите ошибку компиляции, аналогичноесли вы добавите еще один ключ к объекту, скажем applicationgateway, он будет работать, но эта виртуальная сеть работаетне создается)

...