2017-02-20 2 views
0

ネストされたテンプレートの2つのレベルを持つ親テンプレート、azuredeploy.json-> vmReferenceTemplate.json-> datadiskreference.json第2レベルから3に必要な値を渡すとき、ただし、第1レベルから第3レベルのネストされたテンプレートにまったく同じ値を渡すときは機能しません。私はnumDataDisksの値をazuredeploy.jsonからdatadiskreference.jsonにしたいと思います。私は非常に複雑なテンプレートを持っています。それを動作させるには、第1レベルの値を渡す必要があります。ここで動作するストライプ版です。 azuredeploy.json:Azure RMテンプレート。複雑な値を第3レベルのネストされたテンプレートに渡す

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 8, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "name": "[concat(parameters('vmName'), copyIndex(1),'-','reference')]", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "copy": { 
     "name": "vmReferenceTemplateLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('vmReferenceTemplateTemplateFolder'), '/', variables('vmReferenceTemplateTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "numDataDisks": { 
      "value": "[parameters('numberOfVMs')]" 
      } 
     } 
     } 
    } 
    ], 
... 

vmReferenceTemplate.json:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ... 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 2 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[parameters('dataDisksReferenceTemplateName')]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
     "name": "dataDiskReferenceLoop", 
     "count": "[parameters('copyNestedReference')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[variables('dataDiskReferenceTemplateUri')]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "vmName": { 
      "value": "[parameters('dataDisksVMnameReference')]" 
      }, 
      "storageAccountName": { 
      "value": "[variables('var_storageAccountName')]" 
      }, 
      "numDataDisks": { 
      "value": "[parameters('numberOfDataDisks')[copyIndex()]]" 
      }, 
      "sizeOfEachDataDiskInGB": { 
      "value": "[variables('sizeOfEachDataDiskInGB')]" 
      } 
     } 
     } 
    } 
    ], 
    ... 

そして、これは私が第三レベルに1レベルから値を渡すためにしようとしている方法ですが、それは誤り"Deployment template validation failed: 'The provided value for the template parameter 'numDataDisks' at line '36' and column '22' is not valid.'." azuredeployで失敗します

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 8, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "name": "[concat(parameters('vmName'), copyIndex(1),'-','reference')]", 
     "type": "Microsoft.Resources/deployments", 
     "apiVersion": "2016-09-01", 
     "copy": { 
     "name": "vmReferenceTemplateLoop", 
     "count": "[parameters('numberOfVMs')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[concat(parameters('_artifactsLocation'), '/', variables('vmReferenceTemplateTemplateFolder'), '/', variables('vmReferenceTemplateTemplateFileName'), parameters('_artifactsLocationSasToken'))]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "numDataDisks": { 
      "value": "[parameters('numberOfDataDisks')[copyIndex()]]" 
      } 
     } 
     } 
    } 
    ] 
... 

vmReferenceTemplate.json .json:

{ 
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", 
    "parameters": { 
    ,,, 
    "numberOfVMs": { 
     "type": "int", 
     "defaultValue": 2, 
    }, 
    "numberOfDataDisks": { 
     "type": "array", 
     "defaultValue": [ 
     2, 
     1, 
     3, 
     1, 
     1, 
     1, 
     1, 
     1 
     ] 
    }, 
    ... 
    }, 
    "resources": [ 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[parameters('dataDisksReferenceTemplateName')]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
     "name": "dataDiskReferenceLoop", 
     "count": "[parameters('copyNestedReference')]" 
     }, 
     "properties": { 
     "mode": "Incremental", 
     "templateLink": { 
      "uri": "[variables('dataDiskReferenceTemplateUri')]", 
      "contentVersion": "1.0.0.0" 
     }, 
     "parameters": { 
      "vmName": { 
      "value": "[parameters('dataDisksVMnameReference')]" 
      }, 
      "storageAccountName": { 
      "value": "[variables('var_storageAccountName')]" 
      }, 
      "numDataDisks": { 
      "value": "[parameters('numDataDisks')]" 
      }, 
      "sizeOfEachDataDiskInGB": { 
      "value": "[variables('sizeOfEachDataDiskInGB')]" 
      } 
     } 
     } 
    } 
    ] 
... 
+0

あなたは1> 2> 3の値を渡していると言っていますが、それは子供の親から適切に伝播しませんか?また、MSはテンプレートの2つのレベルを使用することをお勧めします;)あなたは1> 3、3対2の出力を考慮しましたか?テンプレートには2つのレベルしかありませんか? – 4c74356b41

+0

はい1> 2> 3は合格していません。私は2つのレベルは、コピーVM(コピーVMの場合はネストされたテンプレートでのみ行うことができます)をコピーし、そのコピーVMに可変データ量のディスクを渡すためにkeyvaultsを渡しているので、私にとってはオプションではないと思いますコピーVMの場合でもネストされたテンプレートで実行されます)。 – Max

+0

私は今は時間がありませんが、明日これに戻り、私が何を意味するかを見せます。 – 4c74356b41

答えて

3

ここで私は、皆さん、私がコメントで言ったように、魔法のトリックをすることができます! 2つのネストされたテンプレートでテンプレートを作成できますが、1つのネストされたテンプレートの出力をもう1つのテンプレートに渡します!

