天蓝色嵌套模板依赖项处理错误

时间:2018-11-11 14:36:25

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

似乎azure处理嵌套的模板依赖项,如果找不到资源,则失败。

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

  • 模板1:创建VNet和私有DNS区域。
  • 模板2:创建一个Nic(可能带有一个vm)
  • 模板3:在DNS区域中为Nic添加A记录。

模板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

(此示例使用更大的模板简化了我的问题,该模板部署在多个资源组上)

有什么想法如何处理吗?

1 个答案:

答案 0 :(得分:1)

这是不正确的,如果您再部署一次模板,它将起作用,并且部署将彼此等待。因此,模板中的dependsOn属性没有任何问题。但是,如果您查看该错误,则会注意到该错误是关于找不到app_vnic NIC。此错误来自引用函数,而不是嵌套的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模板充满了奇怪的行为,我建议您不要使用它们(除非您知道自己在做什么)。

相关问题