如何等待在Arm模板中的另一个ResourceGroup中部署资源

时间:2020-07-01 14:02:08

标签: azure templates nested arm-template

我们希望有两个资源组,一个是共享资源组,用于共享资源,例如应用程序服务计划,... 2-其他资源组,用于其他资源,例如网络应用程序。 我们正在使用包含三个级别的嵌套链接模板:

  1. 最高级别是包含所有内容的主部署模板文件。
  2. 下一级别用于为每个资源组调用所有资源模板,例如,在此级别中,我们有两个模板文件,一个用于共享资源组,另一个用于其他资源组,因此,例如,第一个文件将调用某个链接模板创建应用程序服务计划,弹性池和...。 第二个文件将调用用于部署Web应用程序,网络和...的链接模板。
  3. 最后一层是我们的通用资源模板,在这一层中,对于每个资源,我们都有一个模板文件,例如,对于web-app,我们有一个通用模板,该模板可以使用一些参数来部署web-app。 现在的问题是,在部署所有其他资源之后,我们如何才能首先使用“ dependson”来创建所有共享资源?

*请注意:共享资源位于不同的资源组中,其他资源位于另一个资源组中,因此我们有两个资源组,并且所有包含的资源都部署在主模板文件中。

我的主要部署模板文件是这样:

    // Include rg-CockpitShared and app specific resources - and share parameters
   {
     "$schema": "https://schema.management.azure.com/schemas/2018-05- 
  01/subscriptionDeploymentTemplate.json#",
     "contentVersion": "1.0.0.0",
     "parameters": {
       "location": {
      "type": "string"
    },
    "cockpitEnvironment": {
      "type": "string"
    }
  },
  "variables": {
    "currentTemplateUri": "[deployment().properties.templateLink.uri]",
    "rgCockpitSharedUrl": "[concat(uri(variables('currentTemplateUri'), 'rg-CockpitShared/rg-CockpitShared.json'))]",
    "rgCockpitSharedParametersUrl": "[concat(uri(variables('currentTemplateUri'), concat('rg-CockpitShared/rg-CockpitShared.parameters.', parameters('cockpitEnvironment'), '.json')))]",
    "rgClientCmdbTemplateUrl": "[concat(uri(variables('currentTemplateUri'), 'rg-ClientCmdb/rg-ClientCmdb.json'))]",
    "rgClientCmdbParametersUrl": "[concat(uri(variables('currentTemplateUri'), concat('rg-ClientCmdb/rg-ClientCmdb.parameters.', parameters('cockpitEnvironment'), '.json')))]"

  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "location": "[parameters('location')]",
      "apiVersion": "2019-10-01",
      "name": "CockpitShared",
      "tags": {
        "devOwner": "aspBuild"
      },
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[variables('rgCockpitSharedUrl')]",
           "contentVersion": "1.0.0.0"
        },
        "parametersLink": {
          "uri": "[variables('rgCockpitSharedParametersUrl')]",
           "contentVersion": "1.0.0.0"
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "location": "[parameters('location')]",
      "apiVersion": "2019-10-01",
      "name": "otherResources",
      "tags": {
        "devOwner": "aspBuild"
      },
      "dependsOn": [
        "CockpitShared"
      ],
      "properties": {
        "mode": "Incremental",     
        "templateLink": {
          "uri": "[variables('rgClientCmdbTemplateUrl')]",
           "contentVersion": "1.0.0.0"
        },
        "parametersLink": {
          "uri": "[variables('rgClientCmdbParametersUrl')]",
           "contentVersion": "1.0.0.0"
        }
      }
    }
  ],

  "outputs": {
    "rgCockpitSharedUrl": {
      "type": "string",
      "value": "[variables('rgCockpitSharedUrl')]"
    },
    "rgCockpitSharedParametersUrl": {
      "type": "string",
      "value": "[variables('rgCockpitSharedParametersUrl')]"
    }
  }
}

所以我在这里所做的是使用dependsOn =“ CockpitShared”,并期望它首先部署共享资源,然后开始部署“ otherResources”,但是我得到一个错误,即找不到app-service-plan,这意味着等不及要部署共享资源,我不明白为什么? :(

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案: 我使用“引用”而不是“依赖”。 因此,在我的共享资源分支模板中,我返回应用程序服务计划名称作为输出,并从我的主部署文件中使用它,以便它等待首先完成共享资源部署,然后再开始部署Web应用程序。 有关更多详细信息,请参见下面的代码:

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string"
    },
    "cockpitEnvironment": {
      "type": "string"
    },
    "storageAccountUri": {
      "type": "string"
    }
  },
  "variables": {
    "rgCockpitSharedUrl": "[concat(uri(parameters('storageAccountUri'), 'rg-CockpitShared/rg-CockpitShared.json'))]",
    "rgClientCmdbTemplateUrl": "[concat(uri(parameters('storageAccountUri'), 'ClientCmdb/rg-ClientCmdb/rg-ClientCmdb.json'))]"

  },
  "functions": [
    {
      "namespace": "ClientCmdb",
      "members": {
        "SelectValueByEnv": {
          "parameters": [
            {
              "name": "Environment",
              "type": "string"
            },
            {
              "name": "prodValue",
              "type": "string"
            },
            {
              "name": "devValue",
              "type": "string"
            },
            {
              "name": "testValue",
              "type": "string"
            }
          ],
          "output": {
            "type": "string",
            "value": "[if(equals(parameters('Environment'),'prod'),parameters('prodValue'),if(equals(parameters('Environment'),'dev'),parameters('devValue'),parameters('testValue')))]"
          }
        }
      }
    }
  ],
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "location": "[parameters('location')]",
      "apiVersion": "2019-10-01",
      "name": "CockpitShared",
      "tags": {
        "devOwner": "aspBuild"
      },
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[variables('rgCockpitSharedUrl')]"
        },
        "parameters": {
          "rgName": {
            "value": "[ClientCmdb.SelectValueByEnv(parameters('cockpitEnvironment'),'rg-CockpitShared','rg-CockpitShared','rg-CockpitShared')]"
          },
          "location": {
            "value": "[parameters('location')]"
          },
          "cockpitEnvironment": {
            "value": "[parameters('cockpitEnvironment')]"
          }
        }
      }

    },
    {
      "type": "Microsoft.Resources/deployments",
      "location": "[parameters('location')]",
      "apiVersion": "2019-10-01",
      "name": "ClientCmdb",
      "tags": {
        "devOwner": "aspBuild"
      },
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[variables('rgClientCmdbTemplateUrl')]"
        },
        "parameters": {
          "rgName": {
            "value": "[ClientCmdb.SelectValueByEnv(parameters('cockpitEnvironment'),'rg-ClientCmdb','rg-ClientCmdb','rg-ClientCmdb')]"
          },
          "location": {
            "value": "[ClientCmdb.SelectValueByEnv(parameters('cockpitEnvironment'),'northeurope','northeurope','northeurope')]"
          },
          "cockpitEnvironment": {
            "value": "[parameters('cockpitEnvironment')]"
          },
          "planName": {


// Here__________________________________________________________________________________
            "value": "[reference('CockpitShared').outputs.planName.value]"
          }
        }
      }
    }
  ],

 
}

因此,基本上我将我的应用程序服务计划名称从共享资源模板传递到主模板,并且主模板通过“引用”将其获取,然后通过参数将其传递给其他资源模板。 为此,我必须使用内联参数,就像我在单独文件中使用参数一样。

希望对其他人有用:)