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