使用 ARM 模板中的副本迭代列表

Iterate list using copy in ARM Template

我有一个 ARM 模板,我在其中提供了许多 Web 应用程序。我想对这些网络应用程序添加 IP 限制,只允许在这些应用程序之间进行访问。我可以使用以下方法检索 IP:

reference(resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1')),'2015-08-01').PossibleOutboundIpAddresses

以下是我不知道如何妥善解决的问题

  1. 我用变量替换了 resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1')) 部分,而不是将其缩短一点。我可以以某种方式进一步缩短它吗?它变得更加复杂,您很快就会看到。

  2. 我为每个包含属性部分的 Web 应用程序创建了一个资源部分。 ipSecurityRestrictions 位于此部分中。作为 PossibleOutboundIpAddresses returns 一个字符串,我使用 split 创建一个列表并复制以迭代 IP 地址。但它对我不起作用,returns 出现以下错误消息: The template function 'copyIndex' is not expected at this location. The function can only be used in a resource with copy specified

该部分如下所示:

"resources": [
            {
                "type": "config",
                "name": "web",
                "apiVersion": "2016-08-01",
                "properties": {
                    "copy": [
                        {
                            "name": "ipSecurityRestrictions",
                            "count": "[length(split(reference(variables('appName1'),'2015-08-01').PossibleOutboundIpAddresses, ','))]",
                            "input": {
                                "ipAddress": "[split(reference(variables('appName1'),'2015-08-01').PossibleOutboundIpAddresses, ',')[copyIndex('ipSecurityRestrictions')]]",
                                "subnetMask": "255.255.255.254"
                            }
                        }
                    ],
                },
                "dependsOn": [
                    "[resourceId('Microsoft.Web/sites', parameters('appName1'))]"
                ]
            }
        ]

我觉得我完全遵循了我可以在网上找到的所有示例。 另一个问题是每次我想引用 IP 列表时我都必须写很多字符。更糟糕的是,这个列表应该是所有已配置的网络应用程序的合并列表。因此,如果我有 3 个 Web 应用程序,这条线将变得非常长和复杂。

  1. 有更好的解决办法吗?

好的,第一个问题:我可以缩短它吗?
回答:这真的取决于你展示的内容,不是真的(如果资源在同一个模板中,你可以删除 api-version)。

第二个问题:模板函数'copyIndex'不应该出现在这个位置。该函数只能在指定副本的资源中使用。
回答:不幸的是,你不能那样做(runtime\compile 时代剧)。您必须使用嵌套模板才能获得相同的结果。

第三个问题:有没有更好的解决办法?
答:大概吧。我将创建所有 3 个网络应用程序作为嵌套部署(非内联)和 return 字符串数组(类似于您所做的)

"outputs" : {
    "array": {
         "type": "array",
         "value": "[split(reference(variables('appName')]"
    }
}

然后我会在单个 运行 中使用 concat 和类似您正在做的事情处理它们(但这也必须在嵌套模板中)。类似于:

"[concat(reference('deployment1').outputs.array.value, reference('deployment2').outputs.array.value, reference('deployment3').outputs.array.value)]"

然后在嵌套模板中您可以执行以下操作:

                "copy": [
                    {
                        "name": "ipSecurityRestrictions",
                        "count": "[length(parameters('myArray'))]",
                        "input": {
                            "ipAddress": "[parameters('myArray')[copyIndex('ipSecurityRestrictions')]]]",
                            "subnetMask": "255.255.255.254"
                        }
                    }
                ],