Özellik dönüştürücü ve Toplayıcı, bir Azure Resource Manager şablonu uygulayınImplement a property transformer and collector in an Azure Resource Manager template

İçinde bir Azure Resource Manager şablonunda bir parametre olarak bir nesne kullanmasını, kaynak özellik değerlerini bir nesneyi depolamak ve bunları bir kaynağa dağıtım sırasında uygulama hakkında bilgi edindiniz.In use an object as a parameter in an Azure Resource Manager template, you learned how to store resource property values in an object and apply them to a resource during deployment. Bu parametrelerinizi yönetmek için çok kullanışlı bir yöntem olsa da, bunu hala şablonunuzda kullanmak her zaman kaynak özelliklerine harita nesnenin özellikleri gerektirir.While this is a very useful way to manage your parameters, it still requires you to map the object's properties to resource properties each time you use it in your template.

Bu sorunu çözmek için nesne dizisi yinelenir ve kaynak tarafından beklenen JSON şeması dönüştüren bir özelliği dönüştürme ve Toplayıcı şablonu uygulayabilirsiniz.To work around this, you can implement a property transform and collector template that iterates your object array and transforms it into the JSON schema expected by the resource.

Önemli

Bu yaklaşım, Resource Manager şablonları ve İşlevler derin bir anlayış sahip olmasını gerektirir.This approach requires that you have a deep understanding of Resource Manager templates and functions.

Şimdi nasıl biz özelliği Toplayıcı ve transformer dağıtan bir örnek ile uygulayabilirsiniz bir göz atalım bir ağ güvenlik grubu (NSG).Let's take a look at how we can implement a property collector and transformer with an example that deploys a network security group (NSG). Aşağıdaki diyagramda, şablonlarımız ve bu şablonları içinde kaynaklarımızın arasındaki ilişki gösterilmektedir:The diagram below shows the relationship between our templates and our resources within those templates:

özellik Toplayıcı ve transformer mimarisi

Bizim çağıran şablonu iki kaynakları içerir:Our calling template includes two resources:

  • çağıran bir şablon bağlantısı bizim Toplayıcı şablon.A template link that invokes our collector template.
  • dağıtmak için NSG kaynağı.The NSG resource to deploy.

Bizim Toplayıcı şablon iki kaynakları içerir:Our collector template includes two resources:

  • bir bağlantı kaynak.An anchor resource.
  • kopyalama döngüsü dönüştürme şablonda çağıran şablonu bağlantısı.A template link that invokes the transform template in a copy loop.

Bizim dönüştürme şablonu tek bir kaynak içerir: boş bir şablon ile dönüştüren bir değişken bizim source bizim NSG kaynağı tarafından beklenen JSON şema JSON ana şablon.Our transform template includes a single resource: an empty template with a variable that transforms our source JSON to the JSON schema expected by our NSG resource in the main template.

Parametre nesnesiParameter object

Kullanacağız bizim securityRules parametre nesneden parametre olarak nesnelerin.We'll be using our securityRules parameter object from objects as parameters. Bizim dönüştürme şablonu her bir nesnenin dönüştüren securityRules NSG kaynak tarafından beklenen JSON şeması diziye bizim çağıran şablonu.Our transform template will transform each object in the securityRules array into the JSON schema expected by the NSG resource in our calling template.

{
    "$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"
            }
          ]
        }
      }
    }
  }

Bakalım bizim dönüştürme şablonu ilk.Let's look at our transform template first.

Şablonu DönüştürTransform template

Bizim dönüştürme şablonu gelen geçirilen iki parametre içeren Toplayıcı şablon:Our transform template includes two parameters that are passed from the collector template:

  • source özelliği diziden özellik değeri nesnelerden birinde yer alan bir nesnedir.source is an object that receives one of the property value objects from the property array. Bizim örneğimizde her nesnesinden "securityRules" tek bir zaman dizisi geçirilir.In our example, each object from the "securityRules" array will be passed in one at a time.
  • state Birleştirilmiş sonuçların önceki tüm dönüşümleri alır bir dizidir.state is an array that receives the concatenated results of all the previous transforms. Dönüştürülen JSON koleksiyonudur.This is the collection of transformed JSON.

Bizim parametre şöyle görünür:Our parameters look like this:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "source": { "type": "object" },
    "state": {
      "type": "array",
      "defaultValue": [ ]
    }
  },

