2017-01-26 11 views
2

ロードバランサをセットアップするARMテンプレートがあり、ルールとプローブをLBに追加していくつかのポート開口部を追加したいと考えています。ARMテンプレートのプロパティをループオーバーすることはできますか?

この私がこれまで持っているテンプレートです:

{ 
     "type": "Microsoft.Network/loadBalancers", 
     "name": "LB-front", 
     "apiVersion": "2016-03-30", 
     "location": "westeurope", 
     "tags": { }, 
     "properties": { 
      "frontendIPConfigurations": [ 
       { 
        "name": "LoadBalancerIPConfig", 
        "properties": { 
         "privateIPAllocationMethod": "Dynamic", 
         "publicIPAddress": { 
          "id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_lbipdev_0_name'))]" 
         } 
        } 
       } 
      ], 
      "backendAddressPools": [ 
       { 
        "name": "LoadBalancerBEAddressPool" 
       } 
      ], 
      "loadBalancingRules": [ 
       { 
        "name": "AppPortLBRule1", 
        "properties": { 
         "frontendIPConfiguration": { 
          "id": "[parameters('loadBalancers_LB_dev_id_6')]" 
         }, 
         "frontendPort": 80, 
         "backendPort": 80, 
         "enableFloatingIP": false, 
         "idleTimeoutInMinutes": 5, 
         "protocol": "Tcp", 
         "loadDistribution": "Default", 
         "backendAddressPool": { 
          "id": "[parameters('loadBalancers_LB_dev_id_7')]" 
         }, 
         "probe": { 
          "id": "[parameters('loadBalancers_LB_dev_id_8')]" 
         } 
        } 
       }, 
       { 
        "name": "AppPortLBRule2", 
        "properties": { 
         "frontendIPConfiguration": { 
          "id": "[parameters('loadBalancers_LB_dev_id_9')]" 
         }, 
         "frontendPort": 81, 
         "backendPort": 81, 
         "enableFloatingIP": false, 
         "idleTimeoutInMinutes": 5, 
         "protocol": "Tcp", 
         "loadDistribution": "Default", 
         "backendAddressPool": { 
          "id": "[parameters('loadBalancers_LB_dev_id_10')]" 
         }, 
         "probe": { 
          "id": "[parameters('loadBalancers_LB_dev_id_11')]" 
         } 
        } 
       }, 
       { 
        "name": "AppPortLBRule3", 
        "properties": { 
         "frontendIPConfiguration": { 
          "id": "[parameters('loadBalancers_LB_dev_id_12')]" 
         }, 
         "frontendPort": 82, 
         "backendPort": 82, 
         "enableFloatingIP": false, 
         "idleTimeoutInMinutes": 5, 
         "protocol": "Tcp", 
         "loadDistribution": "Default", 
         "backendAddressPool": { 
          "id": "[parameters('loadBalancers_LB_dev_id_13')]" 
         }, 
         "probe": { 
          "id": "[parameters('loadBalancers_LB_dev_id_14')]" 
         } 
        } 
       } 
      ], 
      "probes": [ 
       { 
        "name": "AppPortProbe1", 
        "properties": { 
         "protocol": "Tcp", 
         "port": 80, 
         "intervalInSeconds": 5, 
         "numberOfProbes": 2 
        } 
       }, 
       { 
        "name": "AppPortProbe2", 
        "properties": { 
         "protocol": "Tcp", 
         "port": 81, 
         "intervalInSeconds": 5, 
         "numberOfProbes": 2 
        } 
       }, 
       { 
        "name": "AppPortProbe3", 
        "properties": { 
         "protocol": "Tcp", 
         "port": 82, 
         "intervalInSeconds": 5, 
         "numberOfProbes": 2 
        } 
       } 
      ], 
      "inboundNatRules": [], 
      "outboundNatRules": [], 
      "inboundNatPools": [] 
     }, 
     "resources": [], 
     "dependsOn": [ 
      "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_lbipdev_1_name'))]" 
     ] 
    }, 

(いくつかの詳細は省略)

私がやりたい何かが、私はルールを作成するポート番号の配列を持つことであると各ルールとプローブをリソースのプロパティとして明示的に記述するのではなく、それらのプローブとループをプローブします。

基本的に私はこのように私のテンプレート内のパラメータまたは変数たい:

"ports": [ 80, 81, 82, ...] 

