コピーリソースブロックを使用してVMに1つ以上のデータディスクを展開するARM=テンプレートを展開しています。これを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)]",
しかし、それは同じエラーを返しました。
ネストされたテンプレートを調査していますが、リソースのsectionには適していません。
Interest of Timeでは、これに対するアプローチを変更しましたが、あまり好きではありません...
これで2つのデプロイ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": []
}
そして、私は2つのjsonファイルの間にPowershellブロックスイッチがあります:
if ($DriveArray.Count -eq 0) {
$TemplateFile = $TemplateFile.Replace('.json','-NoDataDisks.json')
}
これを回避する最も簡単な方法はこれを使用することです:
_{
"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に渡し、同時にこのvmをデプロイしないという事実を回避できます。あなたがする必要があるのは別のvmリソースを追加することだけです。ただし、別の名前にする必要があります(他のテンプレートは失敗します)。または、ネストされたテンプレートを使用して、同じ名前のvmをデプロイできます。
これは、if()
関数に対する最近の修正で改善できます。ネストされたデプロイメントを使用することで、常に回避することもできます。
ディスクサイズに関しては、私がお手伝いします。私が実際に行ったことは、サイズ、名前、およびキャッシュがディスク作成用に定義されている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をデプロイする場合、Null値を選択するオプションはありません。
ディスクの作成をテンプレートの変数セクションに移動しようとしましたが、作成するディスクの名前の一部としてVMNameを使用することはできません。これは、VMのコピーループがまだ初期化されていないため、間違った名前が付けられるためです。
すでにここにある答えの多くに基づいたソリューションを共有したいと思います。これは、ディスクの入力配列(値はサイズ)を持ち、VMを使用して作成する簡単な例です。 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": {
}
}
この回答を使用して、ネストされたテンプレートの研究に関するリファレンスを使用します。
here を見ると、次のような2つのネストされたテンプレートを持つアプローチがわかります。
"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')]"
}
. . .
}
}
]
}
ただし、これが私の「時間の利益」の回答で行ったことよりも良い/簡単だとは思えません。
したがって、基本的には、セクションの0-N(1-Nではなく)のコピーを作成したり、セクションだけをネストしたりできない限り、Powershellスイッチを使用した2つのファイルのハックはオーバーヘッドが最も少ないようです。
私が自分で使用した回避策には、リンクされたテンプレートや複雑なロジックは必要ありません。これはこれに基づいています:
配列が空の場合は、_"EMPTY_ARRAY_INDICATOR"
_の値を持つ1つの項目のみを含む別の配列を作成します。
また、私の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') )]"
}
}
}
]
}
}
},
_
condition
ループのcopy
と、variables('VirtualMachineDiskSizeArray')
ではなくparameters(VirtualMachineDiskSizeArray)
の使用方法に注意してください。
自分のテンプレートでテストしましたが、テンプレートを実行していません。動作するかどうか教えてください。
作業サンプル https://github.com/mariuszdotnet/Azure-resource-manager-tutorial/blob/master/azuredeploy.json
ここに要約があります:
"copy": [ { "name": "dataDisks", "count": "[if(equals(parameters('numberOfDataDisks'),0),1, parameters('numberOfDataDisks'))]", "input": { "lun": "[copyIndex('dataDisks')]", "createOption": "Empty", "diskSizeGB": "1023" } } ]
"dataDisks": "[if(equals(parameters('numberOfDataDisks'),0),json('null'),variables('dataDisks'))]" },