Search code examples
azureazure-resource-managerazure-rm-template

ARM Template - Conditionally add to an Array


{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {        
        "externalSubnet1": {
            "type": "string",
            "defaultValue": ""
        }
    },
    "variables": {
        "SQLServerName": "someName",
        "SQLDatabaseName": "someDatabase",
        "Subnet1": "/subscriptions/771adxxx-xxxx-xxxx-9xxx-xxxxxxxxxxxx/resourceGroups/some_resource_group/providers/Microsoft.Network/virtualNetworks/some_vnet/subnets/some_subnet1",
        "Subnet2": "/subscriptions/771adxxx-xxxx-xxxx-9xxx-xxxxxxxxxxxx/resourceGroups/some_resource_group/providers/Microsoft.Network/virtualNetworks/some_vnet/subnets/some_subnet1",
    },
    "resources": [{
            "name": "[variables('SQLServerName')]",
            "type": "Microsoft.Sql/servers",
            "location": "Central US",
            "apiVersion": "2021-05-01-preview",
            "dependsOn": [],
            "tags": {
                "displayName": "Logical SQL Server"
            },
            "kind": "v12.0",
            "properties": {
                "administratorLogin": "xyz",
                "administratorLoginPassword": "xyz",
                "version": "12.0"
            },
            "resources": [
                {
                    "type": "Microsoft.Sql/servers/virtualNetworkRules",
                    "apiVersion": "2021-05-01-preview",
                    "name": "x1",
                    "dependsOn": ["[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"],
                    "properties": {
                        "virtualNetworkSubnetId": "[parameters('externalSubnet1')]",
                        "ignoreMissingVnetServiceEndpoint": false
                    }
                }, {
                    "type": "Microsoft.Sql/servers/virtualNetworkRules",
                    "apiVersion": "2021-05-01-preview",
                    "name": "x2",
                    "dependsOn": ["[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"],
                    "properties": {
                        "virtualNetworkSubnetId": "[variables('Subnet1')]",
                        "ignoreMissingVnetServiceEndpoint": false
                    }
                }, {
                    "type": "Microsoft.Sql/servers/virtualNetworkRules",
                    "apiVersion": "2021-05-01-preview",
                    "name": "x3",
                    "dependsOn": ["[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"],
                    "properties": {
                        "virtualNetworkSubnetId": "[variables('Subnet2')]",
                        "ignoreMissingVnetServiceEndpoint": false
                    }
                }
            ]
        }
    ]
}

I have the following ARM template. In the innermost resources array there are 3 virtual network rules. What I want is that if the value of the parameter externalSubnet1 is there i.e. it is non blank string then I want the first element of the resources array to be included. This makes sense because the variable externalSubnet1 needs to be a valid subnet id (something similar to variables Subnet1 or Subnet2) otherwise the deployment fails.

What I tried?

I looked at condition but it is at resource level so can't use that.

I also looked at if but the problem is that it still includes that JSON block in the array with a blank virtualNetworkSubnetId and that also fails. I want the entire first element (JSON block) of the virtualNetworkRules resource array to be excluded i.e. there should be only 2 elements in the array when the parameter externalSubnet1 is empty string.

So, how can we achieve this? Thanks.


Solution

  • If I Understand it correctly then you want to conditionally execute the VirtualNetworkRule depending on the string parameter externalsubnet1 . If parameter value is present then x1 will be executed and if value is blank then x2 and x3 will be executed. In that case you can use the below template:

    Template:

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {        
            "externalSubnet1": {
                "type": "string"
            }
        },
        "variables": {
            "SQLServerName": "ansserver",
            "Subnet1": "/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxx/resourceGroups/ansumantest/providers/Microsoft.Network/virtualNetworks/ansuman-vnet/subnets/default",
            "Subnet2": "/subscriptions/xxxxxxxxxxxxxxxxxxxx/resourceGroups/ansumantest/providers/Microsoft.Network/virtualNetworks/ansuman-vnet/subnets/subnet1"
        },
        "resources": [{
                "name": "[variables('SQLServerName')]",
                "type": "Microsoft.Sql/servers",
                "location": "East US",
                "apiVersion": "2015-05-01-preview",
                "properties": {
                    "administratorLogin": "ansuman",
                    "administratorLoginPassword": "password",
                    "version": "12.0",
                    "publicNetworkAccess":"Enabled"
                },
                "resources": [
                    {   
                        "condition":"[not(empty(parameters('externalSubnet1')))]",
                        "type": "virtualNetworkRules",
                        "apiVersion": "2021-05-01-preview",
                        "name": "[concat(variables('SQLServerName'),'test1')]",
                        "dependsOn": ["[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"],
                        "properties": {
                            "virtualNetworkSubnetId": "[parameters('externalSubnet1')]",
                            "ignoreMissingVnetServiceEndpoint": false
                        }
                    }, {
                        "condition":"[empty(parameters('externalSubnet1'))]",
                        "type": "virtualNetworkRules",
                        "apiVersion": "2021-05-01-preview",
                        "name": "[concat(variables('SQLServerName'),'test2')]",
                        "dependsOn": ["[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"],
                        "properties": {
                            "virtualNetworkSubnetId": "[variables('Subnet1')]",
                            "ignoreMissingVnetServiceEndpoint": false
                        }
                    }, {
                        "condition":"[empty(parameters('externalSubnet1'))]",
                        "type": "virtualNetworkRules",
                        "apiVersion": "2021-05-01-preview",
                        "name": "[concat(variables('SQLServerName'),'test3')]",
                        "dependsOn": ["[resourceId('Microsoft.Sql/servers', variables('SQLServerName'))]"],
                        "properties": {
                            "virtualNetworkSubnetId": "[variables('Subnet2')]",
                            "ignoreMissingVnetServiceEndpoint": false
                        }
                    }
                ]
            }
        ]
    }
    

    Output:

    enter image description here

    enter image description here