在Azure ARM部署模板中的Copy元素中复制元素,以创建资源的多个实例
我正试图通过该功能在Azure ARM部署模板中创建一个“嵌套for循环”,以创建相同资源类型的多个实例(在我的示例中) 更具体地说,我正在尝试将多个主机名绑定到多个应用程序(azure应用程序服务网站) 这可能吗?还是我需要走这条路 这是我迄今为止的尝试,但我无法让它发挥作用 parameters.json在Azure ARM部署模板中的Copy元素中复制元素,以创建资源的多个实例,azure,templates,arm-template,Azure,Templates,Arm Template,我正试图通过该功能在Azure ARM部署模板中创建一个“嵌套for循环”,以创建相同资源类型的多个实例(在我的示例中) 更具体地说,我正在尝试将多个主机名绑定到多个应用程序(azure应用程序服务网站) 这可能吗?还是我需要走这条路 这是我迄今为止的尝试,但我无法让它发挥作用 parameters.json { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.js
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": {
"value": [
{ "appName": "app1", "hostNames": [ "app1.qqq.example.com", "app1.ttt.example.com" ] },
{ "appName": "app2", "hostNames": [ "app2.qqq.example.com" , "app2.ttt.example.com" ] },
{ "appName": "app3", "hostNames": [ "app3.qqq.example.com", "app3.ttt.example.com" ] }
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": { "type": "array" }
},
"resources": [
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "parameters('appList')[copyIndex('webAppCopy')]/parameters('appList')[copyIndex('webAppCopy')].hostNames",
"copy": [
{
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
}
],
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]"
}
],
"outputs": {}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"webAppAzureNamePrefix": { "value": "mycompanyprefix-" },
"appList": { "value": [ "app1", "app2", "app3"] },
"hostBindings": {
"metadata": { "description": "List of host bindings" },
"value": [
{ "appName": "app1", "hostName": "app1.qqq.example.com" },
{ "appName": "app1", "hostName": "app1.ttt.example.com" },
{ "appName": "app2", "hostName": "app2.qqq.example.com" },
{ "appName": "app2", "hostName": "app2.ttt.example.com" },
{ "appName": "app3", "hostName": "app3.qqq.example.com" },
{ "appName": "app3", "hostName": "app3.ttt.example.com" },
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"aspName": {
"type": "string",
"minLength": 1,
"metadata": { "description": "Name of App Service Plan" }
},
"aspSkuName": {
"type": "string",
"allowedValues": [ "F1", "D1", "B1", "B2", "B3", "S1", "S2", "S3", "P1", "P2", "P3", "P4" ],
"metadata": { "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/" }
},
"appList": { "type": "array" },
"hostBindings": { "type": "array" },
"webAppAzureNamePrefix": { "type": "string" }
},
"resources": [
{
"name": "[parameters('aspName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"sku": { "name": "[parameters('aspSkuName')]" },
"properties": {
"name": "[parameters('aspName')]",
"numberOfWorkers": 1
}
},
{
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"copy": {
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
},
"type": "Microsoft.Web/sites",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]" ],
"properties": {
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]"
},
"resources": []
},
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "[concat(parameters('webAppAzureNamePrefix'),parameters('hostBindings')[copyIndex()].appName, '/',parameters('hostBindings')[copyIndex()].hostName)]",
"copy": {
"name": "hostnameCopy",
"count": "[length(parameters('hostBindings'))]",
"mode": "Serial",
"batchSize": 1
},
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]",
"properties": {
"sslState": "SniEnabled",
"thumbprint": "[reference(resourceId('Microsoft.Web/certificates', parameters('certificateName'))).Thumbprint]"
},
"dependsOn": [ "webAppCopy" ]
}
],
"outputs": {}
}
template.json
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": {
"value": [
{ "appName": "app1", "hostNames": [ "app1.qqq.example.com", "app1.ttt.example.com" ] },
{ "appName": "app2", "hostNames": [ "app2.qqq.example.com" , "app2.ttt.example.com" ] },
{ "appName": "app3", "hostNames": [ "app3.qqq.example.com", "app3.ttt.example.com" ] }
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": { "type": "array" }
},
"resources": [
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "parameters('appList')[copyIndex('webAppCopy')]/parameters('appList')[copyIndex('webAppCopy')].hostNames",
"copy": [
{
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
}
],
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]"
}
],
"outputs": {}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"webAppAzureNamePrefix": { "value": "mycompanyprefix-" },
"appList": { "value": [ "app1", "app2", "app3"] },
"hostBindings": {
"metadata": { "description": "List of host bindings" },
"value": [
{ "appName": "app1", "hostName": "app1.qqq.example.com" },
{ "appName": "app1", "hostName": "app1.ttt.example.com" },
{ "appName": "app2", "hostName": "app2.qqq.example.com" },
{ "appName": "app2", "hostName": "app2.ttt.example.com" },
{ "appName": "app3", "hostName": "app3.qqq.example.com" },
{ "appName": "app3", "hostName": "app3.ttt.example.com" },
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"aspName": {
"type": "string",
"minLength": 1,
"metadata": { "description": "Name of App Service Plan" }
},
"aspSkuName": {
"type": "string",
"allowedValues": [ "F1", "D1", "B1", "B2", "B3", "S1", "S2", "S3", "P1", "P2", "P3", "P4" ],
"metadata": { "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/" }
},
"appList": { "type": "array" },
"hostBindings": { "type": "array" },
"webAppAzureNamePrefix": { "type": "string" }
},
"resources": [
{
"name": "[parameters('aspName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"sku": { "name": "[parameters('aspSkuName')]" },
"properties": {
"name": "[parameters('aspName')]",
"numberOfWorkers": 1
}
},
{
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"copy": {
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
},
"type": "Microsoft.Web/sites",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]" ],
"properties": {
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]"
},
"resources": []
},
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "[concat(parameters('webAppAzureNamePrefix'),parameters('hostBindings')[copyIndex()].appName, '/',parameters('hostBindings')[copyIndex()].hostName)]",
"copy": {
"name": "hostnameCopy",
"count": "[length(parameters('hostBindings'))]",
"mode": "Serial",
"batchSize": 1
},
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]",
"properties": {
"sslState": "SniEnabled",
"thumbprint": "[reference(resourceId('Microsoft.Web/certificates', parameters('certificateName'))).Thumbprint]"
},
"dependsOn": [ "webAppCopy" ]
}
],
"outputs": {}
}
我从未在文档中看到过任何关于直接支持嵌套 循环。但您可能可以通过以下方法解决此问题:
我最终用了一种不同的方法来解决这个问题,这会导致更多的名称重复,但使我具有更好的灵活性和可读性 parameters.json
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": {
"value": [
{ "appName": "app1", "hostNames": [ "app1.qqq.example.com", "app1.ttt.example.com" ] },
{ "appName": "app2", "hostNames": [ "app2.qqq.example.com" , "app2.ttt.example.com" ] },
{ "appName": "app3", "hostNames": [ "app3.qqq.example.com", "app3.ttt.example.com" ] }
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": { "type": "array" }
},
"resources": [
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "parameters('appList')[copyIndex('webAppCopy')]/parameters('appList')[copyIndex('webAppCopy')].hostNames",
"copy": [
{
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
}
],
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]"
}
],
"outputs": {}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"webAppAzureNamePrefix": { "value": "mycompanyprefix-" },
"appList": { "value": [ "app1", "app2", "app3"] },
"hostBindings": {
"metadata": { "description": "List of host bindings" },
"value": [
{ "appName": "app1", "hostName": "app1.qqq.example.com" },
{ "appName": "app1", "hostName": "app1.ttt.example.com" },
{ "appName": "app2", "hostName": "app2.qqq.example.com" },
{ "appName": "app2", "hostName": "app2.ttt.example.com" },
{ "appName": "app3", "hostName": "app3.qqq.example.com" },
{ "appName": "app3", "hostName": "app3.ttt.example.com" },
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"aspName": {
"type": "string",
"minLength": 1,
"metadata": { "description": "Name of App Service Plan" }
},
"aspSkuName": {
"type": "string",
"allowedValues": [ "F1", "D1", "B1", "B2", "B3", "S1", "S2", "S3", "P1", "P2", "P3", "P4" ],
"metadata": { "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/" }
},
"appList": { "type": "array" },
"hostBindings": { "type": "array" },
"webAppAzureNamePrefix": { "type": "string" }
},
"resources": [
{
"name": "[parameters('aspName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"sku": { "name": "[parameters('aspSkuName')]" },
"properties": {
"name": "[parameters('aspName')]",
"numberOfWorkers": 1
}
},
{
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"copy": {
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
},
"type": "Microsoft.Web/sites",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]" ],
"properties": {
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]"
},
"resources": []
},
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "[concat(parameters('webAppAzureNamePrefix'),parameters('hostBindings')[copyIndex()].appName, '/',parameters('hostBindings')[copyIndex()].hostName)]",
"copy": {
"name": "hostnameCopy",
"count": "[length(parameters('hostBindings'))]",
"mode": "Serial",
"batchSize": 1
},
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]",
"properties": {
"sslState": "SniEnabled",
"thumbprint": "[reference(resourceId('Microsoft.Web/certificates', parameters('certificateName'))).Thumbprint]"
},
"dependsOn": [ "webAppCopy" ]
}
],
"outputs": {}
}
template.json
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": {
"value": [
{ "appName": "app1", "hostNames": [ "app1.qqq.example.com", "app1.ttt.example.com" ] },
{ "appName": "app2", "hostNames": [ "app2.qqq.example.com" , "app2.ttt.example.com" ] },
{ "appName": "app3", "hostNames": [ "app3.qqq.example.com", "app3.ttt.example.com" ] }
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appList": { "type": "array" }
},
"resources": [
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "parameters('appList')[copyIndex('webAppCopy')]/parameters('appList')[copyIndex('webAppCopy')].hostNames",
"copy": [
{
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
}
],
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]"
}
],
"outputs": {}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"webAppAzureNamePrefix": { "value": "mycompanyprefix-" },
"appList": { "value": [ "app1", "app2", "app3"] },
"hostBindings": {
"metadata": { "description": "List of host bindings" },
"value": [
{ "appName": "app1", "hostName": "app1.qqq.example.com" },
{ "appName": "app1", "hostName": "app1.ttt.example.com" },
{ "appName": "app2", "hostName": "app2.qqq.example.com" },
{ "appName": "app2", "hostName": "app2.ttt.example.com" },
{ "appName": "app3", "hostName": "app3.qqq.example.com" },
{ "appName": "app3", "hostName": "app3.ttt.example.com" },
]
}
}
}
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"aspName": {
"type": "string",
"minLength": 1,
"metadata": { "description": "Name of App Service Plan" }
},
"aspSkuName": {
"type": "string",
"allowedValues": [ "F1", "D1", "B1", "B2", "B3", "S1", "S2", "S3", "P1", "P2", "P3", "P4" ],
"metadata": { "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/" }
},
"appList": { "type": "array" },
"hostBindings": { "type": "array" },
"webAppAzureNamePrefix": { "type": "string" }
},
"resources": [
{
"name": "[parameters('aspName')]",
"type": "Microsoft.Web/serverfarms",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"sku": { "name": "[parameters('aspSkuName')]" },
"properties": {
"name": "[parameters('aspName')]",
"numberOfWorkers": 1
}
},
{
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"copy": {
"name": "webAppCopy",
"count": "[length(parameters('appList'))]"
},
"type": "Microsoft.Web/sites",
"location": "[resourceGroup().location]",
"apiVersion": "2015-08-01",
"dependsOn": [ "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]" ],
"properties": {
"name": "[concat(parameters('webAppAzureNamePrefix'), parameters('appList')[copyIndex()])]",
"serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('aspName'))]"
},
"resources": []
},
{
"type": "Microsoft.Web/sites/hostnameBindings",
"name": "[concat(parameters('webAppAzureNamePrefix'),parameters('hostBindings')[copyIndex()].appName, '/',parameters('hostBindings')[copyIndex()].hostName)]",
"copy": {
"name": "hostnameCopy",
"count": "[length(parameters('hostBindings'))]",
"mode": "Serial",
"batchSize": 1
},
"apiVersion": "2016-03-01",
"location": "[resourceGroup().location]",
"properties": {
"sslState": "SniEnabled",
"thumbprint": "[reference(resourceId('Microsoft.Web/certificates', parameters('certificateName'))).Thumbprint]"
},
"dependsOn": [ "webAppCopy" ]
}
],
"outputs": {}
}
谢谢@JohnRusk。如果每个应用程序有相同数量的主机名,我就可以使用这个解决方案,但如果没有(例如,app1有3个主机名,app2有5个主机名),那么它就会崩溃。仍在试图找到一个更“通用”的解决方案。可能值得一试,看看您是否可以在“condition”元素中使用新的(ish)“if”语句,以防止它尝试部署在copyIndex位于主机名数组“末端”的循环迭代中。问题是这可能会变得复杂,我甚至不确定copyIndex在“条件”中是否受支持。感谢@John Rusk的建议,但我最终选择了一个更具可读性的解决方案。你是否能做到这一点,看起来你的name属性是错的……嗨@bmoore msft,我最终使用了不同的方法。