web-dev-qa-db-ja.com

ARMテンプレートリソースに0からNのCOPY配列を含めることができますか?

コピーリソースブロックを使用して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には適していません。

14

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()関数に対する最近の修正で改善できます。ネストされたデプロイメントを使用することで、常に回避することもできます。

10
4c74356b41

ディスクサイズに関しては、私がお手伝いします。私が実際に行ったことは、サイズ、名前、およびキャッシュがディスク作成用に定義されている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のコピーループがまだ初期化されていないため、間違った名前が付けられるためです。

1
user9860446

すでにここにある答えの多くに基づいたソリューションを共有したいと思います。これは、ディスクの入力配列(値はサイズ)を持ち、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": {
    }
}
1
Klaas

この回答を使用して、ネストされたテンプレートの研究に関するリファレンスを使用します。

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')]"
    }
     . . .
  }
 }
]
}

ただし、これが私の「時間の利益」の回答で行ったことよりも良い/簡単だとは思えません。

  1. 私が関心を持っているセクション(データディスク)は、変化しない他のjsonの束に囲まれています変更しても、同じ問題が発生します2つのファイル間でコードを手動で同期する必要があります。
  2. ネストされたリソースの2つのjsonファイルを維持するだけでなく、公開されているURLを介してそれらを公開する必要があります。

したがって、基本的には、セクションの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)の使用方法に注意してください。

自分のテンプレートでテストしましたが、テンプレートを実行していません。動作するかどうか教えてください。

0
hosjay

作業サンプル 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"
      }
  }   ]
  • VMデータディスクのリソース。
  • VMリソース、numDisk = 0の場合、datadisks = json( ‘null’)else datadisks = variable
"dataDisks": 
                "[if(equals(parameters('numberOfDataDisks'),0),json('null'),variables('dataDisks'))]"

            },
0