Bir Azure Resource Manager şablonunda bir parametre olarak bir nesneyi kullanmaUse an object as a parameter in an Azure Resource Manager template

Olduğunda, Azure Resource Manager şablonları yazma, ya da şablonda doğrudan kaynak özellik değerlerini belirtin veya bir parametre tanımlayabilir ve dağıtım sırasında değerleri sağlayın.When you author Azure Resource Manager templates, you can either specify resource property values directly in the template or define a parameter and provide values during deployment. Küçük dağıtımlar için her bir özellik değeri için bir parametre kullanmak uygundur, ancak dağıtım başına 255 parametrelerinin bir sınır yoktur.It's fine to use a parameter for each property value for small deployments, but there is a limit of 255 parameters per deployment. Daha büyük ve daha karmaşık dağıtımlar için aldıktan sonra parametreleri dışında çalışabilir.Once you get to larger and more complex deployments you may run out of parameters.

Bu sorunu çözmenin bir yolu, bir değer yerine parametre olarak nesne kullanmaktır.One way to solve this problem is to use an object as a parameter instead of a value. Bunu yapmak için şablonunda parametreyi tanımlayın ve dağıtım sırasında bir JSON nesnesi yerine tek bir değer belirtin.To do this, define the parameter in your template and specify a JSON object instead of a single value during deployment. Ardından, parametre kullanarak alt başvuru [ parameter() işlevi] azure-resource-manager-functions ve şablonunuzda nokta işleci.Then, reference the subproperties of the parameter using the parameter() function and dot operator in your template.

Bir sanal ağ kaynağı dağıtan bir örnek bir göz atalım.Let's take a look at an example that deploys a virtual network resource. İlk olarak, belirtelim bir VNetSettings şablon ve kümesi parametre type için object:First, let's specify a VNetSettings parameter in our template and set the type to object:

...
"parameters": {
    "VNetSettings":{"type":"object"}
},

Ardından, şimdi için değerler sağlayın VNetSettings nesnesi:Next, let's provide values for the VNetSettings object:

Not

Dağıtım sırasında parametre değerlerini sağlamayı öğrenmek için bkz: parametreleri bölümünü [yapısını ve Azure Resource Manager şablonları söz dizimini anlamak] azure-resource-manager-authoring-templates .To learn how to provide parameter values during deployment, see the parameters section of understand the structure and syntax of Azure Resource Manager templates.

"parameters":{
    "VNetSettings":{
        "value":{
            "name":"VNet1",
            "addressPrefixes": [
                {
                    "name": "firstPrefix",
                    "addressPrefix": "10.0.0.0/22"
                }
            ],
            "subnets":[
                {
                    "name": "firstSubnet",
                    "addressPrefix": "10.0.0.0/24"
                },
                {
                    "name":"secondSubnet",
                    "addressPrefix":"10.0.1.0/24"
                }
            ]
        }
    }
}

Gördüğünüz gibi tek bir parametre aslında üç alt belirtir: name, addressPrefixes, ve subnets.As you can see, our single parameter actually specifies three subproperties: name, addressPrefixes, and subnets. Bu alt her ya da bir değer veya diğer alt belirtir.Each of these subproperties either specifies a value or other subproperties. Sonuç, bizim tek bir parametre bizim sanal ağı dağıtmak gerekli tüm değerleri belirttiğinden emin olur.The result is that our single parameter specifies all the values necessary to deploy our virtual network.

Şimdi github'dan geri kalanını görmek için sunduğumuz şablonu göz sahip nasıl VNetSettings nesnesi kullanılır:Now let's have a look at the rest of our template to see how the VNetSettings object is used:

...
"resources": [
    {
        "apiVersion": "2015-06-15",
        "type": "Microsoft.Network/virtualNetworks",
        "name": "[parameters('VNetSettings').name]",
        "location":"[resourceGroup().location]",
        "properties": {
          "addressSpace":{
              "addressPrefixes": [
                "[parameters('VNetSettings').addressPrefixes[0].addressPrefix]"
              ]
          },
          "subnets":[
              {
                  "name":"[parameters('VNetSettings').subnets[0].name]",
                  "properties": {
                      "addressPrefix": "[parameters('VNetSettings').subnets[0].addressPrefix]"
                  }
              },
              {
                  "name":"[parameters('VNetSettings').subnets[1].name]",
                  "properties": {
                      "addressPrefix": "[parameters('VNetSettings').subnets[1].addressPrefix]"
                  }
              }
          ]
        }
    }
  ]

Değerlerini bizim VNetSettings bizim sanal ağ kaynağını kullanarak gerekli özelliklerine uygulanan nesneye parameters() işlevi hem [] dizi dizin oluşturucu ve nokta işleci.The values of our VNetSettings object are applied to the properties required by our virtual network resource using the parameters() function with both the [] array indexer and the dot operator. Yalnızca statik olarak parametre nesnesine değerlerini kaynağa uygulamak istiyorsanız bu yaklaşımı çalışır.This approach works if you just want to statically apply the values of the parameter object to the resource. Ancak, dağıtım sırasında bir dizi özellik değerleri dinamik olarak atamak istiyorsanız kullanabileceğiniz bir kopyalama döngüsü.However, if you want to dynamically assign an array of property values during deployment you can use a copy loop. Kopyalama döngüsü kullanmak için kaynak bir JSON dizisi özellik değerlerini belirtin ve kopyalama döngüsü, kaynağın özelliklerini değerleri dinamik olarak uygular.To use a copy loop, you provide a JSON array of resource property values and the copy loop dynamically applies the values to the resource's properties.

