Azure ARM Inline IF无法正常工作

时间:2018-05-03 19:04:27

标签: json azure templates vnet

我正在尝试通过.json模板构建Azure VNET。

我正在尝试使用内联条件语句来创建第二个子网或跳过创建第二个子网。我认为我没有正确使用json('null'),或者甚至可能。我的理解是如果选择json('null'),则不选择任何东西。

感谢任何帮助!

"apiVersion": "2016-06-01",
"type": "Microsoft.Network/virtualNetworks",
"name": "My-VNET",
"location": "[resourceGroup().location]",
"properties": {
    "addressSpace": {
        "addressPrefixes": [
            "[parameters('virtualNetworkCIDR')]"
        ]
    },
    "subnets": [{
            "name": "[parameters('firstSubnetName')]",
            "properties": {
                "addressPrefix": "10.10.1.0/24"
            }
        }, {
            "name": "[if(equals(parameters('createSecondSubnet'), 'Yes'), parameters('secondSubnetName'), json('null'))]",
            "properties": {
                "addressPrefix": "10.10.2.0/24"
            }
        }
    ]
}

2 个答案:

答案 0 :(得分:0)

通常有条件地在模板中创建资源,您可以使用"条件"财产:https://docs.microsoft.com/en-us/azure/architecture/building-blocks/extending-templates/conditional-deploy

如果您想创建多种单一类型的资源,可以使用"复制"财产:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#resource-iteration

不幸的是,子网没有条件或复制属性,因为它们是"虚拟网络的子资源。资源。因此,整个VNET需要是​​有条件的,并且您可以指定多个VNETS,其中只有一个部署。 VNETS也可以不具有相同的名称,因此您需要在模板中指定多个VNETS。

例如:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    "NumberofSubnets": {
      "type": "string",
      "allowedValues": ["1","2"],
      "metadata": {
        "description": "would you like to deploy 1 or 2 subnets?"
      }
    }
    },
    "resources": [
        {
        "type": "Microsoft.Network/virtualNetworks",
        "apiVersion": "2016-06-01",
        "name": "My-VNET1",
        "location": "[resourceGroup().location]",
        "condition": "[equals(parameters('NumberofSubnets'), 1)]",
        "properties": {
            "addressSpace": {
            "addressPrefixes": ["10.10.0.0/23"]
            },
    "subnets": [{
            "name": "Subnet1",
            "properties": {
                "addressPrefix": "10.10.0.0/24"
            }
        }
        ]
        }
        },
        {
        "type": "Microsoft.Network/virtualNetworks",
        "apiVersion": "2016-06-01",
        "name": "My-VNET2",
        "location": "[resourceGroup().location]",
        "condition": "[equals(parameters('NumberofSubnets'), 2)]",
        "properties": {
            "addressSpace": {
            "addressPrefixes": ["10.10.0.0/23"]
            },
    "subnets": [{
            "name": "Subnet1",
            "properties": {
                "addressPrefix": "10.10.0.0/24"
            }
        },
        {
            "name": "Subnet2",
            "properties": {
                "addressPrefix": "10.10.1.0/24"
            }
        }
        ]
        }
        }
    ]
}

这将解决您的问题,但是如果有大量的子网,您可以看到模板如何变得非常繁琐。

最好但最复杂的方法是使用链接模板。 This Repository shows how you can create a dynamic number of subnets using linked templates

答案 1 :(得分:0)

我确定您已经设法获得了某种解决方案……但是,我有一种很好的解决方案,可以解决这类问题……尽管它不使用条件语句。

在PowerShell中创建像这样的一些哈希表...

# Resource group Hashtables.
$rgDev = @{
    Name = "DEV-RG"
    SubscriptionId = $subNonProd
    Location = "desiredregion"
}
$rgUat = @{
    Name = "UAT-RG"
    SubscriptionId = $subNonProd
    Location = "desiredregion"
}

#Vnet Hashtables
$vnetDev = @{
    ResourceGroup = $rgDev
    VnetName = "Dev-vnet"
    CIDR = @('x.x.x.x/27')
    Subnets = @(
             @{
                Name = "Dev-Web-subnet"
                CIDR = "y.y.y.y/28"
             },
             @{
                Name = "Dev-DB-subnet"
                CIDR = "z.z.z.z/28"
             })
}
$vnetUat = @{
    ResourceGroup = $rgUat
    VnetName = "UAT-vnet"
    CIDR = @('f.f.f.f/27')
    Subnets = @(
             @{
                Name = "UAT-Web-subnet"
                CIDR = "g.g.g.g/28"
             },
             @{
                Name = "UAT-DB-subnet"
                CIDR = "h.h.h.h/28"
             })
}

接下来,我将哈希表集中到一个数组中并遍历整个数组。我有一个小的脚本可以切换上下文,以便可以在一个引导程序类型脚本中部署到多个订阅。

$vnets = @($vnetDev, $vnetUat)

ForEach ($vn in $vnets) {

    $deploymentName = $vn.VnetName + "_Deployment."

    .\SwitchSubscription.ps1 -subName $vn.ResourceGroup.SubscriptionName -subId $vn.ResourceGroup.SubscriptionId

    New-AzureRmResourceGroupDeployment  -Name $deploymentName `
                                        -ResourceGroupName $vn.ResourceGroup.Name `
                                        -TemplateFile .\JSONFiles\Vnets.json `
                                        -vnet $vn

}

ARM模板的“参数”部分如下所示……

    "parameters": {        
        "vnet": {
            "type": "object",
        }
    },

然后资源部分看起来像这样...

        {
            "name": "[concat(parameters('vnet').VnetName)]",
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2017-10-01",
            "location": "[resourceGroup().location]",
            "tags": "[parameters('vnet').tags]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": "[parameters('vnet').CIDR]"
                },
                "copy": [
                    {
                        "name": "subnets",
                        "count": "[length(parameters('vnet').Subnets)]",
                        "input": {
                            "name": "[parameters('vnet').Subnets[copyIndex('Subnets')].Name]",
                            "properties": {
                                "addressPrefix": "[parameters('vnet').Subnets[copyIndex('Subnets')].CIDR]"
                            }
                        }
                    }
                ]
            }
        }
    ]

因此,所有这些操作就是将一个对象传递到ARM模板,该模板可以具有一个带有一个或多个子网的Vnet并全部创建。

希望这样可以帮助其他人/(如果他们在谷歌搜索时发现了这个问题)。

干杯

戴夫。

:)