Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Azure ARM部署模板中的Copy元素中复制元素,以创建资源的多个实例_Azure_Templates_Arm Template - Fatal编程技术网

在Azure ARM部署模板中的Copy元素中复制元素,以创建资源的多个实例

在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

我正试图通过该功能在Azure ARM部署模板中创建一个“嵌套for循环”,以创建相同资源类型的多个实例(在我的示例中)

更具体地说,我正在尝试将多个主机名绑定到多个应用程序(azure应用程序服务网站)

这可能吗?还是我需要走这条路

这是我迄今为止的尝试,但我无法让它发挥作用

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": {}
}

我从未在文档中看到过任何关于直接支持嵌套 循环。但您可能可以通过以下方法解决此问题:

  • 定义一个模板变量,该变量为应用程序数*每个应用程序的地址数。我们将此变量称为bindingCount
  • 使用bindingCount作为“副本”的计数
  • 构造资源名称时,使用div和mod函数获取copyIndex,并将其转换回“应用程序索引”和“主机名”索引。我 我想你必须内联计算,在构成名称的公式中

  • 我最终用了一种不同的方法来解决这个问题,这会导致更多的名称重复,但使我具有更好的灵活性和可读性

    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,我最终使用了不同的方法。