#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, но не тогда, когда я устанавливаю значение