Koşullu olarak kaynak içinde bir Azure Resource Manager şablonu dağıtmaConditionally deploy a resource in an Azure Resource Manager template

Bir parametre değeri mevcut olup olmadığı gibi bir koşula bağlı olarak kaynak dağıtma için şablonunuzu tasarlamak gereken bazı senaryolar vardır.There are some scenarios in which you need to design your template to deploy a resource based on a condition, such as whether or not a parameter value is present. Örneğin, şablonunuza bir sanal ağı dağıtmak ve eşleme için diğer sanal ağlara belirtmek için parametreleri.For example, your template may deploy a virtual network and include parameters to specify other virtual networks for peering. Eşleme için herhangi bir parametre değeri belirtilmemiş, Resource Manager'ın eşleme kaynak dağıtma istemezsiniz.If you've not specified any parameter values for peering, you don't want Resource Manager to deploy the peering resource.

Bunu gerçekleştirmek için kullanın [koşul öğesi] azure-resource-manager-condition , parametre dizisi uzunluğunu test etmek için kaynak.To accomplish this, use the condition element in the resource to test the length of your parameter array. Uzunluğu sıfır ise, dönüş false dağıtım engellemek, ancak sıfırdan büyük olan tüm değerleri döndürür true dağıtıma izin vermek.If the length is zero, return false to prevent deployment, but for all values greater than zero return true to allow deployment.

Örnek şablonuExample template

Bu gösteren bir örnek şablon göz atalım.Let's look at an example template that demonstrates this. Bizim şablonu kullanan [koşul öğesi] azure-resource-manager-condition denetim dağıtımına Microsoft.Network/virtualNetworks/virtualNetworkPeerings kaynak.Our template uses the condition element to control deployment of the Microsoft.Network/virtualNetworks/virtualNetworkPeerings resource. Bu kaynak, aynı bölgedeki iki Azure sanal ağı arasında eşleme oluşturur.This resource creates a peering between two Azure Virtual Networks in the same region.

Her bölüm şablonun bir göz atalım.Let's take a look at each section of the template.

parameters Öğe tanımlar adlı tek bir parametre virtualNetworkPeerings:The parameters element defines a single parameter named virtualNetworkPeerings:

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

Bizim virtualNetworkPeerings parametresi bir array ve aşağıdaki şeması vardır:Our virtualNetworkPeerings parameter is an array and has the following schema:

"virtualNetworkPeerings": [
    {
      "name": "firstVNet/peering1",
      "properties": {
          "remoteVirtualNetwork": {
              "id": "[resourceId('Microsoft.Network/virtualNetworks','secondVNet')]"
          },
          "allowForwardedTraffic": true,
          "allowGatewayTransit": true,
          "useRemoteGateways": false
      }
    }
]

Bizim parametre özellikleri belirtin ilgili sanal ağları eşleme ayarlarını.The properties in our parameter specify the settings related to peering virtual networks. Biz belirttiğinizde şu değerleri bu özellikler için sağlarız Microsoft.Network/virtualNetworks/virtualNetworkPeerings kaynakta resources bölümü:We'll provide the values for these properties when we specify the Microsoft.Network/virtualNetworks/virtualNetworkPeerings resource in the resources section:

"resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2017-05-10",
      "name": "[concat('vnp-', copyIndex())]",
      "condition": "[greater(length(parameters('virtualNetworkPeerings')), 0)]",
      "dependsOn": [
        "firstVNet", "secondVNet"
      ],
      "copy": {
          "name": "iterator",
          "count": "[length(variables('peerings'))]",
          "mode": "serial"
      },
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
          },
          "variables": {
          },
          "resources": [
            {
              "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
              "apiVersion": "2016-06-01",
              "location": "[resourceGroup().location]",
              "name": "[variables('peerings')[copyIndex()].name]",
              "properties": "[variables('peerings')[copyIndex()].properties]"
            }
          ],
          "outputs": {
          }
        }
      }
    }
]

Birkaç şey üzerinde giderek bu bizim şablonunun parçası olarak vardır.There are a couple of things going on in this part of our template. İlk olarak, dağıtılan gerçek bir satır içi şablon türü kaynaktır Microsoft.Resources/deployments gerçekten dağıtır, kendi şablon içeren Microsoft.Network/virtualNetworks/virtualNetworkPeerings.First, the actual resource being deployed is an inline template of type Microsoft.Resources/deployments that includes its own template that actually deploys the Microsoft.Network/virtualNetworks/virtualNetworkPeerings.

Bizim name satır içi şablon geçerli yinelemesini birleştirerek benzersiz hale copyIndex() önekiyle vnp-.Our name for the inline template is made unique by concatenating the current iteration of the copyIndex() with the prefix vnp-.