"resources": [ 
    { 
     ... 
     "dependsOn": [ 
      "datadiskcopy" << DEPENDS ON ANOTHER TEMPLATE COPY LOOP !!! 
     ], 
     ... 
      "parameters": { 
       "adminPassword": { 
        "reference": { 
         "keyVault": { 
          "id": "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.KeyVault/vaults/xxx" 
         }, 
         "secretName": "[concat('secret', copyindex(1))]" 
        } << KEYVAULT REFERENCE YOU NEED !! 
       }, 
       "diskObject": { 
        "value": "[reference(concat('nested-datadisk-', copyIndex())).outputs.result.value]" << REFERENCE ANOTHER NESTED DEPLOYMENT OUTPUT !! 
       } 
      } 
     } 
    }, 
    { 
     "apiVersion": "2016-09-01", 
     "name": "[concat('nested-datadisk-', copyIndex())]", 
     "type": "Microsoft.Resources/deployments", 
     "copy": { 
      "name": "datadiskcopy", 
      "count": "[parameters('LoopCount')]" 
     }, 
     "properties": { 
      "mode": "Incremental", 
      "templateLink": { 
       "uri": "https://raw.githubusercontent.com/4c74356b41/armotron/master/ml-vm-ml-dd-kv-nst-dd", 
       "contentVersion": "1.0.0.0" 
      }, 
      "parameters": { 
       "numDataDisks": { 
        "value": "[parameters('numberOfDataDisksPerVM')[copyIndex()]]" 
       } 
      } 
     } 
    } 

私は少し私のテンプレートの名前を変更することを決めたように私は、すぐにリンクを更新しますが、あなたはすでにサンプルのための私のgithubの上armotron repoを見てみることができます。

PS

これは、簡単にするために管理対象ディスクを使用されていますが、管理されていない使用することができます(ハードコア、汝になるだろう)。もう一度キャッシングの問題が発生する可能性があります。RAWリンクからデータをコピーしてください。ちょうどこの事をテストし、私のために働く、あなたはさらにそれを拡張することができます。

+0

これは完璧です!まさに私が探していたもの。私は、lvl1-> lvl2-> lvl3の値を渡すのではなく、不可能なlvl2-> lvl1-> lvl2-> lvl3の値を渡していないことに気付きました。このメッセージは私の質問に答えます。ありがとう、@ 4c74356b41! – Max

1

これはあなたの質問に直接答えるものではありませんが、より良い解決策を明らかにするかもしれません。 AzureのインフラストラクチャをプロビジョニングするためのARMテンプレートを数回繰り返しました。入れ子になったテンプレートを削除すると、次のような理由で終了しました。

  1. 再利用の点で価値はほとんどありませんでした。共有テンプレートを再利用するたびに、ほとんどの場合、特定のシナリオをいくつか調整する必要がありました。これは、バージョン番号にバンプを付け、調整を加えて、パブリックインターネット上で新しいバージョンを利用できるようにし、古いバージョンを利用できるようにすることを意味する。
  2. 条件付きの構造体が欠けているので(はい、ハックすることができますが、テンプレートが不明瞭になります)、再利用可能なテンプレートを作成するのがさらに難しくなりました。

私たちのARMテンプレートは現在、このようになっています:各リソースグループはGithubアカウントに独自のgitリポジトリを持ち、リソースグループ内の各リソースには独自のテンプレートがあります。リソースグループのリポジトリは、次のようになります。

my_group 
├── cloud-config.yaml 
├── deploy.ps1 
├── deploy.sh 
└── resources 
    ├── load_balancer.json 
    ├── nsg.json 
    ├── storage_account.json 
    └── virtual_machine.json 

リソースごとに異なるテンプレートを使用すると、保守がはるかに容易になります。 deploy.shファイルは現在、すべてのファイルを展開する一連のaz group deployment create -commandです。これはpowershellスクリプトでも同じです。私たちはもはや認証なしで公衆インターネット上にARMテンプレートを持つ必要はありません。また、このARMテンプレートは1つの理由グループに対してのみ使用されるため、パラメータファイルは必要なくなり、パラメータは残りのコードとともに処理されます。

この設定では、ネストされたテンプレートに応じて、1つの巨大なARMテンプレートよりもはるかに柔軟性があると思います。孤立しているすべてのもの(たとえばcloud-config.yaml)を管理し、後でスクリプトを使用して展開用のARMテンプレートを生成することができます。現在、すべてのデプロイメントでgitタグを作成し、gitを使用して、最後のデプロイメント以降にどのファイルが変更されたかを調べています。

+0

彼のケースは多少異なりますが、彼はvmのためのディスクの "ランダムな"量とkeyvaultのためにそれらを必要とします。しかし、私はまた、ARMテンプレートで少し動揺している、彼らは幾分不足している – 4c74356b41

+0

真実は、開始点が "非常に複雑なテンプレート"(ARMテンプレートが出現する傾向がある)であり、条件や他のロジックベースの演算子では、できるだけシンプルなARMテンプレートを作成し、残りの部分はより適切なスクリプト言語にしておきます。 – gogstad

+0

入力いただきありがとうございます。あなたのセットアップは信じられないほど効率的に見えます。しかし、ネストされたテンプレートを使用するのは、複数のVMに対して可変量のディスクを実装する唯一の方法だからです。 https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#create-multiple-instances-when-copy-wont-workまた、ネストされたテンプレートを使用する必要がありますそれらのVMのパスワードとしてキーボルトからの秘密を参照するためのものhttps://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-keyvault-parameter#reference-a-secret-with-dynamic -id – Max

関連する問題