Can I have an ARM template resource with a COPY array of 0 to N
So in the Interest of Time, I have changed my approach to this, but don't really like it...
I now have two deploy json files, VMDeploy.json
and VMDeploy-NoDataDisks.json
.
They are identical other than the storageProfile section of the VM resource:
VMDeploy.json
:
"storageProfile": {
"imageReference": { ... },
"osDisk": { ... },
"copy": [
{
"name": "dataDisks",
"count": "[length(parameters('VirtualMachineDiskSizeArray'))]",
"input": {
"lun": "[copyIndex('dataDisks')]",
"name": "[concat(parameters('vmDataDiskNameStub'), add(copyIndex('dataDisks'),1), '.vhd')]",
"diskSizeGB": "[parameters('VirtualMachineDiskSizeArray')[copyIndex('dataDisks')]]",
"createOption": "Empty",
"vhd": {
"uri": "[concat(concat(reference(resourceId(parameters('rgName'), 'Microsoft.Storage/storageAccounts', parameters('rgStorageAccountName')), '2015-06-15').primaryEndpoints['blob'], 'vhds/'), concat(parameters('vmDataDiskNameStub'), add(copyIndex('dataDisks'),1), '.vhd') )]"
}
}
}
]
}
VMDeploy-NoDataDisks.json
:
"storageProfile": {
"imageReference": { ... },
"osDisk": { ... },
"dataDisks": []
}
And I have a Powershell block switches between the two json files:
if ($DriveArray.Count -eq 0) {
$TemplateFile = $TemplateFile.Replace('.json','-NoDataDisks.json')
}
The easiest way to work around that is using this:
{
"condition": "[if(equals(parameters('numberOfDataDisks'), 0), bool('false'), bool('true'))]",
"apiVersion": "2017-03-30",
"type": "Microsoft.Compute/virtualMachines",
"name": "[variables('vmName')]",
"location": "[resourceGroup().location]",
"properties": {
"storageProfile": {
"imageReference": { xxx },
"osDisk": { xxx },
"copy": [
{
"name": "dataDisks",
"count": "[if(equals(parameters('numberOfDataDisks'), 0), 1, parameters('numberOfDataDisks'))]",
"input": {
"diskSizeGB": "1023",
"lun": "[copyIndex('dataDisks')]",
"createOption": "Empty"
}
}
]
}
}
}
this will work around the fact that you are passing 0 data disks and at the same time wont deploy this vm. all you need to do is add another vm resource. But it has to be with a different name (else template will fail) or you can use nested template to deploy a vm with the same name.
this can be improved with recent fixes to if()
function, you can always work around by using nested deployments as well