Azure RM模板:使用copyIndex()

时间:2017-06-29 08:19:18

标签: azure arm-template

this问题后,我需要更进一步,能够创建多个不同大小的数据磁盘,其中数量和大小是在部署时指定的。

我最近的化身是在VM资源之外的自己的资源中创建(托管)磁盘,然后尝试附加它们。

似乎copyindex会为每个资源重置,因此我认为我需要在一个副本中创建它们,以便"附加" VM资源中的一部分可以使用length函数,但是当达到某个迭代时我无法想到改变复制循环内任何属性的方法(我会理解为什么这是不可能的)。

我认为我需要使用类似的东西:

"count": "[variables('numberOfDisks')[parameters('DiskSize')]]" 

但不确定如何继续。

我也考虑过嵌套模板,但同样,这也无法改变循环内的参数。

在编程中,我可以创建一个二维数组或字典对象,但是在ARM模板中找不到这样做的方法,尽管我刚刚找到了Intersection

Datadisk配置示例: 每个部署的大小和数量都不尽相同。对于任何给定的VM,预计所有其他属性对于所有磁盘都是相同的。

  • VM 1:2x @ 256GB,4x @ 512GB,4x @ 1023GB
  • VM 2:1x @ 1023GB,1x @ 80GB
  • VM 3:1x @ 1023GB,1x @ 80GB,2x @ 256GB,2x @ 512GB

我的模板只部署一个VM,但磁盘的数量和大小未知。 DSC的想法将出现并创建卷,根据其大小整理磁盘。

我不会粘贴我的工作,因为它们很长,错误并且批量发布这篇文章。希望上述内容足以证明我一直在努力为自己解决问题。

1 个答案:

答案 0 :(得分:1)

所以我成功实现了它。可能不是最优雅,但它的工作原理。虽然Microsoft seem to suggest using a top-level resource创建了数据脚本,但是我看不出它是如何工作的,因为我不知道在DependsOn []中使用copy []的方法,如果你要创建磁盘和vm,这是必需的相同的模板,他们将尝试同时部署。

对于那些可能感兴趣的人,这是我的解决方案:

首先,我使用PowerShell的New-AzureRmResourceDeployment触发模板。我没有使用参数文件。参数在PS中生成。

$RG = "ResourceGroup where VM resides"

$Disks = @(
    @{name = "datadisk-001";diskSizeGB = "256";lun = 0}
    @{name = "datadisk-002";diskSizeGB = "256";lun = 1}
    @{name = "datadisk-003";diskSizeGB = "512";lun = 2}
    @{name = "datadisk-004";diskSizeGB = "512";lun = 3}
    @{name = "datadisk-005";diskSizeGB = "512";lun = 4}
    @{name = "datadisk-006";diskSizeGB = "512";lun = 5}
)

$params = @{
    diskConfig = $disks 
    storageAccounttype = "Standard_LRS"
    vmName = "AUCADN102007006"
}

New-AzureRmResourceGroupDeployment -Name "SomeDeploymentName" `
                                       -ResourceGroupName $RG `
                                       -Mode Incremental `
                                       -DeploymentDebugLogLevel All `
                                       -TemplateFile C:\Temp\DiskTest.json" `
                                       -Verbose `
                                       @params

模板本身被严重削减,实际上并没有创建VM。引用的VM需要存在。我已经尽可能地拿走了。

    {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string"
    },
    "diskConfig": {
      "type": "array"
    },
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Type of disk"
      }
    }
  },
  "variables": {
    "vmSize": "Standard_DS4_v2",
    "sharedVariables": {
      "storageAccountType": "[parameters('storageAccountType')]"
    }
  },
  "resources": [
    {
      "apiVersion": "2017-03-30",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[parameters('vmName')]",
      "location": "[resourceGroup().location]",
      "dependsOn": [
      ],
      "properties": {
        "storageProfile": {
          "copy": [
            {
              "name": "dataDisks",
              "count": "[length(parameters('diskConfig'))]",
              "input": {
                "name": "[concat(parameters('vmName'),'-',parameters('diskConfig')[CopyIndex('dataDisks')].name)]",
                "diskSizeGB": "[parameters('diskConfig')[CopyIndex('dataDisks')].diskSizeGB]",
                "lun": "[parameters('diskConfig')[copyIndex('dataDisks')].lun]",
                "createOption": "Empty",
                "managedDisk": {
                  "storageAccountType": "[variables('sharedVariables').storageAccountType]"
                }
              }
            }
          ]
          }
        }
       }
     ],
        "outputs": {
          "arrayOutput1": {
            "type": "array",
            "value": "[parameters('diskConfig')]"
          },
          "arrayCount": {
            "type": "int",
            "value": "[length(parameters('diskConfig'))]"
          }
        }
      }

感谢this帖子,其中作者演示了索引的使用:

"properties": {
 "accountType": "  [parameters('storageAccountList')[copyIndex()].storageAccountType]"  
    }

请注意copyIndex()在[]

中的含义

ToDo:使用$Disks做更好的事情,使用PS创建哈希表或在模板中创建哈希表。

HTH