在我的ARM模板中,我有一个名为“子网”的变量,该变量可以是3种类型。
如果它是typeA,那么我想要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": "..."
}
}
} ]
}
}
正如您在上面看到的那样,我在此VirtualNetwork资源中有一个copy
块,并且我想为typeA
网络创建各种子网。我认为我可以将subnets.typeA
转换为数组并获取其长度以进行循环(是这个主意,我不知道它是否真的有效),但是我不清楚如何从上面的变量中提取子网名称和地址前缀。
答案 0 :(得分:0)
所以这里有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
}
]
这里的主要缺点-您必须有一个嵌套的部署,因为您实际上不能在数组内迭代数组,因此您必须将数组内的每个对象馈送到一个部署中,该部署将创建一个虚拟网络,其中可以包含各种子网。
您可以咨询this link以获得此确切方法的示例,或查阅官方的Azure Building Blocks组件way of doing this(该方法非常相似,但实现方式有所不同)。
您可以摆脱其他资源,而不必进行迭代,但这意味着您不够灵活,每次更改输入内容时,一切都会中断,或者像您认为的那样无法正常工作(您的方式会如果该变量中不存在dmz
,则崩溃,您将得到编译错误,类似地,如果向对象添加另一个密钥,则说applicationgateway
可以工作,但是虚拟网络将无法获得创建)