Dinamik yaklaşımı kullanırsanız dikkat edilmesi gereken bir sorun yoktur.There is one issue to be aware of if you use the dynamic approach. Sorunu göstermek için tipik bir dizi özellik değerlerinin bir göz atalım.To demonstrate the issue, let's take a look at a typical array of property values. Bu örnekte, bizim özellikleri için değer bir değişkende depolanır.In this example the values for our properties are stored in a variable. İki sahibiz bildirimi diziler Buraya—adlı bir firstProperty ve adlı secondProperty.Notice we have two arrays here—one named firstProperty and one named secondProperty.

"variables": {
    "firstProperty": [
        {
            "name": "A",
            "type": "typeA"
        },
        {
            "name": "B",
            "type": "typeB"
        },
        {
            "name": "C",
            "type": "typeC"
        }
    ],
    "secondProperty": [
        "one","two", "three"
    ]
}

Şimdi biz kopyalama döngüsü kullanarak değişkeninde özelliklerine erişim yolu bir göz atalım.Now let's take a look at the way we access the properties in the variable using a copy loop.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    ...
    "copy": {
        "name": "copyLoop1",
        "count": "[length(variables('firstProperty'))]"
    },
    ...
    "properties": {
        "name": { "value": "[variables('firstProperty')[copyIndex()].name]" },
        "type": { "value": "[variables('firstProperty')[copyIndex()].type]" },
        "number": { "value": "[variables('secondProperty')[copyIndex()]]" }
    }
}

copyIndex() Kopyalama döngüsü geçerli yinelemesini işlevi döndürür ve, bir dizin olarak her iki dizi aynı anda kullanırız.The copyIndex() function returns the current iteration of the copy loop, and we use that as an index into each of the two arrays simultaneously.

İki dizi aynı uzunlukta olduğunda düzgün çalışır.This works fine when the two arrays are the same length. Farklı uzunluktaki iki dizi yaptığınız bir hata ve sorun ortaya çıkar—şablonunuz bu durumda dağıtım sırasında doğrulama başarısız olur.The issue arises if you've made a mistake and the two arrays are different lengths—in this case your template will fail validation during deployment. Bir değer eksik olduğunda görmek çok daha kolay olduğundan, tüm özellikler tek bir nesne ekleyerek bu sorunu önleyebilirsiniz.You can avoid this issue by including all your properties in a single object, because it is much easier to see when a value is missing. Örneğin, şimdi başka bir parametre nesnesine hangi her öğesinde göz propertyObject dizidir birleşimi firstProperty ve secondProperty diziler de daha önce.For example, let's take a look another parameter object in which each element of the propertyObject array is the union of the firstProperty and secondProperty arrays from earlier.

"variables": {
    "propertyObject": [
        {
            "name": "A",
            "type": "typeA",
            "number": "one"
        },
        {
            "name": "B",
            "type": "typeB",
            "number": "two"
        },
        {
            "name": "C",
            "type": "typeC"
        }
    ]
}

Dizideki üçüncü öğe fark ettiniz mi?Notice the third element in the array? Bu, eksik number özelliği, ancak bu şekilde parametre değerlerini yazarken, onu kaçırdığınıza olduğunu fark çok daha kolay.It's missing the number property, but it's much easier to notice that you've missed it when you're authoring the parameter values this way.

Özellik nesnesi bir kopya döngüde kullanmaUsing a property object in a copy loop

Bu yaklaşım [seri kopyalama döngüsü] ile birlikte kullanıldığında daha yararlı hale gelir [azure-resource-manager-oluşturma-birden çok], alt kaynakları dağıtmak için özellikle.This approach becomes even more useful when combined with the [serial copy loop][azure-resource-manager-create-multiple], particularly for deploying child resources.

Bunu göstermek için dağıtan bir şablon gözden geçirelim bir [ağ güvenlik grubu (NSG)] nsg iki güvenlik kuralları ile.To demonstrate this, let's look at a template that deploys a network security group (NSG) with two security rules.

