Пользовательская функция шаблона Azure ARM

#azure #arm-template

#azure #arm-template

Вопрос:

Мне нужно создать базу данных 8 и пару коллекций через шаблон ARM.Я рассматривал определяемую пользователем функцию здесь https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-user-defined-functions чтобы упростить шаблон, могу ли я добиться этого вместо копирования и вставки одних и тех же скриптов? прямо сейчас он выдает ошибку

Ошибка проверки шаблона: неожиданная начальная строка токена при заполнении объекта.

Моя текущая функция:

 "functions": [
    {
      "namespace": "contoso",
      "members": {
        "uniqueName": {
          "parameters": [
            {
              "name": "databaseName",
              "type": "string"
            }
          ],
          "output": {
            "type": "object",
            "value": {
              "type": "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases",
              "name": "['test', '/', parameters('databaseName'))]",
              "apiVersion": "2020-04-01",
              "dependsOn": [ "[resourceId('Microsoft.DocumentDB/databaseAccounts/', 'test')]" ],
              "properties": {
                "resource": {
                  "id": "[parameters('databaseName')]"
                }
              }
            }
          }
        }
      }
    }
  ],
 

Это то, чего мы можем достичь?

Обновление: вот упрощенная версия

 {
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "accountName": {
            "type": "string",
            "defaultValue": "test",
            "metadata": {
                "description": "Cosmos DB account name"
            }
        },
        "databaseName": {
            "type": "string",
            "metadata": {
                "description": "Cosmos DB database name"
            }
        }
    },
    "functions": [
        {
            "namespace": "contoso",
            "members": {
                "uniqueName": {
                    "parameters": [
                        {
                            "name": "databaseName",
                            "type": "string"
                        }
                    ],
                    "output": {
                        "type": "object",
                        "value": {
                            "type": "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases",
                            "name": "[concat('/test', '/', parameters('databaseName'))]",
                            "apiVersion": "2020-04-01",
                            "dependsOn": [ "[resourceId('Microsoft.DocumentDB/databaseAccounts/', 'test')]" ],
                            "properties": {
                                "resource": {
                                    "id": "[parameters('databaseName')]"
                                }
                            }
                        }
                    }
                }
            }
        }
    ],
    "resources": [
        {
            "type": "Microsoft.DocumentDB/databaseAccounts",
            "name": "[parameters('accountName')]",
            "apiVersion": "2020-04-01",
            "location": "central us",
            "kind": "MongoDB",
            "properties": {
                "isVirtualNetworkFilterEnabled": false,
                "databaseAccountOfferType": "Standard",
                "apiProperties": {
                    "serverVersion": "3.6"
                }
            }
        },
        "[contoso.uniqueName(parameters('databaseName'))]"
    ]
}
 

Комментарии:

1. Можете ли вы предоставить общий доступ ко всему шаблону? Я могу предположить, как вы это используете, но я хотел бы быть уверенным.

2. Здесь я получаю сообщение об ошибке «[contoso.UniqueName(parameters(‘DatabaseName’))]»

Ответ №1:

Похоже, вы пытаетесь создать несколько mongodbDatabases внутри databaseAccounts ресурса.

Я рекомендую посмотреть на элемент ARM copy . https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/copy-resources#resource-iteration

Это будет выглядеть примерно так:

 {
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "accountName": {
      "type": "string",
      "defaultValue": "test",
      "metadata": {
        "description": "Cosmos DB account name"
      }
    },
    "databaseNames": {
      "type": "array",
      "defaultValue": [
        "contoso",
        "fabrikam",
        "coho"
      ],
      "metadata": {
        "description": "Cosmos DB database names array"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.DocumentDB/databaseAccounts",
      "name": "[parameters('accountName')]",
      "apiVersion": "2020-04-01",
      "location": "central us",
      "kind": "MongoDB",
      "properties": {
        "isVirtualNetworkFilterEnabled": false,
        "databaseAccountOfferType": "Standard",
        "apiProperties": {
          "serverVersion": "3.6"
        }
      }
    },
    {
      "type": "Microsoft.DocumentDB/databaseAccounts/mongodbDatabases",
      "name": "[concat('/test', '/', parameters('databaseNames')[copyIndex()])]",
      "apiVersion": "2020-04-01",
      "dependsOn": [ "[resourceId('Microsoft.DocumentDB/databaseAccounts/', 'test')]" ],
      "properties": {
        "resource": {
          "id": "[parameters('databaseNames')[copyIndex()]]"
        }
      },
      "copy": {
        "name": "databaseCopy",
        "count": "[length(parameters('databaseNames'))]"
      }
    }
  ]
}
 

Комментарии:

1. Отлично, это именно то, что я искал.