J'ai un modèle ARM dans lequel j'ai configuré un équilibreur de charge et je souhaite ajouter un certain nombre d'ouvertures de port en ajoutant des règles et des sondes au LB.

Voici le modèle que j'ai jusqu'à présent:

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

(certains détails omis)

Ce que je voudrais faire, c'est avoir un tableau des numéros de port pour lesquels je veux créer des règles et des sondes et les boucler au lieu d'avoir à écrire explicitement chaque règle et sonde en tant que propriété de la ressource.

Fondamentalement, je voudrais un paramètre ou une variable dans mon modèle comme ceci:

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

Et que je pourrais boucler sur ceci semblable à ceci: https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple.

13
Lee G. 26 janv. 2017 à 23:55

4 réponses

Meilleure réponse

Vous ne pouvez appliquer l'objet de copie qu'à une ressource de niveau supérieur.

Vous ne pouvez pas l'appliquer à une propriété sur un type de ressource ou à une ressource enfant .

"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 */ 
      }
    ]
  }
] 

Source de devis: déployer plusieurs instances de ressources dans les modèles Azure Resource Manager

Vous pouvez effectuer une boucle sur les propriétés dans le modèle ARM UNIQUEMENT SI l'objet de copie est appliqué à une ressource de niveau supérieur, qui est dans votre cas le "Microsoft.Network/loadBalancers" , mais cela créera également plusieurs copies de ladite ressource.

Si ce n'est pas ce que vous souhaitez atteindre, je vous recommande de conserver votre méthode existante jusqu'à ce que le modèle ARM prenne en charge la copie d'objet vers la propriété sur un type de ressource à l'avenir.

5
juvchan 27 janv. 2017 à 00:17

En effet, vous pouvez! La copie fonctionne avec les propriétés!

Créez un paramètre ou une variable comme celui-ci (cet exemple utilisera un tableau de paramètres):

"lbRules": {
  "type": "array",
  "defaultValue": [
    {
      "name": "httpPort",
      "frontendPort": "80",
      "backendPort": "80",
      "protocol": "tcp"
    },
    {
      "name": "customAppPort",
      "frontendPort": "8080",
      "backendPort": "8888",
      "protocol": "tcp"
    },
    {
      "name": "httpsPort",
      "frontendPort": "443",
      "backendPort": "443",
      "protocol": "tcp"
    }
  ]
}

Utilisez ce paramètre dans la ressource Loadbalancer en utilisant copier comme celui-ci qui créera autant de sondes et de règles que vous avez définies dans votre tableau de paramètres:

{
  "apiVersion": "[variables('lbApiVersion')]",
  "type": "Microsoft.Network/loadBalancers",
  "name": "[parameters('myLoadBalancer')]",
  "location": "[parameters('computeLocation')]",
  "dependsOn": [
    "[concat('Microsoft.Network/publicIPAddresses/',concat(parameters('lbIPName'),'-','0'))]"
  ],
  "properties": {
    "frontendIPConfigurations": [
      {
        "name": "LoadBalancerIPConfig",
        "properties": {
          "publicIPAddress": {
            "id": "[resourceId('Microsoft.Network/publicIPAddresses',concat(parameters('lbIPName'),'-','0'))]"
          }
        }
      }
    ],
    "backendAddressPools": [
      {
        "name": "LoadBalancerBEAddressPool",
        "properties": {}
      }
    ],

    "copy": [
      {
        "name": "probes",
        "count": "[length(parameters('lbRules'))]",
        "input": {
          "name": "[concat(parameters('lbRules')[copyIndex('probes')].name,'Probe')]",
          "properties": {
            "intervalInSeconds": 5,
            "numberOfProbes": 2,
            "port": "[parameters('lbRules')[copyIndex('probes')].backendPort]",
            "protocol": "[parameters('lbRules')[copyIndex('probes')].protocol]"

          }
        }
      },

      {
        "name": "loadBalancingRules",
        "count": "[length(parameters('lbRules'))]",
        "input": {
          "name": "[parameters('lbRules')[copyIndex('loadBalancingRules')].name]",
          "properties": {
            "frontendIPConfiguration": {
              "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('myLoadBalancer')),'/frontendIPConfigurations/LoadBalancerIPConfig')]"
            },
            "frontendport": "[parameters('lbRules')[copyIndex('loadBalancingRules')].frontendport]",
            "backendport": "[parameters('lbRules')[copyIndex('loadBalancingRules')].backendport]",
            "enableFloatingIP": false,
            "idleTimeoutInMinutes": "5",
            "protocol": "[parameters('lbRules')[copyIndex('loadBalancingRules')].protocol]",
            "backendAddressPool": {
              "id": "[concat(resourceId('Microsoft.Network/loadBalancers', parameters('myLoadBalancer')),'/backendAddressPools/LoadBalancerBEAddressPool')]"
            },
            "probe": {
              "id": "[concat(variables('lbID0'),'/probes/', parameters('lbRules')[copyIndex('loadBalancingRules')].name,'Probe')]"
            }
          }
        }
      }
    ],


    "inboundNatPools": []
  },

  }
}

Plus d'informations peuvent être trouvées ici: https: // docs .microsoft.com / fr-fr / azure / azure-resource-manager / resource-group-create-multiple # property-iteration

15
HobPet 7 avril 2018 à 14:17

Il est désormais possible de boucler sur des propriétés ou sur des ressources enfants comme indiqué dans https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#property-iteration ou dans https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-multiple#create-multiple-instances-of-a-child-resource

Vous pouvez une extension de ressource enfant (par exemple, WebSite / Extension) en tant que ressource de niveau supérieur en suivant le format du type: {espace de noms du fournisseur de ressources} / {type-de-ressource-parent} / {type-de-ressource-enfant}. Par exemple Microsoft.Web / sites / siteextensions

Vous devez également référencer la ressource parent dans la ressource enfant par un concat. Par exemple: "name": "[concat ('mywebsite', '/', 'myextension', copyIndex ())]"

3
user3214451 28 nov. 2017 à 17:12

Ce que vous voulez réaliser est possible avec la fonction prendre . Vous avez lié vous-même le site de documentation approprié. Accédez au lien que vous avez publié et consultez la section "Créer plusieurs instances lorsque la copie ne fonctionnera pas" .

Dans votre cas, cela ressemblerait à ceci:

"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
             }
           }
    ],

Vous créez ensuite un paramètre spécifiant le nombre de sondes souhaitées

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

Enfin, vous utilisez take à l'intérieur de la ressource:

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

Si vous continuez à parcourir la documentation, vous verrez que vous pouvez devenir encore plus fou et combiner copie et prise avec des modèles liés.

1
TobiWi 29 janv. 2017 à 13:25