Перебор сложных переменных JSON в шаблонах ARM

В моем шаблоне 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 в массив и получить его длину для цикла (это идея, я не знаю, работает ли она на самом деле), но я не понимаю, как извлечь имя подсети и адресный префикс из моей переменной выше.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
0
497
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

так что тут 2 проблемы:

  1. нет возможности зациклить ключи объектов в шаблонах рук
  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 (которая очень похожа по подходу, но отличается реализацией).

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

Спасибо за эти две ссылки в дополнение к ответу.

rakhesh 22.06.2019 15:18

Другие вопросы по теме