Azure ARM内联IF不生效:VNET模板第二子网条件创建问题
Azure ARM模板:通过内联条件控制第二个子网的创建
嘿,我懂你想在ARM模板里用内联条件决定要不要创建第二个子网,之前试了json('null')没达到预期对吧?别着急,咱们来理清楚问题所在,然后给出可行的解决方案。
首先得说清楚:直接在子网数组里放json('null')是行不通的,因为ARM模板要求子网数组里的每个元素都必须是有效的子网对象,null并不是合法的子网定义,模板会因为这个无效元素报错,而不是跳过创建操作。
正确的思路是动态生成子网数组的内容——根据条件判断,要么把第二个子网包含在数组里,要么完全不包含它。下面给你两种常用的实现方式:
方法1:用if()函数直接返回完整的子网数组
先定义一个布尔型参数来控制是否创建第二个子网,然后在subnets字段里用if()函数返回对应长度的数组:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "createSecondSubnet": { "type": "bool", "defaultValue": false, "metadata": { "description": "是否创建第二个子网" } } }, "resources": [ { "apiVersion": "2016-06-01", "type": "Microsoft.Network/virtualNetworks", "name": "My-VNET", "location": "[resourceGroup().location]", "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "subnets": "[if(parameters('createSecondSubnet'), array( { \"name\": \"FirstSubnet\", \"properties\": { \"addressPrefix\": \"10.0.1.0/24\" } }, { \"name\": \"SecondSubnet\", \"properties\": { \"addressPrefix\": \"10.0.2.0/24\" } } ), array( { \"name\": \"FirstSubnet\", \"properties\": { \"addressPrefix\": \"10.0.1.0/24\" } } ) )]" } } ] }
当createSecondSubnet设为true时,模板会返回包含两个子网的数组;设为false时,只返回第一个子网的数组,完全不会出现无效元素。
方法2:用concat()拼接子网数组(避免重复代码)
如果不想重复写第一个子网的定义,可以用concat()把固定的第一个子网数组和条件生成的第二个子网数组(空数组或包含第二个子网的数组)拼接起来:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "createSecondSubnet": { "type": "bool", "defaultValue": false, "metadata": { "description": "是否创建第二个子网" } } }, "resources": [ { "apiVersion": "2016-06-01", "type": "Microsoft.Network/virtualNetworks", "name": "My-VNET", "location": "[resourceGroup().location]", "properties": { "addressSpace": { "addressPrefixes": [ "10.0.0.0/16" ] }, "subnets": "[concat( array( { \"name\": \"FirstSubnet\", \"properties\": { \"addressPrefix\": \"10.0.1.0/24\" } } ), if(parameters('createSecondSubnet'), array( { \"name\": \"SecondSubnet\", \"properties\": { \"addressPrefix\": \"10.0.2.0/24\" } } ), array() ) )]" } } ] }
这种方式更简洁,当条件不满足时,if()会返回一个空数组,拼接后就只有第一个子网;条件满足时,就会把第二个子网加进去。
这两种方法都能完美实现你想要的“根据条件决定是否创建第二个子网”的需求,你可以根据自己的模板复杂度选择合适的方式。
内容的提问来源于stack exchange,提问作者chew224
相关产品推荐
相关产品推荐

