azure 嵌套模板依赖处理错误

azure nested templates dependency processing error

似乎 azure 处理了一个嵌套的模板依赖项,但如果找不到资源就会失败。

例如,我有 3 个嵌套 模板:

模板Json:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "apiVersion": "2017-05-10",
            "name": "VnetTemplate",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                       {
                         "properties":{
                            "subnets":[
                               {
                                  "properties":{
                                     "addressPrefix":"10.0.0.0/24"
                                  },
                                  "name":"default"
                               }
                            ],
                            "addressSpace":{
                               "addressPrefixes":[
                                  "10.0.0.0/24"
                               ]
                            }
                         },
                         "type":"Microsoft.Network/virtualNetworks",
                         "location":"[resourceGroup().location]",
                         "name":"my_vnet",
                         "apiVersion":"2017-10-01"
                      },
                     {
                         "properties":{
                            "resolutionVirtualNetworks":[
                               {
                                  "id":"[resourceId('Microsoft.Network/virtualNetworks/','my_vnet')]"
                               }
                            ],
                            "zoneType":"Private"
                         },
                         "type":"Microsoft.Network/dnsZones",
                         "location":"global",
                         "dependsOn":["my_vnet"],
                         "name":"my.dns",
                         "apiVersion":"2017-10-01"
                      }
                    ]
                }
            }
        },
        {
            "apiVersion": "2017-05-10",
            "name": "NicTemplate",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        {
                            "properties":{
                                "ipConfigurations":[
                                   {
                                      "properties":{
                                         "privateIPAllocationMethod":"Dynamic",
                                         "subnet":{
                                            "id":"[resourceId('Microsoft.Network/virtualNetworks/subnets', 'my_vnet', 'default')]"
                                         }
                                      },
                                      "name":"app_vnic_IPConf"
                                   }
                                ]
                             },
                             "type":"Microsoft.Network/networkInterfaces",
                             "location":"[resourceGroup().location]",
                             "name":"app_vnic",
                             "apiVersion":"2017-10-01"
                        }
                    ]
                }
            },
            "dependsOn":[
                "VnetTemplate"
            ]
        },
        {
            "apiVersion": "2017-05-10",
            "name": "DnsRecordTemplate",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                        {
                         "properties":{
                            "TTL":3600,
                            "ARecords":[
                               {
                                  "ipv4Address":"[reference(resourceId('Microsoft.Network/networkInterfaces/','app_vnic'), '2017-10-01').ipConfigurations[0].properties.privateIPAddress]"
                               }
                            ]
                         },
                         "type":"Microsoft.Network/dnsZones/A",
                         "name":"my.dns/my_app",
                         "apiVersion":"2017-10-01"
                      }
                    ]
                }
            },
            "dependsOn": [
                "NicTemplate"
            ]
        }
    ]
}

我原以为最后一个嵌套模板要等到前两个模板完成后才会处理,但事实并非如此。

Screen Shot 2

Screen Shot 1

(这个例子简化了我在更大的模板上遇到的问题,部署在多个资源组上)

知道如何处理吗?

这不是真的,如果您再次部署您的模板,它就会工作,并且部署将相互等待。所以模板中的 dependsOn 属性没有任何问题。但是,如果您查看错误,您会注意到错误是关于 app_vnic NIC not found。此错误来自引用函数,而不是来自嵌套的 INLINE 模板(根据依赖项)在它应该开始之前开始。

要解决此问题,您需要将带有引用函数的模板转换为常规嵌套模板(非内联)。将它上传到一些可公开访问的地方并像这样引用它:

{
    "name": "NestedDeployment1",
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2015-01-01",
    "dependsOn": [
      "NicTemplate"
    ],
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "url_goes_here",
            "contentVersion": "1.0.0.0"
        }
    }
}

这样就可以了。

我不得不承认这是一个错误,但公平地说,嵌套的 INLINE 模板充满了奇怪的行为,我建议不要使用它们(除非你知道自己在做什么)。