通过ARM模板

时间:2017-08-22 18:10:38

标签: azure azure-cloud-services azure-powershell azure-resource-manager arm-template

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

但是,我们仍然坚持使用 Cloud Service(经典)组件。云服务组件中仅包含WebRole,不需要配置VM。

我们可以通过经典的部署模型,即在power shell中使用ASM命令。但是,因为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"
        }
    ]
}

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

如果我尝试执行上面的脚本,执行会在检查部署一段时间后停滞不前,并且必须手动终止脚本执行。 Script execution

但是,如果我在power shell中运行以下命令,它会在portal中成功创建一个资源:

  

New-AzureRmResource -Location" South India" -ResourceName   " 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中创建了一个新的VM。
  2. 导入的AzureRM模块。
  3. 尝试使用默认值模板配置云服务。 (如上所述)
  4. 现在尝试通过从powershell传递参数来进行配置。 (工作正常)
  5. 现在再次使用默认值模板。 (工作正常)

2 个答案:

答案 0 :(得分:4)

我建议您从Azure门户中的模板部署验证您的Cloud Service ARM模板。

我可以使用下面的模板部署裸机Cloud Service,并在几秒钟内完成部署。

当您尝试从Azure门户创建新的Cloud Service时,您还可以通过单击“自动化”选项来“反向工程”Cloud Service ARM模板。

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

注意:

我已经在南印度位置进行了部署,但它确实有效。

<强>附录:

我使用PowerShell脚本部署了如下模板,它也可以正常工作。

Azure PowerShell版本 4。3。1(2017年8月)

屏幕截图如下。 enter image description here

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

enter image description here

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

答案 1 :(得分:1)

我们也可以使用REST API来做到这一点,我用fiddler测试它。

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

enter image description here

注意:请确保您的订阅支持在该位置创建cloudservice。如果不支持,我们将收到以下错误。

  

位置限制无效