8

Azure 资源管理器 (ARM) 模板能够使用链接模板。这些链接模板可以定义要在 ARM 模板部署期间创建的其他资源。

ARM 模板支持确保某些资源先于其他资源创建的依赖项。

我想在链接模板中为在主模板中创建的资源指定依赖关系。如果我在链接模板中包含依赖项,它看起来像这样:

"resources": [
    {
        "apiVersion": "2015-08-01",
        "type": "Microsoft.Web/sites/hostNameBindings",
        "name": "[concat(parameters('siteName'),'/', parameters('fqdn'))]",
        "dependsOn": [
            "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
        ],
        "properties": {
            "siteName": "[parameters('siteName')]"
        }
    }
]

虽然dependsOn看起来正确,但资源是在 处创建的Microsoft.Web/sites/{siteNameParameter},部署 ARM 模板会输出以下错误消息:

InvalidTemplate:部署模板验证失败:'资源'Microsoft.Web/sites/blahblahblahblah'未在模板中定义。请参阅https://aka.ms/arm-template了解使用详情。

当我定义链接模板调用时,我目前正在模板中定义此依赖项。这看起来很脆弱,很容易折断。有没有比在主 ARM 模板中定义依赖项更好的方法?

{
    "apiVersion": "2015-01-01",
    "name": "SomeName",
    "type": "Microsoft.Resources/deployments",
    "dependsOn": [
        "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
    ],
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "https://tempuri.org/supersecrettemplatepath/azuredeploy.json",
            "contentVersion": "1.0.0.0"
        },
        "parameters":
        {
            "fqdn": {
                "value": "www.tempuri.org"
            },
            "siteName": {
                "value": "[parameters('siteName')]"
            }
        }
    }
}
4

3 回答 3

6

您可以通过任何一种方式定义依赖关系 - 两者都是有效的。将依赖关系放在部署资源(您的第二种方法)将意味着在供应网站之前不会启动整个嵌套部署。如果您想并行启动一些事情,那么您可以将依赖项放在嵌套模板中(您的第一种方法)。这对您的方案可能很重要,也可能无关紧要,但这是一个关键的区别。

dependsOn需要resourceId- 并且正如错误试图说的那样,如果资源未在模板中定义,则您需要更多详细信息resourceId,在这种情况下,您需要resourceGroup(可能是订阅,但我对此表示怀疑)。因此,例如,您可以使用:

"dependsOn": [
    "[resourceId(resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
于 2016-09-02T22:02:44.850 回答
5

dependsOn 需要链接部署的名称,而不是其中的资源之一。

例如:

依赖:“Microsoft.Resources/deployments/myExternalTemplate”

于 2018-12-07T12:50:29.010 回答
-1
"dependsOn": [
    "[resourceId(subscription().subscriptionId, resourceGroup().name, 'Microsoft.Web/sites', parameters('siteName'))]"
],
于 2017-01-22T07:39:05.677 回答