Предоставление классического облачного сервиса с помощью шаблона ARM


В одном из наших проектов мы пытаемся автоматизировать развертывание облачных компонентов в Azure. Для большинства компонентов (в основном все компоненты ARM, такие как Redis, служебная шина, служба приложений и т. д.) мы смогли добиться этого, используя шаблоны ARM и сценарий Powershell.

Однако мы застряли на компонентеCloud Service (classic) . Компонент облачной службы содержит только WebRole и не требует подготовки виртуальной машины.

Мы можем перейти к классической модели развертывания то есть использование команд ASM в power shell. Но поскольку модель ARM поддерживает инициализацию и развертывание с портала azure, мне было интересно, что API ARM REST также должен иметь стандартную поддержку для этого компонента. Я пытаюсь выяснить, но не могу найти никакой связанной с этим документации.


То, что я пробовал до сих пор

Шаблон Azure (AzureDeploy.json)

{
    "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
    "parameters": {
        "name": {
            "type": "string"
        },
        "location": {
            "type": "string"
        }
    },
    "resources": [
         {
            "apiVersion": "2014-06-01",
            "name": "[parameters('name')]",
            "location": "[parameters('location')]",
            "type": "Microsoft.ClassicCompute/domainNames"
        }
    ]
}

Сценарий Powershell:

Param(
    [string] $ResourceGroupLocation = 'South India',
    [string] $ResourceGroupName = 'FreeTrial',
    [string] $TemplateFile = 'AzureDeploy.json'
)

$TemplateFile = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, $TemplateFile))

New-AzureRmResourceGroup -Name $ResourceGroupName -Location $ResourceGroupLocation -Verbose -Force -ErrorAction Stop 
New-AzureRmResourceGroupDeployment -Name ((Get-ChildItem $TemplateFile).BaseName + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) `
                                   -ResourceGroupName $ResourceGroupName `
                                   -TemplateFile $TemplateFile `
                                   -Force -Verbose

Если я попытаюсь выполнить приведенный выше сценарий, выполнение застрянет при проверке развертывание на час или около того и приходится вручную убивать выполнение скрипта. Выполнение скрипта.


Однако, если я запустил следующую команду в power shell, она успешно создает ресурс в portal:

New-AzureRmResource-Местоположение "Южная Индия" - Имя Ресурса "cloudsmplservice" - ResourceType "Microsoft.ClassicCompute/domainNames "- ResourceGroupName "FreeTrial"

Но я не понимаю, в чем проблема с шаблонным подходом ARM. Может кто-нибудь пожалуйста, направьте меня к проблеме в первом подходе?


Добавление:

Я обнаружил странное поведение. Если я жестко закодирую значение имени ресурса в определении ресурса или передам его при запросе powershell, развертывание будет работать нормально.

Однако, если я установлю некоторое значение по умолчанию для параметра или передам его через файл параметров, он не работает.

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "cloudName": {
      "type": "string",
      "defaultValue": "cloudsrvc"
    }
  },
  "resources": [
    {
      "apiVersion": "2015-06-01",
      "name": "[parameters('cloudName')]",
      "location": "[resourceGroup().location]",
      "type": "Microsoft.ClassicCompute/domainNames"
    }
  ]
}

Addendum2:

Похоже на какую-то проблему с конфигурацией powershell. Сообщу об этом в Azure команда с более подробной информацией. Итак, фар смог воспроизвести его с помощью простых шагов:

  1. создал новую виртуальную машину в azure.
  2. импортированные модули AzureRM.
  3. попробуйте предоставить облачный сервис с шаблоном значений по умолчанию. (Застрял, как уже упоминалось)
  4. попробуйте выполнить подготовку сейчас, передав параметр из powershell. (Работал отлично)
  5. теперь повторите попытку с шаблоном значения по умолчанию. (Работал отлично)
2 3

2 ответа:

Я рекомендую вам проверить ваш шаблон ARM облачной службы изразвертывания шаблона на портале Azure.

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

Вы также можете "перепроектировать" шаблон ARM облачной службы, нажав на опцию автоматизация при попытке создать новую облачную службу с портала Azure.

Я не видел проблемы в автоматизации облака Обслуживание шаблонным подходом ARM.

Примечание:

Я развернул это в Южной Индии, и это работает.

Добавление:

Я развернул шаблон, как показано ниже, с помощью вашего сценария PowerShell, и он также работает.

Версия Azure PowerShell - 4.3.1 (август 2017 г.) .

Скриншот, как показано ниже. Введите описание изображения здесь

{
    "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string"
        },
        "location": {
            "type": "string"
        }
    },
    "resources": [
        {
            "apiVersion": "2016-11-01",
            "name": "[parameters('name')]",
            "location": "[parameters('location')]",
            "type": "Microsoft.ClassicCompute/domainNames"
        }
    ]
}

Добавление 2:

Попробуйте использовать шаблон со значениями param по умолчанию и развертывание также работает успешно.

Примечание: я заметил, что ваша версия api старше, а версия api для моей облачной службы 2016-11-01

Введите описание изображения здесь

{
  "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "[resourceGroup().name]"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": [
    {
      "apiVersion": "2016-11-01",
      "name": "[parameters('name')]",
      "location": "[parameters('location')]",
      "type": "Microsoft.ClassicCompute/domainNames"
    }
  ]
}

Мы также можем использовать REST API для этого, я тестирую его с помощью fiddler.

https://management.azure.com/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/Microsoft.ClassicCompute/domainNames/{cloudservicename}?api-version=2016-04-01

Введите описание изображения здесь

Примечание : пожалуйста, убедитесь, что ваша подписка поддерживает создание cloudservice в этом месте. Если он не поддерживается, мы получим следующую ошибку.

Ограничение местоположения недопустимо