遍历ARM模板中的复杂JSON变量

时间:2019-06-22 10:06:46

标签: azure arm-template

在我的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转换为数组并获取其长度以进行循环(是这个主意,我不知道它是否真的有效),但是我不清楚如何从上面的变量中提取子网名称和地址前缀。

1 个答案:

答案 0 :(得分:0)

所以这里有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
    }
]

这里的主要缺点-您必须有一个嵌套的部署,因为您实际上不能在数组内迭代数组,因此您必须将数组内的每个对象馈送到一个部署中,该部署将创建一个虚拟网络,其中可以包含各种子网。

您可以咨询this link以获得此确切方法的示例,或查阅官方的Azure Building Blocks组件way of doing this(该方法非常相似,但实现方式有所不同)。

您可以摆脱其他资源,而不必进行迭代,但这意味着您不够灵活,每次更改输入内容时,一切都会中断,或者像您认为的那样无法正常工作(您的方式会如果该变量中不存在dmz,则崩溃,您将得到编译错误,类似地,如果向对象添加另一个密钥,则说applicationgateway可以工作,但是虚拟网络将无法获得创建)

相关问题