Bizim şablonu da adlı bir değişken tanımlar instance.Our template also defines a variable named instance. ' In gerçek dönüşüm gerçekleştiren bizim source gerekli JSON şema nesnesine:It performs the actual transform of our source object into the required JSON schema:

  "variables": {
    "instance": [
      {
        "name": "[parameters('source').name]",
        "properties":{
            "description": "[parameters('source').description]",
            "protocol": "[parameters('source').protocol]",
            "sourcePortRange": "[parameters('source').sourcePortRange]",
            "destinationPortRange": "[parameters('source').destinationPortRange]",
            "sourceAddressPrefix": "[parameters('source').sourceAddressPrefix]",
            "destinationAddressPrefix": "[parameters('source').destinationAddressPrefix]",
            "access": "[parameters('source').access]",
            "priority": "[parameters('source').priority]",
            "direction": "[parameters('source').direction]"
        }
      }
    ]

  },

Son olarak, output toplanan dönüştürmeleri bizim şablon art arda ekler bizim state parametresi tarafından gerçekleştirilen geçerli dönüştürme bizim instance değişkeni:Finally, the output of our template concatenates the collected transforms of our state parameter with the current transform performed by our instance variable:

    "resources": [],
    "outputs": {
    "collection": {
      "type": "array",
      "value": "[concat(parameters('state'), variables('instance'))]"
    }

Ardından, bir göz atalım bizim Toplayıcı şablon bizim parametre değerlerini nasıl arabimini görmek için.Next, let's take a look at our collector template to see how it passes in our parameter values.

Toplayıcı şablonuCollector template

Bizim Toplayıcı şablon üç parametreleri içerir:Our collector template includes three parameters:

  • source Nesne tam parametre bizim dizisidir.source is our complete parameter object array. Bunu geçirilen çağıran şablonu.It's passed in by the calling template. Bu aynı ada sahip source parametresinde bizim dönüştürme şablonu zaten fark etmiş, önemli bir fark yoktur ancak: dizisi budur ancak biz yalnızca bu dizinin bir öğe için başarılıdönüştürme şablonu birer güncelleştirir.This has the same name as the source parameter in our transform template but there is one key difference that you may have already noticed: this is the complete array, but we only pass one element of this array to the transform template at a time.
  • transformTemplateUri URI, bizim dönüştürme şablonu.transformTemplateUri is the URI of our transform template. Biz bunu bir parametre olarak Burada şablon çalışmalarında tanımlayacağınız.We're defining it as a parameter here for template reusability.
  • state Biz geçişi için başlangıçta boş bir dizi bizim dönüştürme şablonu.state is an initially empty array that we pass to our transform template. Kopyalama döngüsü tamamlandıktan sonra dönüştürülen parametre nesnelerinin koleksiyonunu depolar.It stores the collection of transformed parameter objects when the copy loop is complete.

Bizim parametre şöyle görünür:Our parameters look like this:

  "parameters": {
    "source": { "type": "array" },
    "transformTemplateUri": { "type": "string" },
    "state": {
      "type": "array",
      "defaultValue": [ ]
    }

Ardından, adında bir değişken tanımlarız count.Next, we define a variable named count. Değeri uzunluğu ise source parametre nesne dizisi:Its value is the length of the source parameter object array:

  "variables": {
    "count": "[length(parameters('source'))]"
  },

Şüpheli gibi bu sayıda yineleme için bizim kopyalama döngüde kullanırız.As you might suspect, we use it for the number of iterations in our copy loop.

Artık kaynaklarımızın bir göz atalım.Now let's take a look at our resources. İki kaynak tanımlarız:We define two resources:

  • loop-0 Bizim kopyalama döngüsü için sıfır tabanlı kaynaktır.loop-0 is the zero-based resource for our copy loop.
  • loop- sonucu ile birleştirilmiş copyIndex(1) yineleme tabanlı benzersiz bir ad ile başlayarak, kaynak oluşturmak için işlev 1.loop- is concatenated with the result of the copyIndex(1) function to generate a unique iteration-based name for our resource, starting with 1.

Kaynaklarımızın şöyle görünür:Our resources look like this:

  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2015-01-01",
      "name": "loop-0",
      "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": {
            "collection": {
              "type": "array",
              "value": "[parameters('state')]"
            }
          }
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2015-01-01",
      "name": "[concat('loop-', copyindex(1))]",
      "copy": {
        "name": "iterator",
        "count": "[variables('count')]",
        "mode": "serial"
      },
      "dependsOn": [
        "loop-0"
      ],
      "properties": {
        "mode": "Incremental",
        "templateLink": { "uri": "[parameters('transformTemplateUri')]" },
        "parameters": {
          "source": { "value": "[parameters('source')[copyindex()]]" },
          "state": { "value": "[reference(concat('loop-', copyindex())).outputs.collection.value]" }
        }
      }
    }
  ],

