在不同的父模板中引用相同的链接模板

时间:2018-12-05 13:13:06

标签: azure azure-resource-manager azure-template

我想使用ARM模板为存储帐户,服务总线,Azure功能和Web应用程序部署资源。我也想将存储和服务总线连接字符串写到功能和Web应用程序应用程序设置中。 因此,我创建了一个主模板,该模板引用了两个子模板:一个用于功能,一个用于Web应用程序。两个子模板都为服务总线和存储帐户引用相同的链接模板。 我的复合模板已成功通过验证,但是当我尝试部署时,出现了以下错误:

  

无法编辑或替换部署serviceBus:以前的部署   从[datetime]开始仍处于活动状态

似乎Azure尝试两次部署服务总线和存储帐户。如何告诉ARM为Web应用程序和功能使用相同的serviceBus部署?

当前的简化模式:

      Main ARM template(azuredeploy.json)
     /                                 \
Web App(nestedtemplates/webApp.json)   Function App(nestedtemplates/functions/resourceAllocationFunction.json)
      \                               /
    Service Bus(nestedtemplates/serviceBus.json)

模板:

azuredeploy.json

"resources": [    
    {
      "name": "webApp",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('webAppTemplateFolder'), '/', variables('webAppTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "mainStorageAccountType": { "value": "[parameters('mainStorageAccountType')]" }, 

          "location": { "value": "[parameters('location')]" },

          "_artifactsLocation": { "value": "[parameters('_artifactsLocation')]" },
          "_artifactsLocationSasToken": { "value": "[parameters('_artifactsLocationSasToken')]" }
        }
      }
    },
    {
      "name": "resourceAllocationFunction",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('resourceAllocationFunctionTemplateFolder'), '/', variables('resourceAllocationFunctionTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "mainStorageAccountType": { "value": "[parameters('mainStorageAccountType')]" },    


          "location": { "value": "[parameters('location')]" },

          "_artifactsLocation": { "value": "[parameters('_artifactsLocation')]" },
          "_artifactsLocationSasToken": { "value": "[parameters('_artifactsLocationSasToken')]" }
        }
      }
    }
  ],

nestedtemplates / webApp.json

"resources": [
    {
      "name": "[parameters('servicePlanName')]",
      "type": "Microsoft.Web/serverfarms",
      "location": "[resourceGroup().location]",
      "apiVersion": "2015-08-01",
      "sku": {
        "name": "[parameters('servicePlanSkuName')]"
      },
      "dependsOn": [],     
      "properties": {
        "name": "[parameters('servicePlanName')]",
        "numberOfWorkers": 1
      }
    },
    {
      "name": "[variables('webAppName')]",
      "type": "Microsoft.Web/sites",
      "location": "[parameters('location')]",
      "apiVersion": "2015-08-01",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('servicePlanName'))]"
      ],      
      "properties": {
        "name": "[variables('webAppName')]",
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('servicePlanName'))]"        
      },
      "resources": [
        {
          "name": "appsettings",
          "type": "config",
          "apiVersion": "2015-08-01",
          "dependsOn": [
            "[resourceId('Microsoft.Web/sites', variables('webAppName'))]",
            "[resourceId('microsoft.insights/components/', variables('appInsightsName'))]"
          ],
          "properties": {

            "ServiceBus:ConnectionString": "[reference('serviceBus').outputs.connectionString.value]",
            "ServiceBus:QueueName": "[reference('serviceBus').outputs.queueName.value]",

            "StorageAccounts:WritableAccountName": "[reference('mainStorage').outputs.storageAccountName.value]",
            "StorageAccounts:ConnectionString": "[reference('mainStorage').outputs.storageAccountConnString.value]",           
          }
        }
      ]
    },
    {
      "name": "serviceBus",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [ ],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('serviceBusTemplateFolder'), '/', variables('serviceBusTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },       
        "parameters": {
          "location": { "value": "[parameters('location')]" }
        }
      }
    },
    {
      "name": "mainStorage",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [ ],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('mainStorageTemplateFolder'), '/', variables('mainStorageTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },       
        "parameters": {
          "location": { "value": "[parameters('location')]" },
          "mainStorageAccountType": { "value": "[parameters('mainStorageAccountType')]" }
        }
      }
    }
]

nestedtemplates / functions / resourceAllocationFunction.json

