azure 嵌套模板依赖处理错误
azure nested templates dependency processing error
似乎 azure 处理了一个嵌套的模板依赖项,但如果找不到资源就会失败。
例如,我有 3 个嵌套 模板:
- 模板 #1:创建 VNet 和私有 DNS 区域。
- 模板 #2:创建 Nic(可能带有虚拟机)
- 模板 #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
(这个例子简化了我在更大的模板上遇到的问题,部署在多个资源组上)
知道如何处理吗?
这不是真的,如果您再次部署您的模板,它就会工作,并且部署将相互等待。所以模板中的 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 模板充满了奇怪的行为,我建议不要使用它们(除非你知道自己在做什么)。
似乎 azure 处理了一个嵌套的模板依赖项,但如果找不到资源就会失败。
例如,我有 3 个嵌套 模板:
- 模板 #1:创建 VNet 和私有 DNS 区域。
- 模板 #2:创建 Nic(可能带有虚拟机)
- 模板 #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
(这个例子简化了我在更大的模板上遇到的问题,部署在多个资源组上)
知道如何处理吗?
这不是真的,如果您再次部署您的模板,它就会工作,并且部署将相互等待。所以模板中的 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 模板充满了奇怪的行为,我建议不要使用它们(除非你知道自己在做什么)。