Есть ли обходной путь, чтобы блок копирования шаблона Azure ARM мог принять массив нулевой длины? - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю над шаблоном Azure ARM, в котором будет указан строковый параметр, ожидающий список адресов электронной почты через запятую.В шаблоне я хочу проанализировать это и скопировать в массив типов объектов, требуемых свойством emailReceivers типа ресурса Microsoft.Insights/ActionGroups.

Входные данные должны быть одной строкой, поскольку значение будетзаменить Octopus Deploy как часть нашего конвейера развертывания.

У меня есть шаблон, который работает нормально, если указан хотя бы один адрес электронной почты, но я хочу, чтобы это значение было необязательным.К сожалению, когда передается пустая строка, я получаю следующую ошибку:

Определение шаблона 'copy' в строке '0' и столбце '0' содержит неверный счетчик копий.Число копий должно быть положительным целочисленным значением и не должно превышать 800.

Очевидно, что массив нулевой длины не поддерживается этими блоками копирования, поэтому мне интересно, знает ли кто-нибудь обходной или хитрый взломэто позволит мне достичь того, чего я хочу.

Вот урезанный пример шаблона:

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "emailAddresses": {
      "type": "string",
      "defaultValue": "one@email.com, two@email.com",
      "metadata": {
        "description": "Comma-separated list of email recipients."
      }
    }
  },
  "variables": {
    "emailArray": "[if(equals(length(parameters('emailAddresses')), 0), json('[]'), split(parameters('emailAddresses'),','))]",
    "copy": [
      {
        "name": "emailReceivers",
        "count": "[length(variables('emailArray'))]",
        "input": {
            "name": "[concat('Email ', trim(variables('emailArray')[copyIndex('emailReceivers')]))]",
            "emailAddress": "[trim(variables('emailArray')[copyIndex('emailReceivers')])]"
        }
      }
    ]
  },
  "resources": [],
  "outputs": {
      "return": {
          "type": "array",
          "value": "[variables('emailReceivers')]"
      }
  }
}

Ответы [ 2 ]

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

Расширение того, что 4c74356b41 отправлено first - этот шаблон ARM будет работать с нулевым или большим количеством электронных писем:

{
  "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "emailAddresses": {
      "type": "string",
      "defaultValue": "one@email.com, two@email.com",
      "metadata": {
        "description": "Comma-separated list of email recipients."
      }
    }
  },
  "variables": {
    "emailArray": "[if(equals(length(parameters('emailAddresses')), 0), json('[]'), split(parameters('emailAddresses'),','))]",
    "copy": [
      {
        "name": "emailReceivers",
        "count": "[if(equals(length(variables('emailArray')), 0), 1, length(variables('emailArray')))]",
        "input": {
            "name": "[concat('Email ', if(equals(length(variables('emailArray')), 0),'',variables('emailArray')[copyIndex('emailReceivers')])     )]",
            "emailAddress": "[if(equals(length(variables('emailArray')), 0),'',variables('emailArray')[copyIndex('emailReceivers')])]" 
        }
      }

    ]
  },
  "resources": [],
  "outputs": {
      "return": {
          "type": "array",
          "value": "[variables('emailReceivers')]"
      }
  }
}

Использование файла параметров, например, такого:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "emailAddresses": {
            "value": "testEmail@mail.com"
        }
    }
}

или это

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "emailAddresses": {
            "value": ""
        }
    }
}

Принять ответ от 4c74356b41 - форматирование будет лучше, чем у комментариев.

Примечание -В моем тестировании выяснилось, что это не работает с ресурсами:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "DataDisks": {
            "type": "array",
            "metadata": {
                "description": "Combined DataDisk and DataDiskResource array"
            },
            "defaultValue": [
                {
                    "lun": 0,
                    "createOption": "attach",
                    "caching": "None",
                    "writeAcceleratorEnabled": false,
                    "id": null,
                    "name": "cgltest01_DataDisk_0",
                    "storageAccountType": null,
                    "diskSizeGB": 31,
                    "sku": "StandardSSD_LRS",
                    "creationData": {
                        "createOption": "empty"
                    }
                }
            ]
        }
    },
    "variables": {
        "Disks": "[parameters('DataDisks')]"
    },
    "resources": [
        {
            "name": "[if(equals(length(parameters('DataDisks')),0) ,'BogusName', parameters('DataDisks')[copyIndex()].name)]",
            "type": "Microsoft.Compute/disks",
            "condition": "[greater(length(parameters('DataDisks')), 0)]",
            "apiVersion": "2018-06-01",
            "location": "centralus",
            "properties": {
                "diskSizeGB": "[if(equals(length(parameters('DataDisks')),0) ,'123',   parameters('DataDisks')[copyIndex()].diskSizeGB)]",
                "creationData": "[if(equals(length(parameters('DataDisks')),0) , json('null'), parameters('DataDisks')[copyIndex()].creationData)]"
            },
            "sku": {
                "name": "[parameters('DataDisks')[copyIndex()].sku]"
            },
            "copy": {
                "name": "managedDiskResources",
                "count": "[if(equals(length(parameters('DataDisks')),0), 1 , length(parameters('DataDisks')))]"
            }
        }
    ],
    "outputs": {
        "return": {
            "type": "array",
            "value": "[variables('Disks')]"
        }
    }
}

Сбой с той же ошибкой массива вне границ:

Code    : InvalidTemplate
Message : Deployment template validation failed: 'The template resource 'BogusName' at line '34' and column '9' is not valid: The language expression 
          property array index '0' is out of bounds.. Please see https://aka.ms/arm-template-expressions for usage details.'.
Details : 
0 голосов
/ 27 ноября 2018

Ну, не напрямую, но вы могли бы сделать это:

"copy": [
  {
    "name": "emailReceivers",
    "count": "[if(equals(length(variables('emailArray')), 0), 1, length(variables('emailArray')))]",
    "input": {
        "name": "[concat('Email ', trim(variables('emailArray')[copyIndex('emailReceivers')]))]",
        "emailAddress": "[trim(variables('emailArray')[copyIndex('emailReceivers')])]" << these need the same if to put placeholder value inside
    }
  }
]

и затем где-нибудь вниз по линии вы бы реализовали условие, если длина равна 0 бла-бла-бла

...