"resources": [
    {
      "name": "functionStorageAccount",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('functionStorageAccountTemplateFolder'), '/', variables('functionStorageAccountTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "location": { "value": "[parameters('location')]" }
        }       
      }
    },
    {
      "name": "consumptionPlan",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('consumptionPlanTemplateFolder'), '/', variables('consumptionPlanTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "location": { "value": "[parameters('location')]" }
        }       
      }
    },    
    {
      "apiVersion": "2016-08-01",
      "type": "Microsoft.Web/sites",
      "name": "[variables('functionAppName')]",
      "location": "[parameters('location')]",
      "kind": "functionapp",
      "dependsOn": [
        "[resourceId('microsoft.insights/components', variables('appInsightsName'))]"
      ],
      "properties": {
        "name": "[variables('functionAppName')]",
        "serverFarmId": "[reference('consumptionPlan').outputs.resourceID.value]",
        "siteConfig": {
          "appSettings": [
            {
              "name": "AzureWebJobsDashboard",
              "value": "[reference('functionStorageAccount').outputs.storageAccountConnString.value]"
            },
            {
              "name": "AzureWebJobsStorage",
              "value": "[reference('functionStorageAccount').outputs.storageAccountConnString.value]"
            },
            {
              "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
              "value": "[reference('functionStorageAccount').outputs.storageAccountConnString.value]"
            },
            {
              "name": "WEBSITE_CONTENTSHARE",
              "value": "[toLower(variables('functionAppName'))]"
            },
            {
              "name": "FUNCTIONS_WORKER_RUNTIME",
              "value": "dotnet"
            },
            {
              "name": "AccoutLogin",
              "value": "[reference('mainStorage').outputs.storageAccountName.value]"
            },
            {
              "name": "AccountConnString",
              "value": "[reference('mainStorage').outputs.storageAccountConnString.value]"
            },                      
            {
              "name": "ServiceBusConnectionString",
              "value": "[reference('serviceBus').outputs.connectionString.value]"
            },
            {
              "name": "QueueName",
              "value": "[reference('serviceBus').outputs.queueName.value]"
            }
          ]
        }
      }
    },
    {
      "name": "serviceBus",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('serviceBusTemplateFolder'), '/', variables('serviceBusTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "location": { "value": "[parameters('location')]" }
        }
      }
    },
    {
      "name": "mainStorage",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2016-09-01",
      "dependsOn": [],
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/', variables('mainStorageTemplateFolder'), '/', variables('mainStorageTemplateFileName'), parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },       
        "parameters": {
          "location": { "value": "[parameters('location')]" },
          "mainStorageAccountType": { "value": "[parameters('mainStorageAccountType')]" }
        }
      }
    }
  ],

nestedtemplates / mainStorage.json

"resources": [
    {
      "name": "[variables('mainStorageAccountName')]",
      "type": "Microsoft.Storage/storageAccounts",
      "location": "[parameters('location')]",
      "apiVersion": "2018-02-01",
      "sku": {
        "name": "[parameters('mainStorageAccountType')]"
      },
      "dependsOn": [],
      "kind": "StorageV2",
      "resources": [
        {
          "name": "[concat('default/', variables('containerName'))]",
          "type": "blobServices/containers",
          "apiVersion": "2018-03-01-preview",
          "dependsOn": [
            "[variables('mainStorageAccountName')]"
          ]
        }
      ]
    }
  ],
  "outputs": {
    "resourceID": {
      "type": "string",
      "value": "[resourceId('Microsoft.Storage/storageAccounts', variables('mainStorageAccountName'))]"
    },
    "storageAccountName": {
      "type": "string",
      "value": "[variables('mainStorageAccountName')]"
    },
    "storageAccountContainer": {
      "type": "string",
      "value": "[variables('containerName')]"
    },
    "storageAccountConnString": {
      "type": "string",
      "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('mainStorageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('mainStorageAccountName')),'2015-05-01-preview').key1)]"
    }
  }

nestedtemplates / serviceBus.json

"resources": [
    {
      "type": "Microsoft.ServiceBus/namespaces",
      "name": "[variables('serviceBusNamespaceName')]",
      "apiVersion": "2017-04-01",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard"
      },
      "properties": {},
      "resources": [
        {
          "apiVersion": "2017-04-01",
          "name": "[parameters('serviceBusQueueName1')]",
          "type": "Queues",
          "dependsOn": [
            "[concat('Microsoft.ServiceBus/namespaces/', variables('serviceBusNamespaceName'))]"
          ],
          "properties": {
            "lockDuration": "PT5M",
            "maxSizeInMegabytes": "1024",
            "requiresDuplicateDetection": "false",
            "requiresSession": "false",
            "defaultMessageTimeToLive": "P10675199DT2H48M5.4775807S",
            "deadLetteringOnMessageExpiration": "false",
            "duplicateDetectionHistoryTimeWindow": "PT10M",
            "maxDeliveryCount": "10",
            "autoDeleteOnIdle": "P10675199DT2H48M5.4775807S",
            "enablePartitioning": "false",
            "enableExpress": "false"
          }
        }
      ]
    }
  ],
  "outputs": {
    "resourceID": {
      "type": "string",
      "value": "[resourceId('Microsoft.ServiceBus/namespaces', variables('serviceBusNamespaceName'))]"
    },
    "connectionString": {
      "type": "string",
      "value": "[listkeys(variables('authRuleResourceId'), '2017-04-01').primaryConnectionString]"
    },
    "sharedAccessPolicyPrimaryKey": {
      "type": "string",
      "value": "[listkeys(variables('authRuleResourceId'), '2017-04-01').primaryKey]"
    },
    "queueName": {
      "type": "string",
      "value": "[parameters('serviceBusQueueName1')]"
    }
  }

1 个答案:

答案 0 :(得分:0)

好的,这没有什么意义。如果只需要一次,为什么还要部署两次相同的东西?答案是-您不会两次部署它。因此,请将其作为单独的资源\单独模板移动,并仅部署一个。只需将其密钥输入Web应用\功能应用即可。

  1. 将这些部署移动到主模板:mainStorageserviceBus。从中删除输出,输出是不安全的。
  2. 用输出"[reference('mainStorage').outputs.storageAccountConnString.value]"中的适当值替换"[concat('DefaultEndpointsProtocol=https;AccountName=', variables('mainStorageAccountName'), ';AccountKey=', listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('mainStorageAccountName')),'2015-05-01-preview').key1)]"。对所有输出重复此操作。
  3. 您还需要在webapp \ function应用上使用dependsOn来等待,直到实际创建了服务总线\存储为止

ps。为1个资源创建嵌套部署没有任何意义。我会将您的模板重新加工成平面模板。在这里使用嵌套部署是没有意义的。

相关问题