Шаблон Azure ARM: добавление NSG или таблицы маршрутов в динамический шаблон виртуальной сети / подсети

#azure #arm-template

#azure #arm-template

Вопрос:

У меня есть шаблон, который развертывает несколько виртуальных сетей и несколько подсетей в каждой виртуальной сети. это не обязательно должно быть одинаковое количество подсетей во всех виртуальных сетях. Это отлично работает. Но теперь я хочу добавить NSG в одну из подсетей и таблицу маршрутов в другую подсеть. Я не понимаю, как это работает — может ли кто-нибудь из вас мне помочь.

Файл шаблона выглядит следующим образом:

 {
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VNET": {
            "type": "array"
        }
    },
    "variables": {},
    "resources": [
        {
            "apiVersion": "2017-05-10",
            "name": "[concat('Deploy-',parameters('VNET')[copyIndex('Vnets')].VnetName)]",
            "type": "Microsoft.Resources/deployments",
            "copy": {
                "name": "Vnets",
                "count": "[length(parameters('VNET'))]"
            },
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "apiVersion": "2017-10-01",
                            "type": "Microsoft.Network/virtualNetworks/",
                            "name": "[parameters('VNET')[copyIndex('Vnets')].VnetName]",
                            "location": "[resourceGroup().location]",
                            "tags": "[resourceGroup().tags]",
                            "properties": {
                                "addressSpace": {
                                    "addressPrefixes": [
                                        "[parameters('VNET')[copyIndex('Vnets')].VnetAddressSpace]"
                                    ]
                                },
                                "copy": [
                                    {
                                        "name": "subnets",
                                        "count": "[length(parameters('VNET')[copyIndex('Vnets')].Subnets)]",
                                        "input": {
                                            "name": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].name]",
                                            "properties": {
                                                "addressPrefix": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].addressPrefix]"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    ],
    "outputs": {}
}
 

Файл параметров выглядит следующим образом:

 {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VNET": {
            "value": [
                {
                    "VnetName": "Vnet-01",
                    "VnetAddressSpace": "10.11.0.0/16",
                    "Subnets": [
                        {
                            "name": "subnet-10-11-1-0-24",
                            "addressPrefix": "10.11.1.0/24"
                        },
                        {
                            "name": "subnet-10-11-2-0-24",
                            "addressPrefix": "10.11.2.0/24"
                        },
                        {
                            "name": "subnet-10-11-3-0-24",
                            "addressPrefix": "10.11.3.0/24"
                        }
                    ]
                },
                {
                    "VnetName": "Vnet-02",
                    "VnetAddressSpace": "10.12.0.0/16",
                    "Subnets": [
                        {
                            "name": "subnet-10-12-1-0-24",
                            "addressPrefix": "10.12.1.0/24"
                        },
                        {
                            "name": "subnet-10-12-2-0-24",
                            "addressPrefix": "10.12.2.0/24"
                        }
                    ]
                }
            ]
        }
    }
}
 

