我是否可以拥有COPY数组为0到N的ARM模板资源

Chr*_*wis 14 azure azure-resource-manager

我正在部署一个ARM模板,该模板使用复制资源块将一个或多个数据磁盘部署到VM.我想做的是将其更改为0或更多.

我使用的参数是

    "VirtualMachineDiskSizeArray": {
        "type": "array",
        "defaultValue": [ "100" ]
    },
Run Code Online (Sandbox Code Playgroud)

然后在资源中调用它:

   "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') )]"
                            }
                        }
                    }
                ]
            }
        }
    },
Run Code Online (Sandbox Code Playgroud)

但是,当我传入一个包含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.
Run Code Online (Sandbox Code Playgroud)

我想尝试以某种方式解决这个问题 - 我尝试在副本上添加一个条件:

"condition": "[  greater(length(parameters('VirtualMachineDiskSizeArray')), 0)]",
Run Code Online (Sandbox Code Playgroud)

但是那返回了同样的错误.

我正在研究嵌套模板,但这对于资源的一部分来说并不好看.

4c7*_*b41 9

解决这个问题的最简单方法是使用:

{
    "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"
                    }
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将解决您传递0个数据磁盘并同时不会部署此虚拟机的事实.您需要做的就是添加另一个vm资源.但它必须使用不同的名称(否则模板将失败),或者您可以使用嵌套模板来部署具有相同名称的vm.

这可以通过最近的if()功能修复来改进,您也可以通过使用嵌套部署来解决


Chr*_*wis 3

因此,出于时间考虑,我改变了对此的方法,但不太喜欢它......

我现在有两个部署 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') )]"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

VMDeploy-NoDataDisks.json

"storageProfile": {
  "imageReference": { ... },
  "osDisk": { ... },
  "dataDisks": []
}
Run Code Online (Sandbox Code Playgroud)

我有一个 Powershell 块在两个 json 文件之间切换:

if ($DriveArray.Count -eq 0) {
    $TemplateFile = $TemplateFile.Replace('.json','-NoDataDisks.json')
}
Run Code Online (Sandbox Code Playgroud)