ошибка обработки зависимостей вложенных шаблонов Azure - PullRequest
0 голосов
/ 11 ноября 2018

Кажется, что Azure обрабатывает вложенные зависимости шаблона и завершается ошибкой, если не находит ресурс.

Например, у меня есть 3 вложенных шаблона:

  • Шаблон № 1: Создает виртуальную сеть и частную DNS-зону.
  • Шаблон № 2: Создает Nic (возможно, с виртуальной машиной)
  • Шаблон № 3: Добавляет A-запись для Nic в DNS-зоне.

Шаблон 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"
            ]
        }
    ]
}

Я ожидал, что последний вложенный шаблон не будет обработан, пока не будут выполнены первые 2, но это не так.

Снимок экрана 2

Снимок экрана 1

(Этот пример упрощает возникшую у меня проблему с гораздо большим шаблоном, развернутым в нескольких группах ресурсов)

Есть идеи, как с этим бороться?

1 Ответ

0 голосов
/ 11 ноября 2018

Это не так, если вы развернете шаблон еще раз, он будет работать, и развертывания будут ждать друг друга. Так что нет ничего плохого в зависимости от свойств вашего шаблона. Однако, если вы посмотрите на ошибку, вы заметите, что ошибка говорит о том, что 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 полны странного поведения, я бы советовал не использовать их (если вы не знаете, что делаете).

...