继this问题后,我需要更进一步,能够创建多个不同大小的数据磁盘,其中数量和大小是在部署时指定的。
我最近的化身是在VM资源之外的自己的资源中创建(托管)磁盘,然后尝试附加它们。
似乎copyindex会为每个资源重置,因此我认为我需要在一个副本中创建它们,以便"附加" VM资源中的一部分可以使用length函数,但是当达到某个迭代时我无法想到改变复制循环内任何属性的方法(我会理解为什么这是不可能的)。
我认为我需要使用类似的东西:
"count": "[variables('numberOfDisks')[parameters('DiskSize')]]"
但不确定如何继续。
我也考虑过嵌套模板,但同样,这也无法改变循环内的参数。
在编程中,我可以创建一个二维数组或字典对象,但是在ARM模板中找不到这样做的方法,尽管我刚刚找到了Intersection。
Datadisk配置示例: 每个部署的大小和数量都不尽相同。对于任何给定的VM,预计所有其他属性对于所有磁盘都是相同的。
我的模板只部署一个VM,但磁盘的数量和大小未知。 DSC的想法将出现并创建卷,根据其大小整理磁盘。
我不会粘贴我的工作,因为它们很长,错误并且批量发布这篇文章。希望上述内容足以证明我一直在努力为自己解决问题。
答案 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