Редактировать:
После добавления строки для networkSecurityGroup (см. Ниже) Я заставляю его работать до тех пор, пока я устанавливаю значение параметра равным null
Но как я должен ввести этот параметр?
См. Сообщение об ошибке ниже.

 "copy": [
                                    {
                                        "name": "subnets",
                                        "count": "[length(parameters('VNET')[copyIndex('Vnets')].Subnets)]",
                                        "input": {
                                            "name": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].name]",
                                            "properties": {
                                                "addressPrefix": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].addressPrefix]",
                                                "networkSecurityGroup": "[if(equals(json('null'), parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup), json('null'), resourceId('Microsoft.Network/networkSecurityGroups/',parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup))]"
                                            }
                                        }
                                    }
                                ]
 
 "Subnets": [
                        {
                            "name": "subnet-10-11-1-0-24",
                            "addressPrefix": "10.11.1.0/24",
                            "networkSecurityGroup": "nsg-test"
                        },
                        {
                            "name": "subnet-10-11-2-0-24",
                            "addressPrefix": "10.11.2.0/24",
                            "networkSecurityGroup": null
                        },
 

Сообщение об ошибке:

 "error": {
    "code": "InvalidRequestFormat",
    "message": "Cannot parse the request.",
    "details": [
      {
        "code": "MissingJsonReferenceId",
        "message": "Value for reference id is missing. Path properties.subnets[0].properties.networkSecurityGroup."
      }
    ]
  }
 

ПРАВКА 2:
Если я укажу имя NSG во всех подсетях, приведенный выше код будет работать.
Итак, что осталось сделать, это заставить его принимать null в качестве значения, если я не хочу NSG в одной из подсетей…

РЕДАКТИРОВАНИЕ 3: выполнено еще несколько тестов. С этим шаблоном он работает, когда я устанавливаю для параметров значение «name-of-nsg», но не значение null:

 "networkSecurityGroup": {
    "id": "[if(equals(json('null'), parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup), json('null'), resourceId('Microsoft.Network/networkSecurityGroups/',parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup))]"
}
 

С этим шаблоном он работает, когда я устанавливаю для параметров значение null, но не «имя nsg»:

 "networkSecurityGroup": "[if(equals(json('null'), parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup), json('null'), resourceId('Microsoft.Network/networkSecurityGroups/',parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup))]"
 

Как я могу сделать, чтобы он работал как с null, так И с «name-of-nsg»?

Комментарии:

1. итак, в чем именно заключается ваша проблема?

2. @4c74356b41, вопрос в том, как добавить NSG или таблицу маршрутов в одну из подсетей, но не в другие

3. я могу прочитать, в чем собственно вопрос? добавить их в свой файл параметров и условия в свой шаблон?

4. @4c74356b41, ну … это то, что я пытался сделать, но у меня ничего не получилось. Можете ли вы показать мне, как вы это сделаете?

5. ну, вы должны указать идентификатор ресурса, а не «nsg-test»

Ответ №1:

У меня нет готового примера, но он будет выглядеть примерно так:

 subnets:
- name: xxx-1
  addressPrefix: yyy
  nsg: < resourceId or something >
- name: xxx-2
  addressPrefix: yyy
  nsg: null
 

а затем в вашем шаблоне:

 "copy": [
    {
        "name": "subnets",
        "count": "[length(parameters('VNET')[copyIndex('Vnets')].Subnets)]",
        "input": {
            "name": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].name]",
            "properties": {
                "addressPrefix": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].addressPrefix]"
                "networkSecurityGroup": "[if(eq(null, parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].nsg), json('null'), parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].nsg)]
            }
        }
    }
]
 

итак, после некоторых проб и ошибок:

 {
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VNET": {
            "type": "Array"
        }
    },
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2017-05-10",
            "name": "[concat('Deploy-',parameters('VNET')[copyIndex('Vnets')].VnetName)]",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        {
                            "apiVersion": "2017-10-01",
                            "type": "Microsoft.Network/virtualNetworks/",
                            "name": "[parameters('VNET')[copyIndex('Vnets')].VnetName]",
                            "location": "eastus",
                            "properties": {
                                "addressSpace": {
                                    "addressPrefixes": [
                                        "[parameters('VNET')[copyIndex('Vnets')].VnetAddressSpace]"
                                    ]
                                },
                                "copy": [
                                    {
                                        "name": "subnets",
                                        "count": "[length(parameters('VNET')[copyIndex('Vnets')].Subnets)]",
                                        "input": {
                                            "name": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].name]",
                                            "properties": {
                                                "addressPrefix": "[parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].addressPrefix]",
                                                "networkSecurityGroup": "[if(equals(parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup, json('null')), json('null'), json(concat('{"id": "', resourceId('Microsoft.Network/networkSecurityGroups', parameters('VNET')[copyIndex('Vnets')].Subnets[copyIndex('subnets')].networkSecurityGroup), '"}')))]"
                                            }
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            },
            "copy": {
                "name": "Vnets",
                "count": "[length(parameters('VNET'))]"
            }
        }
    ]
}
 
 {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "VNET": {
            "value": [
                {
                    "VnetName": "Vnet-01",
                    "VnetAddressSpace": "10.11.0.0/16",
                    "Subnets": [
                        {
                            "name": "subnet-10-11-1-0-24",
                            "addressPrefix": "10.11.1.0/24",
                            "networkSecurityGroup": "nsg-test"
                        },
                        {
                            "name": "subnet-10-11-2-0-24",
                            "addressPrefix": "10.11.2.0/24",
                            "networkSecurityGroup": null
                        }
                    ]
                },
                {
                    "VnetName": "Vnet-02",
                    "VnetAddressSpace": "10.12.0.0/16",
                    "Subnets": [
                        {
                            "name": "subnet-10-12-1-0-24",
                            "addressPrefix": "10.12.1.0/24",
                            "networkSecurityGroup": "nsg-test"
                        }
                    ]
                }
            ]
        }
    }
}
 

Комментарии:

1. Это немного приблизило меня, но не полностью… Это работает до тех пор, пока я устанавливаю значение параметра равным null, но не тогда, когда я устанавливаю значение