通过 ARM 模板提供经典云服务

Provision classic cloud service via ARM template

在我们的一个项目中,我们正在尝试在 Azure 上自动部署云组件。对于大多数组件 (基本上所有 ARM 组件,如 Redis、服务总线、应用服务等) 我们能够使用 ARM 模板和 Powershell 脚本实现它。

但是,我们卡在了 云服务(经典) 组件。云服务组件仅包含WebRole,无需配置VM。

我们可以通过经典的部署模型,即使用 ASM 命令作为动力 shell。但是,由于 ARM 模型支持从 azure 门户进行配置和部署,所以我想知道 ARM REST API 一定也具有对该组件的开箱即用支持。我试图弄清楚但找不到任何相关文档。


到目前为止我尝试了什么

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"
        }
    ]
}

电源shell脚本:

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

如果我尝试执行上述脚本,执行会在检查部署处停滞一个小时左右,必须手动终止脚本执行。 .


但是,如果我 运行 遵循命令 shell,它会在门户中成功创建资源:

New-AzureRmResource -Location "South India" -ResourceName "cloudsmplservice" -ResourceType "Microsoft.ClassicCompute/domainNames" -ResourceGroupName "FreeTrial"

但我不明白 ARM 模板方法有什么问题。有人可以用第一种方法指导我解决问题吗?


附录:

我发现了 st运行ge 行为。如果我在资源定义中硬编码资源名称值或在 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"
    }
  ]
}

附录 2:

似乎有些电源shell 配置问题。将向 Azure 团队报告更多详细信息。因此,far 能够通过简单的步骤重现它:

  1. 在 Azure 中创建了一个新的 VM。
  2. 导入的 AzureRM 模块。
  3. 尝试使用默认值模板提供云服务。 (如前所述卡住了)
  4. 现在尝试通过传递来自 powershell 的参数进行配置。 (工作正常)
  5. 现在使用默认值模板重试。 (工作正常)

我建议您从 Azure 门户中的模板部署验证您的云服务 ARM 模板。

我可以使用下面的模板部署裸机云服务,并且部署在几秒钟内就成功了。

尝试从 Azure 门户创建新的云服务时,您还可以通过单击“自动化”选项来 "reverse engineer" 云服务 ARM 模板。

我没有看到通过 ARM 模板方法自动化云服务的问题。

注:

我已经在 南印度 位置部署了这个并且它有效。

附录:

我已经使用您的 PowerShell 脚本部署了如下模板,它也能正常工作。

Azure PowerShell 版本为 4.3.1(2017 年 8 月)

截图如下。

{
    "$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:

尝试使用具有默认参数值的模板,部署也成功。

注意:我注意到您的 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

注意:请确保您的订阅支持在该位置创建云服务。如果不支持,我们会得到如下错误。

The location constraint is not valid