condition Öğesi belirtir bizim kaynak olmalıdır ne zaman işlenen greater() işlevi değerlendirilen true.The condition element specifies that our resource should be processed when the greater() function evaluates to true. Burada, biz, test ettiğiniz virtualNetworkPeerings parametre dizisi greater() sıfırdan.Here, we're testing if the virtualNetworkPeerings parameter array is greater() than zero. İse, olarak değerlendirilen true ve condition karşılanmadı.If it is, it evaluates to true and the condition is satisfied. Aksi halde, false.Otherwise, it's false.

Ardından, belirttiğimiz bizim copy döngü.Next, we specify our copy loop. Bu bir serial döngü anlamına gelir döngü sırayla gerçekleştirilir, son kadar bekleyen her kaynakla kaynak dağıtıldı.It's a serial loop that means the loop is done in sequence, with each resource waiting until the last resource has been deployed. count Özellik döngü yineleme sayısını belirtir.The count property specifies the number of times the loop iterates. Normalde, uzunluğu ayarlayacağız virtualNetworkPeerings istiyoruz dağıtmak için kaynak belirtme parametresi nesnelerini içerdiğinden dizisi.Here, normally we'd set it to the length of the virtualNetworkPeerings array because it contains the parameter objects specifying the resource we want to deploy. Ancak, bunu, Resource Manager, size var olmayan özellikler erişmeye çalıştığınız bildirimler çünkü dizi boş olması durumunda doğrulama başarısız olur.However, if we do that, validation will fail if the array is empty because Resource Manager notices that we are attempting to access properties that do not exist. Biz bu sorunu, ancak çalışabilir.We can work around this, however. Yapmamız gereken değişkenleri bir göz atalım:Let's take a look at the variables we'll need:

  "variables": {
    "workaround": {
       "true": "[parameters('virtualNetworkPeerings')]",
       "false": [{
           "name": "workaround",
           "properties": {}
       }]
     },
     "peerings": "[variables('workaround')[string(greater(length(parameters('virtualNetworkPeerings')), 0))]]"
  },

Bizim workaround değişkeni içeren bir adlı iki özellik true ve adlı false.Our workaround variable includes two properties, one named true and one named false. true Özellik değeri olarak değerlendirir virtualNetworkPeerings parametre dizisi.The true property evaluates to the value of the virtualNetworkPeerings parameter array. false Özelliği değerlendirir Resource Manager görmeyi beklediği adlandırılmış özellikleri dahil olmak üzere, boş bir nesneye—unutmayın false gibi bir dizi gerçekten olan bizim virtualNetworkPeerings parametredir, doğrulama yerine getirecek.The false property evaluates to an empty object including the named properties that Resource Manager expects to see—note that false is actually an array, just as our virtualNetworkPeerings parameter is, which will satisfy validation.

Bizim peerings değişkenini kullanır bizim workaround tarafından bir kez daha, testi değişken uzunluğu virtualNetworkPeerings parametre dizisi sıfırdan büyük.Our peerings variable uses our workaround variable by once again testing if the length of the virtualNetworkPeerings parameter array is greater than zero. İse, string değerlendiren true ve workaround değişkeni değerlendirilen virtualNetworkPeerings parametre dizisi.If it is, the string evaluates to true and the workaround variable evaluates to the virtualNetworkPeerings parameter array. Aksi takdirde olarak değerlendirilen false ve workaround dizinin ilk öğesi boş bizim nesnesine değişkeni değerlendirir.Otherwise, it evaluates to false and the workaround variable evaluates to our empty object in the first element of the array.

Biz doğrulama sorunu geçici olarak çalıştım, biz dağıtımını yalnızca belirtebilirsiniz Microsoft.Network/virtualNetworks/virtualNetworkPeerings geçirme iç içe geçmiş şablon kaynağında name ve properties gelen bizim virtualNetworkPeerings parametre dizisi.Now that we've worked around the validation issue, we can simply specify the deployment of the Microsoft.Network/virtualNetworks/virtualNetworkPeerings resource in the nested template, passing the name and properties from our virtualNetworkPeerings parameter array. Bu konuda bkz template öğesi içinde iç içe properties bizim kaynak öğesi.You can see this in the template element nested in the properties element of our resource.

Şablon kullanmayı deneyinTry the template

Örnek şablonu kullanılabilir GitHub.An example template is available on GitHub. Şablonu dağıtmak için aşağıdaki komutu çalıştırın. [Azure CLI] cli komutları:To deploy the template, run the following Azure CLI commands:

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/example2-conditional/deploy.json

Sonraki adımlarNext steps