我可以拥有一个 COPY 数组为 0 到 N 的 ARM 模板资源吗
Can I have an ARM template resource with a COPY array of 0 to N
我正在部署一个 ARM 模板,该模板使用复制资源块将 1 个或多个数据磁盘部署到 VM。我想做的是将其更改为 0 或更多。
我使用的参数是
"VirtualMachineDiskSizeArray": {
"type": "array",
"defaultValue": [ "100" ]
},
然后在资源中调用:
"resources": [
{
"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"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') )]"
}
}
}
]
}
}
},
但是,当我传入一个包含 0 个元素的数据磁盘数组时,我得到了预期的错误:
Validation returned the following errors:
: Deployment template validation failed: 'The template 'copy' definition at line '0' and column '0' has an invalid copy count. The co
py count must be a postive integer value and cannot exceed '800'. Please see https://aka.ms/arm-copy for usage details.'.
Template is invalid.
我想尝试以某种方式解决这个问题 - 我尝试在副本上添加条件:
"condition": "[ greater(length(parameters('VirtualMachineDiskSizeArray')), 0)]",
但是返回了同样的错误。
我正在研究嵌套模板,但这对于资源的 部分 来说不太好。
所以在时间的兴趣,我改变了我的方法,但不太喜欢它......
我现在有两个部署 json 文件,VMDeploy.json
和 VMDeploy-NoDataDisks.json
。
除了 VM 资源的 storageProfile 部分之外它们是相同的:
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": []
}
我有一个 Powershell 块在两个 json 文件之间切换:
if ($DriveArray.Count -eq 0) {
$TemplateFile = $TemplateFile.Replace('.json','-NoDataDisks.json')
}
我将使用这个答案作为我对嵌套模板研究的参考。
查看 here 我可以看到一种有两个嵌套模板的方法,如下所示:
"resources": [
{
"name": "MultiDataDisk",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"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') )]"
}
}
}
]
}
}
}
]
还有一个像这样的:
"resources": [
{
"name": "ZeroDataDisk",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"storageProfile": {
"imageReference": { ... },
"osDisk": { ... },
"dataDisks": []
}
}
}
]
并从父模板中引用它们:
"parameters": {
"nestedType": {
"type": "string",
"defaultValue": "ZeroDataDisk",
"allowedValues": [
"ZeroDataDisk",
"MultiDataDisk"
],
}
},
"resources": [
{
"name": "[concat("nested-",parameters('virtualMachineName')]",
"type": "Microsoft.Resources/deployments",
"apiVersion": "2015-01-01",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[concat('https://someplace.on.the.internet/nested/',parameter('nestedType'),".json")],
"contentVersion": "1.0.0.0"
},
"parameters": {
"rgStorageAccountName": {
"value": "[parameters(rgStorageAccountName)]"
},
"OtherParms": {
"value": "[parameters('otherParms')]"
}
. . .
}
}
]
}
但是,我不认为这是 better/easier 我在 "Interest of Time" 回答中所做的,因为
- 我感兴趣的部分 (dataDisks) 被一堆其他 json 包围, 没有 改变让我遇到同样糟糕的问题必须在两个文件之间手动同步代码。
- 我现在不仅要为嵌套资源维护两个 json 文件,而且我必须通过可公开访问的 URL.
发布它们
所以基本上,除非我可以拥有一个部分的 0-N 副本(而不是 1-N)或只嵌套一个部分,否则我使用 powershell 开关的两个文件 hack 似乎开销最小。
最简单的解决方法是使用这个:
{
"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"
}
}
]
}
}
}
这将解决您正在传递 0 个数据磁盘并且同时不会部署此虚拟机的事实。您需要做的就是添加另一个虚拟机资源。但它必须具有不同的名称(否则模板将失败)或者您可以使用嵌套模板部署具有相同名称的虚拟机。
这可以通过最近对 if()
功能的修复得到改进,您也可以随时使用嵌套部署来解决这个问题
工作样本https://github.com/mariuszdotnet/azure-resource-manager-tutorial/blob/master/azuredeploy.json
摘要如下:
- 将磁盘移动到变量中并使用变量迭代。
- 如果 numDisks = 0 则 diskLoop = 1(这可以防止变量复制时出错)
- 使用 count = diskLoop 创建变量复制对象
"copy": [
{
"name": "dataDisks",
"count": "[if(equals(parameters('numberOfDataDisks'),0),1, parameters('numberOfDataDisks'))]",
"input": {
"lun": "[copyIndex('dataDisks')]",
"createOption": "Empty",
"diskSizeGB": "1023"
}
} ]
- 在数据盘的虚拟机资源上。
- 在虚拟机资源上,if numDisk=0 then datadisks = json(‘null’) else datadisks = variable
"dataDisks":
"[if(equals(parameters('numberOfDataDisks'),0),json('null'),variables('dataDisks'))]"
},
关于Disksize我可以帮你解决。
我实际所做的是参考 JSON 模板文件,其中为磁盘创建定义了大小、名称和缓存。
这些可以很容易地解析到部署
"storageProfile": {
"copy": [{
"name": "dataDisks",
"count": "[length(parameters('dataDiskArray'))]",
"input": {
"name": "[concat(parameters('vmName'), if(less(copyindex(1), 10), concat('0', copyindex(1)), concat(copyindex(1))), '-datadisk-', parameters('dataDiskArray')[copyIndex('dataDisks')].name)]",
"diskSizeGB": "[parameters('dataDiskArray')[copyIndex('dataDisks')].size]",
"caching": "[parameters('dataDiskArray')[copyIndex('dataDisks')].cache]",
"lun": "[copyIndex('dataDisks')]",
"createOption": "Empty"
}
}],
问题仍然是 VM 部署的一部分,因此如果您想在没有额外磁盘的情况下部署 VM,则无法选择 select 空值。
我已尝试将磁盘创建移动到模板的变量部分,但无法将 VMName 用作要创建的磁盘名称的一部分。这是因为VM的copy loop还没有初始化,所以会报错名字。
我想根据此处已有的许多答案分享我们的解决方案。这是一个简单的例子,它有一个输入磁盘阵列——值是它们的大小——并用你的虚拟机创建。从 0-n 开始工作。 n 需要小于您的 VM 大小和其他 azure 限制所支持的磁盘 :) 这也应该有助于
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
[...]
"dataDiskArray": {
"type": "array",
"defaultValue": [
"100",
"50"
]
}
},
"variables": {
"copy": [
{
"name": "dataDisks",
"count": "[if(equals(length(parameters('dataDiskArray')),0),1, length(parameters('dataDiskArray')))]",
"input": {
"lun": "[if(equals(length(parameters('dataDiskArray')),0),0, copyIndex('dataDisks'))]",
"createOption": "Empty",
"diskSizeGB": "[if(equals(length(parameters('dataDiskArray')),0),10,parameters('dataDiskArray')[copyIndex('dataDisks')])]"
}
}
]
},
"resources": [
{
"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
[...]
"properties": {
[...]
"storageProfile": {
[...]
"dataDisks": "[if(equals(length(parameters('dataDiskArray')),0),json('null'),variables('dataDisks'))]"
},
[...]
}
}
],
"outputs": {
}
}
我自己使用的解决方法不需要链接模板或复杂的逻辑;它基于此:
如果数组为空,则创建另一个数组,其中只有一个值为"EMPTY_ARRAY_INDICATOR"
。
另外,在我的 copy
循环中,我添加了这个条件:"condition": "[not(equals(variables('input')[0]), "EMPTY_ARRAY_INDICATOR")]"
这样它就不会在数组的第一个元素是 "EMPTY_ARRAY_INDICATOR"
时部署。
看了你的模板,我想我可以这样重写它:
"parameters": [
"VirtualMachineDiskSizeArray": {
"type": "array",
"defaultValue": []
}
],
"variables": [
"VirtualMachineDiskSizeArray": "[if(empty(parameters('VirtualMachineDiskSizeArray')), array('EMPTY_ARRAY_INDICATOR'), parameters('VirtualMachineDiskSizeArray'))]"
],
"resources": [
{
"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"storageProfile": {
"imageReference": { ... },
"osDisk": { ... },
"copy": [
{
"name": "dataDisks",
"condition": "[not(equals(variables('VirtualMachineDiskSizeArray')[0], 'EMPTY_ARRAY_INDICATOR'))]"
"count": "[length(variables('VirtualMachineDiskSizeArray'))]",
"input": {
"lun": "[copyIndex('dataDisks')]",
"name": "[concat(parameters('vmDataDiskNameStub'), add(copyIndex('dataDisks'),1), '.vhd')]",
"diskSizeGB": "[variables('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') )]"
}
}
}
]
}
}
},
请注意copy
循环中的condition
,以及variables('VirtualMachineDiskSizeArray')
而不是parameters(VirtualMachineDiskSizeArray)
的用法。
我已经针对我自己的模板对其进行了测试,但还没有 运行 你的模板。请让我知道它是否有效。
我正在部署一个 ARM 模板,该模板使用复制资源块将 1 个或多个数据磁盘部署到 VM。我想做的是将其更改为 0 或更多。
我使用的参数是
"VirtualMachineDiskSizeArray": {
"type": "array",
"defaultValue": [ "100" ]
},
然后在资源中调用:
"resources": [
{
"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"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') )]"
}
}
}
]
}
}
},
但是,当我传入一个包含 0 个元素的数据磁盘数组时,我得到了预期的错误:
Validation returned the following errors:
: Deployment template validation failed: 'The template 'copy' definition at line '0' and column '0' has an invalid copy count. The co
py count must be a postive integer value and cannot exceed '800'. Please see https://aka.ms/arm-copy for usage details.'.
Template is invalid.
我想尝试以某种方式解决这个问题 - 我尝试在副本上添加条件:
"condition": "[ greater(length(parameters('VirtualMachineDiskSizeArray')), 0)]",
但是返回了同样的错误。
我正在研究嵌套模板,但这对于资源的 部分 来说不太好。
所以在时间的兴趣,我改变了我的方法,但不太喜欢它......
我现在有两个部署 json 文件,VMDeploy.json
和 VMDeploy-NoDataDisks.json
。
除了 VM 资源的 storageProfile 部分之外它们是相同的:
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": []
}
我有一个 Powershell 块在两个 json 文件之间切换:
if ($DriveArray.Count -eq 0) {
$TemplateFile = $TemplateFile.Replace('.json','-NoDataDisks.json')
}
我将使用这个答案作为我对嵌套模板研究的参考。
查看 here 我可以看到一种有两个嵌套模板的方法,如下所示:
"resources": [
{
"name": "MultiDataDisk",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"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') )]"
}
}
}
]
}
}
}
]
还有一个像这样的:
"resources": [
{
"name": "ZeroDataDisk",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"storageProfile": {
"imageReference": { ... },
"osDisk": { ... },
"dataDisks": []
}
}
}
]
并从父模板中引用它们:
"parameters": {
"nestedType": {
"type": "string",
"defaultValue": "ZeroDataDisk",
"allowedValues": [
"ZeroDataDisk",
"MultiDataDisk"
],
}
},
"resources": [
{
"name": "[concat("nested-",parameters('virtualMachineName')]",
"type": "Microsoft.Resources/deployments",
"apiVersion": "2015-01-01",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[concat('https://someplace.on.the.internet/nested/',parameter('nestedType'),".json")],
"contentVersion": "1.0.0.0"
},
"parameters": {
"rgStorageAccountName": {
"value": "[parameters(rgStorageAccountName)]"
},
"OtherParms": {
"value": "[parameters('otherParms')]"
}
. . .
}
}
]
}
但是,我不认为这是 better/easier 我在 "Interest of Time" 回答中所做的,因为
- 我感兴趣的部分 (dataDisks) 被一堆其他 json 包围, 没有 改变让我遇到同样糟糕的问题必须在两个文件之间手动同步代码。
- 我现在不仅要为嵌套资源维护两个 json 文件,而且我必须通过可公开访问的 URL. 发布它们
所以基本上,除非我可以拥有一个部分的 0-N 副本(而不是 1-N)或只嵌套一个部分,否则我使用 powershell 开关的两个文件 hack 似乎开销最小。
最简单的解决方法是使用这个:
{
"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"
}
}
]
}
}
}
这将解决您正在传递 0 个数据磁盘并且同时不会部署此虚拟机的事实。您需要做的就是添加另一个虚拟机资源。但它必须具有不同的名称(否则模板将失败)或者您可以使用嵌套模板部署具有相同名称的虚拟机。
这可以通过最近对 if()
功能的修复得到改进,您也可以随时使用嵌套部署来解决这个问题
工作样本https://github.com/mariuszdotnet/azure-resource-manager-tutorial/blob/master/azuredeploy.json
摘要如下:
- 将磁盘移动到变量中并使用变量迭代。
- 如果 numDisks = 0 则 diskLoop = 1(这可以防止变量复制时出错)
- 使用 count = diskLoop 创建变量复制对象
"copy": [ { "name": "dataDisks", "count": "[if(equals(parameters('numberOfDataDisks'),0),1, parameters('numberOfDataDisks'))]", "input": { "lun": "[copyIndex('dataDisks')]", "createOption": "Empty", "diskSizeGB": "1023" } } ]
- 在数据盘的虚拟机资源上。
- 在虚拟机资源上,if numDisk=0 then datadisks = json(‘null’) else datadisks = variable
"dataDisks": "[if(equals(parameters('numberOfDataDisks'),0),json('null'),variables('dataDisks'))]" },
关于Disksize我可以帮你解决。 我实际所做的是参考 JSON 模板文件,其中为磁盘创建定义了大小、名称和缓存。
这些可以很容易地解析到部署
"storageProfile": {
"copy": [{
"name": "dataDisks",
"count": "[length(parameters('dataDiskArray'))]",
"input": {
"name": "[concat(parameters('vmName'), if(less(copyindex(1), 10), concat('0', copyindex(1)), concat(copyindex(1))), '-datadisk-', parameters('dataDiskArray')[copyIndex('dataDisks')].name)]",
"diskSizeGB": "[parameters('dataDiskArray')[copyIndex('dataDisks')].size]",
"caching": "[parameters('dataDiskArray')[copyIndex('dataDisks')].cache]",
"lun": "[copyIndex('dataDisks')]",
"createOption": "Empty"
}
}],
问题仍然是 VM 部署的一部分,因此如果您想在没有额外磁盘的情况下部署 VM,则无法选择 select 空值。
我已尝试将磁盘创建移动到模板的变量部分,但无法将 VMName 用作要创建的磁盘名称的一部分。这是因为VM的copy loop还没有初始化,所以会报错名字。
我想根据此处已有的许多答案分享我们的解决方案。这是一个简单的例子,它有一个输入磁盘阵列——值是它们的大小——并用你的虚拟机创建。从 0-n 开始工作。 n 需要小于您的 VM 大小和其他 azure 限制所支持的磁盘 :) 这也应该有助于
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
[...]
"dataDiskArray": {
"type": "array",
"defaultValue": [
"100",
"50"
]
}
},
"variables": {
"copy": [
{
"name": "dataDisks",
"count": "[if(equals(length(parameters('dataDiskArray')),0),1, length(parameters('dataDiskArray')))]",
"input": {
"lun": "[if(equals(length(parameters('dataDiskArray')),0),0, copyIndex('dataDisks'))]",
"createOption": "Empty",
"diskSizeGB": "[if(equals(length(parameters('dataDiskArray')),0),10,parameters('dataDiskArray')[copyIndex('dataDisks')])]"
}
}
]
},
"resources": [
{
"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
[...]
"properties": {
[...]
"storageProfile": {
[...]
"dataDisks": "[if(equals(length(parameters('dataDiskArray')),0),json('null'),variables('dataDisks'))]"
},
[...]
}
}
],
"outputs": {
}
}
我自己使用的解决方法不需要链接模板或复杂的逻辑;它基于此:
如果数组为空,则创建另一个数组,其中只有一个值为"EMPTY_ARRAY_INDICATOR"
。
另外,在我的 copy
循环中,我添加了这个条件:"condition": "[not(equals(variables('input')[0]), "EMPTY_ARRAY_INDICATOR")]"
这样它就不会在数组的第一个元素是 "EMPTY_ARRAY_INDICATOR"
时部署。
看了你的模板,我想我可以这样重写它:
"parameters": [
"VirtualMachineDiskSizeArray": {
"type": "array",
"defaultValue": []
}
],
"variables": [
"VirtualMachineDiskSizeArray": "[if(empty(parameters('VirtualMachineDiskSizeArray')), array('EMPTY_ARRAY_INDICATOR'), parameters('VirtualMachineDiskSizeArray'))]"
],
"resources": [
{
"name": "[parameters('virtualMachineName')]",
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2016-04-30-preview",
"location": "[parameters('rgLocation')]",
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', parameters('rgStorageAccountName'))]"
],
"properties": {
"osProfile": { ... },
"hardwareProfile": { ... },
"storageProfile": {
"imageReference": { ... },
"osDisk": { ... },
"copy": [
{
"name": "dataDisks",
"condition": "[not(equals(variables('VirtualMachineDiskSizeArray')[0], 'EMPTY_ARRAY_INDICATOR'))]"
"count": "[length(variables('VirtualMachineDiskSizeArray'))]",
"input": {
"lun": "[copyIndex('dataDisks')]",
"name": "[concat(parameters('vmDataDiskNameStub'), add(copyIndex('dataDisks'),1), '.vhd')]",
"diskSizeGB": "[variables('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') )]"
}
}
}
]
}
}
},
请注意copy
循环中的condition
,以及variables('VirtualMachineDiskSizeArray')
而不是parameters(VirtualMachineDiskSizeArray)
的用法。
我已经针对我自己的模板对其进行了测试,但还没有 运行 你的模板。请让我知道它是否有效。