İlk olarak, bizim parametreleri bir göz atalım.First, let's take a look at our parameters. Biz size adlı bir parametresini tanımladınız göreceksiniz bizim şablon baktığınızda networkSecurityGroupsSettings adlı bir dizi içeren securityRules.When we look at our template we'll see that we've defined one parameter named networkSecurityGroupsSettings that includes an array named securityRules. Bu dizi bir güvenlik kuralı için ayarları belirtin iki JSON nesnesi içerir.This array contains two JSON objects that specify a number of settings for a security rule.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters":{
      "networkSecurityGroupsSettings": {
      "value": {
          "securityRules": [
            {
              "name": "RDPAllow",
              "description": "allow RDP connections",
              "direction": "Inbound",
              "priority": 100,
              "sourceAddressPrefix": "*",
              "destinationAddressPrefix": "10.0.0.0/24",
              "sourcePortRange": "*",
              "destinationPortRange": "3389",
              "access": "Allow",
              "protocol": "Tcp"
            },
            {
              "name": "HTTPAllow",
              "description": "allow HTTP connections",
              "direction": "Inbound",
              "priority": 200,
              "sourceAddressPrefix": "*",
              "destinationAddressPrefix": "10.0.1.0/24",
              "sourcePortRange": "*",
              "destinationPortRange": "80",
              "access": "Allow",
              "protocol": "Tcp"
            }
          ]
        }
      }
    }
  }

Şimdi, şablon bir göz atalım.Now let's take a look at our template. Adlı bizim ilk kaynak NSG1 NSG dağıtır.Our first resource named NSG1 deploys the NSG. Adlı ikinci bizim kaynak loop-0 iki işlevleri gerçekleştirir: ilk olarak, bu dependsOn dağıtımı kadar başlamayacağına şekilde NSG NSG1 tamamlandığında, ve ilk sıralı döngü yinelemesi.Our second resource named loop-0 performs two functions: first, it dependsOn the NSG so its deployment doesn't begin until NSG1 is completed, and it is the first iteration of the sequential loop. Son örnekte olduğu gibi parametre değerleri için bir nesne kullanarak bizim güvenlik kuralları dağıtan bir iç içe geçmiş şablon bizim üçüncü kaynaktır.Our third resource is a nested template that deploys our security rules using an object for its parameter values as in the last example.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
      "networkSecurityGroupsSettings": {"type":"object"}
  },
  "variables": {},
  "resources": [
    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Network/networkSecurityGroups",
      "name": "NSG1",
      "location":"[resourceGroup().location]",
      "properties": {
          "securityRules":[]
      }
    },
    {
        "apiVersion": "2015-01-01",
        "type": "Microsoft.Resources/deployments",
        "name": "loop-0",
        "dependsOn": [
            "NSG1"
        ],
        "properties": {
            "mode":"Incremental",
            "parameters":{},
            "template": {
                "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                "contentVersion": "1.0.0.0",
                "parameters": {},
                "variables": {},
                "resources": [],
                "outputs": {}
            }
        }
    },
    {
        "apiVersion": "2015-01-01",
        "type": "Microsoft.Resources/deployments",
        "name": "[concat('loop-', copyIndex(1))]",
        "dependsOn": [
          "[concat('loop-', copyIndex())]"
        ],
        "copy": {
          "name": "iterator",
          "count": "[length(parameters('networkSecurityGroupsSettings').securityRules)]"
        },
        "properties": {
          "mode": "Incremental",
          "template": {
            "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
           "parameters": {},
            "variables": {},
            "resources": [
                {
                    "name": "[concat('NSG1/' , parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].name)]",
                    "type": "Microsoft.Network/networkSecurityGroups/securityRules",
                    "apiVersion": "2016-09-01",
                    "location":"[resourceGroup().location]",
                    "properties":{
                        "description": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].description]",
                        "priority":"[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].priority]",
                        "protocol":"[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].protocol]",
                        "sourcePortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].sourcePortRange]",
                        "destinationPortRange": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].destinationPortRange]",
                        "sourceAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].sourceAddressPrefix]",
                        "destinationAddressPrefix": "[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].destinationAddressPrefix]",
                        "access":"[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].access]",
                        "direction":"[parameters('networkSecurityGroupsSettings').securityRules[copyIndex()].direction]"
                        }
                  }
            ],
            "outputs": {}
          }
        }
    }
  ],
  "outputs": {}
}

Sunduğumuz özellik değerlerini de belirttiğimiz nasıl bir daha yakından bakalım securityRules alt kaynak.Let's take a closer look at how we specify our property values in the securityRules child resource. Tüm müşterilerimizin özelliklerini kullanarak başvurulan parameter() işlevi ve ardından başvurmak için nokta işleci kullanın bizim securityRules geçerli yineleme değeri tarafından dizini oluşturulmuş bir dizi.All of our properties are referenced using the parameter() function, and then we use the dot operator to reference our securityRules array, indexed by the current value of the iteration. Son olarak, başka bir nokta işleci nesnenin adını başvurmak için kullanırız.Finally, we use another dot operator to reference the name of the object.

Şablon kullanmayı deneyinTry the template

Örnek şablonu kullanılabilir GitHub.An example template is available on GitHub. Şablonu dağıtmak için depoyu kopyalayalım ve aşağıdaki [Azure CLI] cli komutları:To deploy the template, clone the repo and run the following Azure CLI commands:

git clone https://github.com/mspnp/template-examples.git
cd template-examples/example3-object-param
az group create --location <location> --name <resource-group-name>
az group deployment create -g <resource-group-name> \
    --template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example3-object-param/deploy.json \
    --parameters deploy.parameters.json

Sonraki adımlarNext steps