Исключить развертывание ресурсов в copyIndex - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь развернуть виртуальную сеть, подсети и группы безопасности сети из объекта параметра

        "vnetSettings": {
        "value": {
            "name": "myVnet",
            "addressPrefixes": [
                {
                    "name": "addressSpace",
                    "addressPrefix": "172.25.196.0/22"
                }
            ],
            "subnets": [
                {
                    "name": "data-subnet",
                    "subnetPrefix": "172.25.196.0/27"
                },
                {
                    "name": "app-subnet",
                    "subnetPrefix": "172.25.196.32/27"
                },
                {
                    "name": "web-subnet",
                    "subnetPrefix": "172.25.196.64/27"
                },
                {
                    "name": "pridmz-subnet",
                    "subnetPrefix": "172.25.196.96/27"
                },
                {
                    "name": "pubdmz-subnet",
                    "subnetPrefix": "172.25.196.128/27"
                },
                {
                    "name": "AzureFirewallSubnet",
                    "subnetPrefix": "172.25.196.160/28"
                }
            ]

        }
    }

Из этого объекта параметра мне нужно выполнить итерацию по каждому элементу и создать виртуальную сеть, подсети и NSG и назначить каждому su bnet NSG - это нормально, за исключением того, что мне нужно исключить создание NSG для брандмауэра Azure и исключить необходимость назначать брандмауэр su bnet NSG

Итак, я ' m пытается найти способ сделать это в copyIndex

        {
        "apiVersion": "2017-06-01",
        "type": "Microsoft.Network/networkSecurityGroups",
        "copy": {
                "name": "iterator",
                "count": "[length(parameters('VNetSettings').subnets)]"
            },
        "name": "[if(equals(parameters('VNetSettings').subnets[copyIndex()].name, 'AzureFirewallSubnet'), json('null'), toUpper(concat(parameters('VNetSettings').name , '-', resourceGroup().location, '-',  parameters('VNetSettings').subnets[copyIndex()].name, '-nsg')))]",
        "location":"[resourceGroup().location]",
        "properties": {            
          "securityRules": []
        }
    },

Эти ошибки с

'The template resource '[if(equals(parameters('VNetSettings').subnets[copyIndex()].name, 'AzureFirewallSubnet'), json('null'), toUpper(concat(parameters('VNetSettings').name , '-', resourceGroup().location, '-',  parameters('VNetSettings').subnets[copyIndex()].name, '-nsg')))]' at line '1' and column '467' is not valid: Evaluation result of language expression '[if(equals(parameters('VNetSettings').subnets[copyIndex()].name, 'AzureFirewallSubnet'), json('null'), toUpper(concat(parameters('VNetSettings').name , '-', resourceGroup().location, '-',  parameters('VNetSettings').subnets[copyIndex()].name, '-nsg')))]' is type 'Null', expected type is 'String'

Я могу обойти эту ошибку, передав строку, а не JSON ( 'null'), который затем создает все группы безопасности сети, но проблема, с которой я сталкиваюсь, заключается в повторении copyIndex для подсетей.

{
        "apiVersion": "2020-04-01",
        "name": "[toUpper(concat(parameters('VNetSettings').name, '-', resourceGroup().location, '-vnet'))]",
        "dependsOn": [
           "iterator"
        ],
        "type": "Microsoft.Network/virtualNetworks",
        "location":"[resourceGroup().location]",
        "properties": {
            "addressSpace": {
                "addressPrefixes": [
                    "[parameters('virtualNetworkaddressSpace')]"
                ]
            },
            "copy":[
                {
                    "name": "subnets",
                    "count":6,
                    "input": {
                        "name": "[if(equals(parameters('VNetSettings').subnets[copyIndex('subnets')].name, 'AzureFirewallSubnet'), variables('azureFirewallSubnetName'), concat(parameters('VNetSettings').name,'-', resourceGroup().location, '-', parameters('VNetSettings').subnets[copyIndex('subnets')].name))]",
                        "properties": {
                        "addressPrefix": "[parameters('VNetSettings').subnets[copyIndex('subnets')].subnetPrefix]",
                        "networkSecurityGroup": {
                           "id": "[if(equals(parameters('VNetSettings').subnets[copyIndex('subnets')].name, 'AzureFirewallSubnet'), json('null'), resourceId('Microsoft.Network/networkSecurityGroups/', concat(parameters('VNetSettings').name, '-', resourceGroup().location, '-', parameters('VNetSettings').subnets[copyIndex('subnets')].name, '-nsg')))]"
                       },

Надеюсь, это имеет смысл, и кто-то может помочь?

Спасибо

1 Ответ

0 голосов
/ 20 июня 2020

Вместо того, чтобы пытаться совместить странный случай с остальными, я бы просто разделил его:

"vnetSettings": {
    "value": {
        "name": "myVnet",
        "addressPrefixes": [
            {
                "name": "addressSpace",
                "addressPrefix": "172.25.196.0/22"
            }
        ],
        "subnets": [
            {
                "name": "data-subnet",
                "subnetPrefix": "172.25.196.0/27"
            },
            {
                "name": "app-subnet",
                "subnetPrefix": "172.25.196.32/27"
            },
            {
                "name": "web-subnet",
                "subnetPrefix": "172.25.196.64/27"
            },
            {
                "name": "pridmz-subnet",
                "subnetPrefix": "172.25.196.96/27"
            },
            {
                "name": "pubdmz-subnet",
                "subnetPrefix": "172.25.196.128/27"
            }//,
            //{
            //    "name": "AzureFirewallSubnet",
            //    "subnetPrefix": "172.25.196.160/28"
            //}
        ],
        "firewallSubnetPrefix":"172.25.196.160/28"
    }
}

И затем создайте брандмауэр su bnet как ресурс верхнего уровня:

"resources: [
    {
        "apiVersion": "2020-04-01",
        "name": "[toUpper(concat(parameters('VNetSettings').name, '-', resourceGroup().location, '-vnet'))]",
        "type": "Microsoft.Network/virtualNetworks",
        //...
    },
    {
      "name": "AzureFirewallSubnet",
      "type": "Microsoft.Network/virtualNetworks/subnets",
      "apiVersion": "2020-04-01",
      "properties": {
        "addressPrefix": "[parameters('vnetSettings').firewallSubnetPrefix]",
      },
      "dependsOn": [
        "[toUpper(concat(parameters('VNetSettings').name, '-', resourceGroup().location, '-vnet'))]"
      ],
      //...
    }      
]
...