我有一个ARM模板,我设置了一个负载均衡器,我想通过向LB添加规则和探测来添加一些端口.
这是我到目前为止的模板:
{ "type": "Microsoft.Network/loadBalancers", "name": "LB-front", "apiVersion": "2016-03-30", "location": "westeurope", "tags": { }, "properties": { "frontendIPConfigurations": [ { "name": "LoadBalancerIPConfig", "properties": { "privateIPAllocationMethod": "Dynamic", "publicIPAddress": { "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_lbipdev_0_name'))]" } } } ], "backendAddressPools": [ { "name": "LoadBalancerBEAddressPool" } ], "loadBalancingRules": [ { "name": "AppPortLBRule1", "properties": { "frontendIPConfiguration": { "id": "[parameters('loadBalancers_LB_dev_id_6')]" }, "frontendPort": 80, "backendPort": 80, "enableFloatingIP": false, "idleTimeoutInMinutes": 5, "protocol": "Tcp", "loadDistribution": "Default", "backendAddressPool": { "id": "[parameters('loadBalancers_LB_dev_id_7')]" }, "probe": { "id": "[parameters('loadBalancers_LB_dev_id_8')]" } } }, { "name": "AppPortLBRule2", "properties": { "frontendIPConfiguration": { "id": "[parameters('loadBalancers_LB_dev_id_9')]" }, "frontendPort": 81, "backendPort": 81, "enableFloatingIP": false, "idleTimeoutInMinutes": 5, "protocol": "Tcp", "loadDistribution": "Default", "backendAddressPool": { "id": "[parameters('loadBalancers_LB_dev_id_10')]" }, "probe": { "id": "[parameters('loadBalancers_LB_dev_id_11')]" } } }, { "name": "AppPortLBRule3", "properties": { "frontendIPConfiguration": { "id": "[parameters('loadBalancers_LB_dev_id_12')]" }, "frontendPort": 82, "backendPort": 82, "enableFloatingIP": false, "idleTimeoutInMinutes": 5, "protocol": "Tcp", "loadDistribution": "Default", "backendAddressPool": { "id": "[parameters('loadBalancers_LB_dev_id_13')]" }, "probe": { "id": "[parameters('loadBalancers_LB_dev_id_14')]" } } } ], "probes": [ { "name": "AppPortProbe1", "properties": { "protocol": "Tcp", "port": 80, "intervalInSeconds": 5, "numberOfProbes": 2 } }, { "name": "AppPortProbe2", "properties": { "protocol": "Tcp", "port": 81, "intervalInSeconds": 5, "numberOfProbes": 2 } }, { "name": "AppPortProbe3", "properties": { "protocol": "Tcp", "port": 82, "intervalInSeconds": 5, "numberOfProbes": 2 } } ], "inboundNatRules": [], "outboundNatRules": [], "inboundNatPools": [] }, "resources": [], "dependsOn": [ "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_lbipdev_1_name'))]" ] },
(省略一些细节)
我想要做的是拥有一个我想要创建规则和探测器的端口号数组,并循环遍历这些端口号,而不是明确地必须将每个规则和探测作为资源的属性进行编写.
基本上我想在我的模板中有一个参数或变量,如下所示:
"ports": [ 80, 81, 82, ...]
并且我可以循环这类似于:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple.
的确你可以!复制适用于属性!
像这样创建一个参数或变量(这个例子将使用参数数组):
"lbRules": { "type": "array", "defaultValue": [ { "name": "httpPort", "frontendPort": "80", "backendPort": "80", "protocol": "tcp" }, { "name": "customAppPort", "frontendPort": "8080", "backendPort": "8888", "protocol": "tcp" }, { "name": "httpsPort", "frontendPort": "443", "backendPort": "443", "protocol": "tcp" } ] }
在Loadbalancer资源中使用此参数,使用这样的副本,这将创建您在参数数组中定义的许多探针和规则:
{ "apiVersion": "[variables('lbApiVersion')]", "type": "Microsoft.Network/loadBalancers", "name": "[parameters('myLoadBalancer')]", "location": "[parameters('computeLocation')]", "dependsOn": [ "[concat('Microsoft.Network/publicIPAddresses/',concat(parameters('lbIPName'),'-','0'))]" ], "properties": { "frontendIPConfigurations": [ { "name": "LoadBalancerIPConfig", "properties": { "publicIPAddress": { "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('lbIPName'),'-','0'))]" } } } ], "backendAddressPools": [ { "name": "LoadBalancerBEAddressPool", "properties": {} } ], "copy": [ { "name": "probes", "count": "[length(parameters('lbRules'))]", "input": { "name": "[concat(parameters('lbRules')[copyIndex('probes')].name,'Probe')]", "properties": { "intervalInSeconds": 5, "numberOfProbes": 2, "port": "[parameters('lbRules')[copyIndex('probes')].backendPort]", "protocol": "[parameters('lbRules')[copyIndex('probes')].protocol]" } } }, { "name": "loadBalancingRules", "count": "[length(parameters('lbRules'))]", "input": { "name": "[parameters('lbRules')[copyIndex('loadBalancingRules')].name]", "properties": { "frontendIPConfiguration": { "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('myLoadBalancer')),'/frontendIPConfigurations/LoadBalancerIPConfig')]" }, "frontendport": "[parameters('lbRules')[copyIndex('loadBalancingRules')].frontendport]", "backendport": "[parameters('lbRules')[copyIndex('loadBalancingRules')].backendport]", "enableFloatingIP": false, "idleTimeoutInMinutes": "5", "protocol": "[parameters('lbRules')[copyIndex('loadBalancingRules')].protocol]", "backendAddressPool": { "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('myLoadBalancer')),'/backendAddressPools/LoadBalancerBEAddressPool')]" }, "probe": { "id": "[concat(variables('lbID0'),'/probes/', parameters('lbRules')[copyIndex('loadBalancingRules')].name,'Probe')]" } } } } ], "inboundNatPools": [] }, } }
更多信息可以在这里找到:https: //docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#property-iteration
您只能将复制对象应用于顶级资源。
您不能将其应用于资源类型的属性或子资源。
"resources": [ { "type": "{provider-namespace-and-type}", "name": "parentResource", "copy": { /* yes, copy can be applied here */ }, "properties": { "exampleProperty": { /* no, copy cannot be applied here */ } }, "resources": [ { "type": "{provider-type}", "name": "childResource", /* copy can be applied if resource is promoted to top level */ } ] } ]
报价来源:在Azure资源管理器模板中部署资源的多个实例
仅当将复制对象应用于顶级资源(在您的情况下为“ Microsoft.Network/loadBalancers”)时,才可以在ARM模板中循环属性,但是也会创建该资源的多个副本。
如果这不是您想要实现的,我建议您保留现有方式,直到将来ARM模板支持将对象复制到资源类型的属性上为止。