Biz geçirme için parametreleri daha yakın bir göz atalım bizim dönüştürme şablonu iç içe geçmiş şablon içinde.Let's take a closer look at the parameters we're passing to our transform template in the nested template. Önceki sözcüğünün bizim source parametresi geçirir geçerli nesnesinde source parametre nesne dizisi.Recall from earlier that our source parameter passes the current object in the source parameter object array. state Parametresi, burada koleksiyonu olduğunda, bizim kopyalama döngüsü önceki yinelemede çıktısını aldığından—dikkat reference() işlevi kullanır copyIndex() başvurmakiçinhiçbirparametresiyleişleviname bizim önceki bağlı şablon nesnesinin—ve geçerli yinelemeye geçirir.The state parameter is where the collection happens, because it takes the output of the previous iteration of our copy loop—notice that the reference() function uses the copyIndex() function with no parameter to reference the name of our previous linked template object—and passes it to the current iteration.

Son olarak, output döndürür bizim şablon output son yinelemeyi biri bizim dönüştürme şablonu:Finally, the output of our template returns the output of the last iteration of our transform template:

  "outputs": {
    "result": {
      "type": "array",
      "value": "[reference(concat('loop-', variables('count'))).outputs.collection.value]"
    }
  }

Döndürülecek mantığa aykırı görünse output son yinelemeyi biri bizim dönüştürme şablonu için sunduğumuz çağıran şablonu biz depolama içinde göründüğü çünkü bizim source parametre.It may seem counterintuitive to return the output of the last iteration of our transform template to our calling template because it appeared we were storing it in our source parameter. Bununla birlikte, son yinelemesi olduğunu unutmayın. bizim dönüştürme şablonu dönüştürülmüş özellik nesnelerinin dizisi tutan ve döndürülecek istiyoruz.However, remember that it's the last iteration of our transform template that holds the complete array of transformed property objects, and that's what we want to return.

Son olarak, çağırmak nasıl bir göz atalım Toplayıcı şablon gelen bizim çağıran şablonu.Finally, let's take a look at how to call the collector template from our calling template.

Şablon aramaCalling template

Bizim çağıran şablonu adlı tek bir parametre tanımlar networkSecurityGroupsSettings:Our calling template defines a single parameter named networkSecurityGroupsSettings:

...
"parameters": {
    "networkSecurityGroupsSettings": {
        "type": "object"
    }

Ardından, bizim şablon adlı tek bir değişkeni tanımlar collectorTemplateUri:Next, our template defines a single variable named collectorTemplateUri:

"variables": {
    "collectorTemplateUri": "[uri(deployment().properties.templateLink.uri, 'collector.template.json')]"
  }

Beklediğiniz gibi için URI budur Toplayıcı şablon bizim bağlı şablon kaynağı tarafından kullanılır:As you would expect, this is the URI for the collector template that will be used by our linked template resource:

{
    "apiVersion": "2015-01-01",
    "name": "collector",
    "type": "Microsoft.Resources/deployments",
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "[variables('collectorTemplateUri')]",
            "contentVersion": "1.0.0.0"
        },
        "parameters": {
            "source" : {"value": "[parameters('networkSecurityGroupsSettings').securityRules]"},
            "transformTemplateUri": { "value": "[uri(deployment().properties.templateLink.uri, 'transform.json')]"}
        }
    }
}

Biz geçirmek için iki parametre Toplayıcı şablon:We pass two parameters to the collector template:

  • source nesne özelliği bizim dizisidir.source is our property object array. Örneğimizde, bu bizim networkSecurityGroupsSettings parametresi.In our example, it's our networkSecurityGroupsSettings parameter.
  • transformTemplateUri Bu değişken yalnızca tanımladığımız URI'si ile bizim Toplayıcı şablon.transformTemplateUri is the variable we just defined with the URI of our collector template.

Son olarak, bizim Microsoft.Network/networkSecurityGroups kaynak doğrudan atar output , collector bağlı şablon kaynağı için kendi securityRules özelliği:Finally, our Microsoft.Network/networkSecurityGroups resource directly assigns the output of the collector linked template resource to its securityRules property:

    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Network/networkSecurityGroups",
      "name": "networkSecurityGroup1",
      "location": "[resourceGroup().location]",
      "properties": {
        "securityRules": "[reference('collector').outputs.result.value]"
      }
    }
  ],
  "outputs": {
      "instance":{
          "type": "array",
          "value": "[reference('collector').outputs.result.value]"
      }

  }

Ş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/example4-collector
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/example4-collector/deploy.json \
    --parameters deploy.parameters.json