使用 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
以下是我不知道如何妥善解决的问题
我用变量替换了 resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1'))
部分,而不是将其缩短一点。我可以以某种方式进一步缩短它吗?它变得更加复杂,您很快就会看到。
我为每个包含属性部分的 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 应用程序,这条线将变得非常长和复杂。
- 有更好的解决办法吗?
好的,第一个问题:我可以缩短它吗?
回答:这真的取决于你展示的内容,不是真的(如果资源在同一个模板中,你可以删除 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"
}
}
],
我有一个 ARM 模板,我在其中提供了许多 Web 应用程序。我想对这些网络应用程序添加 IP 限制,只允许在这些应用程序之间进行访问。我可以使用以下方法检索 IP:
reference(resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1')),'2015-08-01').PossibleOutboundIpAddresses
以下是我不知道如何妥善解决的问题
我用变量替换了
resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('appName1'))
部分,而不是将其缩短一点。我可以以某种方式进一步缩短它吗?它变得更加复杂,您很快就会看到。我为每个包含属性部分的 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 应用程序,这条线将变得非常长和复杂。
- 有更好的解决办法吗?
好的,第一个问题:我可以缩短它吗?
回答:这真的取决于你展示的内容,不是真的(如果资源在同一个模板中,你可以删除 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"
}
}
],