と、私はこれに似たこのオーバーループができること:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multipleを。

答えて

4

コピーオブジェクトは、トップレベルのリソースにのみ適用できます。

リソースタイプのプロパティまたは子リソースには適用できません。

Source of Quotation: Deploy multiple instances of resources in Azure Resource Manager templates

"resources": [ 
    { 
    "type": "{provider-namespace-and-type}", 
    "name": "parentResource", 
    "copy": { 
     /* yes, copy can be applied here */ 
    }, 
    "properties": { 
     "exampleProperty": { 
     /* no, copy cannot be applied here */ 
     } 
    }, 
    "resources": [ 
     { 
     "type": "{provider-type}", 
     "name": "childResource", 
     /* copy can be applied if resource is promoted to top level */ 
     } 
    ] 
    } 
] 
することはできあなたのケース 「Microsoft.Network/にあるコピーオブジェクトは、トップレベルのリソースにのみ適用されるのIF ARMテンプレート 、のプロパティをループloadBalancers "でも、それは前記リソースの複数のコピーを作成します。

これが実現しない場合は、将来、リソースタイプのプロパティにARMテンプレートサポートオブジェクトがコピーされるまで、既存の方法を維持することをお勧めします。

+0

技術的に "具体的な"リソースの子であるリソースをトップレベルに昇格するにはどうすればよいですか?例えば。 WebSiteは最上位、WebSite/Extensionは子レベルです。拡張リソースを最上位レベルの宣言として配置し、ウェブサイトに何らかの依存関係を設定できますか? –

+0

回答ありがとうbtw。 –

+0

これはあなたの質問に対する答えですか? – juvchan

0

で達成したいことはとなります。 適切なドキュメントサイトを自分でリンクしました。投稿したリンクに移動して、「コピーが機能しない場合に複数のインスタンスを作成する」のセクションを確認してください。あなたのケースで

これは次のようになります。

"variables": { 
    "probeArray": [      
      { 
      "name": "AppPortProbe1", 
      "properties": { 
       "protocol": "Tcp", 
       "port": 80, 
       "intervalInSeconds": 5, 
       "numberOfProbes": 2 
      } 
      }, 
      { 
      "name": "AppPortProbe2", 
      "properties": { 
       "protocol": "Tcp", 
       "port": 81, 
       "intervalInSeconds": 5, 
       "numberOfProbes": 2 
      } 
      }, 
      { 
      "name": "AppPortProbe3", 
      "properties": { 
       "protocol": "Tcp", 
       "port": 82, 
       "intervalInSeconds": 5, 
       "numberOfProbes": 2 
      } 
      } 
    ], 

あなたは、あなたが

"parameters": { 
... 
"numProbes": { 
    "type": "int", 
    "maxValue": 3, 
    "metadata": { 
    "description": "This parameter allows you to select the number of probes you want" 
    } 
} 

最後に、あなたがリソース内を取る使いたいどのように多くのプローブ指定するパラメータを作成します。

"resources": [ 
... 
{ 
    "type": "Microsoft.Network/loadBalancers", 
    "properties": { 
     ... 
     "probes": "[take(variables('probeArray'),parameters('numProbes'))]" 
    }, 
    ... 
    } 
    ... 
} 
] 

ドキュメントを見ると、さらに狂ったようになり、コピーと結合されたテンプレートを組み合わせることができます。https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#property-iterationまたは https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#create-multiple-instances-of-a-child-resource

に述べたように

+0

これは、私はまだすべてのプローブを宣言しなければならないが、代わりにvariableaで突き詰めなければならないということを意味するのではないか?私はちょうど1つの塊にそれらを宣言しなければならない方法を望んでいた、そして唯一のもの、すなわちポート番号の上のループ。 –

+0

はい、プローブを定義する必要があります。 copyIndex()を使用してプロパティを反復処理する簡単な方法はありません。 – TobiWi

1

それは性質上または子リソース上のループに可能になりましたことはできフォーマットに従って、トップレベルのリソースとして、子リソース拡張(例えばウェブサイト/拡張)タイプについて:インスタンス Microsoft.Web/sites/siteextensions

については {resource-provider-namespace}/{parent-resource-type}/{child-resource-type}. あなたは連結して、子リソースで親リソースを参照することもあります。例: "name": "[concat('mywebsite', '/', 'myextension', copyIndex())]"

関連する問題