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

时间:2018-11-22 09:11:38

标签: arm-template azure-deployment

我有一个ARM模板,其中提供了许多Web应用程序。我想在这些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返回一个字符串,因此我使用split创建了一个列表并复制以迭代IP地址。但这对我不起作用,并返回以下错误消息: 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列表时都必须写许多字符。更糟糕的是,此列表应该是所有已配置的Web应用程序中的合并列表。因此,如果我有3个Web应用程序,那么这条线将是难以置信的漫长而复杂。

  1. 是否有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

好,第一个问题:我可以缩短它吗?
答:这实际上取决于您显示的内容,而不取决于(如果资源位于同一模板中,则可以删除api版本)。

第二个问题:在此位置不应使用模板函数'copyIndex'。该功能只能在指定了副本的资源中使用。
答:很遗憾,您无法做到这一点(运行时\编译时播放)。您必须使用嵌套模板才能实现相同的结果。

第三个问题:对此有更好的解决方法吗?
答:可能。我将所有3个Web应用程序创建为嵌套部署(非内联),并返回一个字符串数组(类似于您的操作)

"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"
                        }
                    }
                ],