ARM şablonlarında dağıtım betiklerini kullanma

Azure Resource Manager (ARM) şablonlarında dağıtım betiklerini kullanmayı öğrenin. Kaynakla deploymentScripts , kullanıcılar ARM dağıtımlarında betik yürütebilir ve yürütme sonuçlarını gözden geçirebilir.

İpucu

ARM şablonlarıyla aynı özellikleri sunduğundan ve söz diziminin kullanımı daha kolay olduğundan Bicep'i öneririz. Daha fazla bilgi için bkz . Dağıtım betiği.

Bu betikler aşağıdakiler gibi özel adımlar gerçekleştirmek için kullanılabilir:

  • Dizine kullanıcı ekleme.
  • Blobları veya tohum veritabanını kopyalama gibi veri düzlemi işlemleri gerçekleştirin.
  • Lisans anahtarını arayın ve doğrulayın.
  • Otomatik olarak imzalanan bir sertifika oluşturun.
  • Microsoft Entra Id'de bir nesne oluşturun.
  • Özel sistemden IP Adresi bloklarını arayın.

Dağıtım betiğinin avantajları:

  • Kolayca kodlayın, kullanın ve hata ayıklayın. Sık kullandığınız geliştirme ortamlarında dağıtım betikleri geliştirebilirsiniz. Betikler şablonlara veya dış betik dosyalarına eklenebilir.
  • Betik dilini ve platformu belirtebilirsiniz. Şu anda Linux ortamındaKi Azure PowerShell ve Azure CLI dağıtım betikleri desteklenmektedir.
  • Komut satırı bağımsız değişkenlerinin betike geçirilmesine izin verin.
  • Betik çıkışlarını belirtebilir ve bunları dağıtıma geri geçirebilir.

Dağıtım betiği kaynağı yalnızca Azure Container Instance'ın kullanılabildiği bölgelerde kullanılabilir. Bkz. Azure bölgelerindeki Azure Container Instances için kaynak kullanılabilirliği. Şu anda dağıtım betiği yalnızca genel ağ kullanır.

Önemli

Dağıtım betiği hizmeti, betik yürütme ve sorun giderme için iki destekleyici kaynak gerektirir: depolama hesabı ve kapsayıcı örneği. Mevcut bir depolama hesabını belirtebilirsiniz, aksi takdirde betik hizmeti sizin için bir hesap oluşturur. Otomatik olarak oluşturulan iki destekleyici kaynak genellikle dağıtım betiği yürütmesi terminal durumunda olduğunda betik hizmeti tarafından silinir. Destek kaynakları silinene kadar faturalandırılırsınız. Fiyat bilgileri için bkz . Kapsayıcı Örnekleri fiyatlandırması ve Azure Depolama fiyatlandırması. Daha fazla bilgi edinmek için bkz . Dağıtım betiği kaynaklarını temizleme.

Not

Azure oturum açma için yeniden deneme mantığı artık sarmalayıcı betiğinde yerleşik olarak bulunur. Dağıtım betiklerinizle aynı şablonda izinler verirseniz, yönetilen kimlik rolü ataması çoğaltılana kadar dağıtım betiği hizmeti 10 saniyelik aralıkla 10 dakika boyunca oturum açmayı yeniden dener.

Eğitim kaynakları

Adım adım yönergeler aracılığıyla dağıtım betikleri hakkında bilgi edinmek isterseniz bkz . Dağıtım betiklerini kullanarak ARM şablonlarını genişletme.

En düşük izinleri yapılandırma

Dağıtım betiği API'si sürüm 2020-10-01 veya üzeri için, dağıtım betiği yürütmede iki sorumlu vardır:

  • Dağıtım sorumlusu (şablonu dağıtmak için kullanılan sorumlu): Bu sorumlu, dağıtım betiği kaynağının yürütülmesi için gereken temel kaynakları (depolama hesabı ve Azure kapsayıcı örneği) oluşturmak için kullanılır. En düşük ayrıcalık izinlerini yapılandırmak için dağıtım sorumlusuna aşağıdaki özelliklere sahip özel bir rol atayın:

    {
      "roleName": "deployment-script-minimum-privilege-for-deployment-principal",
      "description": "Configure least privilege for the deployment principal in deployment script",
      "type": "customRole",
      "IsCustom": true,
      "permissions": [
        {
          "actions": [
            "Microsoft.Storage/storageAccounts/*",
            "Microsoft.ContainerInstance/containerGroups/*",
            "Microsoft.Resources/deployments/*",
            "Microsoft.Resources/deploymentScripts/*"
          ],
        }
      ],
      "assignableScopes": [
        "[subscription().id]"
      ]
    }
    

    Azure Depolama ve Azure Container Instance kaynak sağlayıcıları kaydedilmediyse ve Microsoft.ContainerInstance/register/actionöğesini de eklemeniz Microsoft.Storage/register/action gerekir.

  • Dağıtım betiği sorumlusu: Bu sorumlu yalnızca dağıtım betiğinin Azure'da kimlik doğrulaması yapması ve Azure CLI/PowerShell çağrısı yapması gerekiyorsa gereklidir. Dağıtım betiği sorumlusunu belirtmenin iki yolu vardır:

    • özelliğinde identity kullanıcı tarafından atanan bir yönetilen kimlik belirtin (bkz . Örnek şablonlar). Belirtildiğinde, betik hizmeti dağıtım betiğini çağırmadan önce çağırır Connect-AzAccount -Identity . Yönetilen kimliğin betikteki işlemi tamamlamak için gerekli erişime sahip olması gerekir. Şu anda özellik için identity yalnızca kullanıcı tarafından atanan yönetilen kimlik desteklenmektedir. Farklı bir kimlikle oturum açmak için bu listedeki ikinci yöntemi kullanın.
    • Hizmet sorumlusu kimlik bilgilerini güvenli ortam değişkenleri olarak geçirin ve ardından dağıtım betiğinde Connect-AzAccount veya az login çağrısı yapabilir.

    Yönetilen kimlik kullanılırsa, dağıtım sorumlusunun yönetilen kimlik kaynağına Atanmış Yönetilen Kimlik operatörü rolüne (yerleşik bir rol) sahip olması gerekir.

Örnek şablonlar

Aşağıdaki JSON bir örnektir. Daha fazla bilgi için en son şablon şemasına bakın.

{
  "type": "Microsoft.Resources/deploymentScripts",
  "apiVersion": "2020-10-01",
  "name": "runPowerShellInline",
  "location": "[resourceGroup().location]",
  "tags": {
    "tagName1": "tagValue1",
    "tagName2": "tagValue2"
  },
  "kind": "AzurePowerShell", // or "AzureCLI"
  "identity": {
    "type": "userAssigned",
    "userAssignedIdentities": {
      "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myID": {}
    }
  },
  "properties": {
    "forceUpdateTag": "1",
    "containerSettings": {
      "containerGroupName": "mycustomaci"
    },
    "storageAccountSettings": {
      "storageAccountName": "myStorageAccount",
      "storageAccountKey": "myKey"
    },
    "azPowerShellVersion": "9.7",  // or "azCliVersion": "2.47.0",
    "arguments": "-name \\\"John Dole\\\"",
    "environmentVariables": [
      {
        "name": "UserName",
        "value": "jdole"
      },
      {
        "name": "Password",
        "secureValue": "jDolePassword"
      }
    ],
    "scriptContent": "
      param([string] $name)
      $output = 'Hello {0}. The username is {1}, the password is {2}.' -f $name,${Env:UserName},${Env:Password}
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    ", // or "primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",
    "supportingScriptUris":[],
    "timeout": "PT30M",
    "cleanupPreference": "OnSuccess",
    "retentionInterval": "P1D"
  }
}

Not

Örnek, tanıtım amaçlıdır. özellikleri scriptContent ve primaryScriptUri bir şablonda birlikte var olamaz.

Not

scriptContent, birden çok satır içeren bir betik gösterir. Azure portalı ve Azure DevOps işlem hattı, birden çok satır içeren bir dağıtım betiğini ayrıştıramaz. PowerShell komutlarını (noktalı virgül veya \r\n veya \n kullanarak) tek bir satıra zincirleyebilir veya özelliğini bir dış betik dosyasıyla kullanabilirsinizprimaryScriptUri. Kullanılabilir birçok ücretsiz JSON dize kaçış/manzara kaldırma aracı vardır. Örneğin, https://www.freeformatter.com/json-escape.html.

Özellik değeri ayrıntıları:

  • identity: Betikte Azure'a özgü eylemler gerçekleştirmeniz gerekmediği sürece, dağıtım betiği API'sinin 2020-10-01 veya sonraki bir sürümü için kullanıcı tarafından atanan yönetilen kimlik isteğe bağlıdır. API sürüm 2019-10-01-preview için, dağıtım betiği hizmeti betikleri yürütmek için kullandığından yönetilen kimlik gerekir. Kimlik özelliği belirtildiğinde, betik hizmeti kullanıcı betiğini çağırmadan önce çağırır Connect-AzAccount -Identity . Şu anda yalnızca kullanıcı tarafından atanan yönetilen kimlik desteklenmektedir. Farklı bir kimlikle oturum açmak için betikte Connect-AzAccount çağrısı yapabilirsiniz.

  • tags: Dağıtım betiği etiketleri. Dağıtım betiği hizmeti bir depolama hesabı ve kapsayıcı örneği oluşturursa, etiketler her iki kaynağa da geçirilir ve bunları tanımlamak için kullanılabilir. Bu kaynakları tanımlamanın bir diğer yolu da "azscripts" içeren sonekleri kullanmaktır. Daha fazla bilgi için bkz . Dağıtım betiklerini izleme ve sorunlarını giderme.

  • kind: Betiğin türünü belirtin. Şu anda Azure PowerShell ve Azure CLI betikleri desteklenmektedir. Değerler AzurePowerShell ve AzureCLI'dır.

  • forceUpdateTag: Bu değeri şablon dağıtımları arasında değiştirmek, dağıtım betiğini yeniden yürütmeye zorlar. veya utcNow() işlevlerini kullanırsanıznewGuid(), her iki işlev de yalnızca bir parametre için varsayılan değerde kullanılabilir. Daha fazla bilgi edinmek için bkz . Betiği birden çok kez çalıştırma.

  • containerSettings: Azure Container Instance'ı özelleştirme ayarlarını belirtin. Dağıtım betiği için yeni bir Azure Container Instance gerekir. Mevcut bir Azure Container Instance belirtemezsiniz. Ancak, kullanarak containerGroupNamekapsayıcı grubu adını özelleştirebilirsiniz. Belirtilmezse, grup adı otomatik olarak oluşturulur.

  • storageAccountSettings: Mevcut bir depolama hesabını kullanmak için ayarları belirtin. Belirtilmezse storageAccountName , otomatik olarak bir depolama hesabı oluşturulur. Bkz . Mevcut depolama hesabını kullanma.

  • azPowerShellVersion/azCliVersion: Kullanılacak modül sürümünü belirtin. Desteklenen Azure PowerShell sürümlerinin listesine bakın. Sürüm, hangi kapsayıcı görüntüsünün kullanılacağını belirler:

    • 9'dan büyük veya 9'a eşit az sürümü Ubuntu 22.04 kullanır.
    • 6'dan büyük veya 9'dan küçük az sürümde Ubuntu 20.04 kullanılır.
    • 6'dan küçük Az sürümü Ubuntu 18.04 kullanır.

    Önemli

    Ubuntu 18.04 kullanım ömrünün sonuna yaklaştığından ve 31 Mayıs 2023'ün ötesinde güvenlik güncelleştirmeleri alamayacağından, Ubuntu'nun en son sürümüne yükseltme yapılması önerilir.

    Desteklenen Azure CLI sürümlerinin listesine bakın.

    Önemli

    Dağıtım betiği, Microsoft Container Registry'den (MCR) sağlanan CLI görüntülerini kullanır. Bir CLI görüntüsünün dağıtım betiği için onaylanması genellikle yaklaşık bir ay sürer. 30 gün içinde yayımlanan CLI sürümlerini kullanmayın. Görüntülerin yayın tarihlerini bulmak için bkz . Azure CLI sürüm notları. Desteklenmeyen bir sürüm kullanılırsa, hata iletisi desteklenen sürümleri listeler.

  • arguments: Parametre değerlerini belirtin. Değerler boşluklarla ayrılır.

    Dağıtım Betikleri, CommandLineToArgvW sistem çağrısını çağırarak bağımsız değişkenleri bir dize dizisine böler. Bağımsız değişkenler Azure Container Instance'a bir komut özelliği olarak geçirildiğinden ve komut özelliği bir dize dizisi olduğundan bu adım gereklidir.

    Bağımsız değişkenler kaçış karakterleri içeriyorsa, karakterleri iki kez kaçmak için JsonEscaper kullanın. Özgün kaçış dizenizi aralığa yapıştırın ve kaçış'ı seçin. Araç, çift kaçışlı bir dize verir. Örneğin, önceki örnek şablonda bağımsız değişken şeklindedir -name \"John Dole\". Kaçış dizesi şeklindedir -name \\\"John Dole\\\".

    Nesne türünde bir ARM şablonu parametresini bağımsız değişken olarak geçirmek için, string() işlevini kullanarak nesneyi dizeye dönüştürün ve ardından replace() işlevini kullanarak öğesini \" içine \\\"değiştirin. Örneğin:

    replace(string(parameters('tables')), '\"', '\\\"')
    

    Daha fazla bilgi için örnek şablona bakın.

  • environmentVariables: Betikten geçireceğiniz ortam değişkenlerini belirtin. Daha fazla bilgi için bkz . Dağıtım betikleri geliştirme.

  • scriptContent: Betik içeriğini belirtin. Dış betiği çalıştırmak için bunun yerine kullanın primaryScriptUri . Örnekler için bkz. Satır içi betiği kullanma ve Dış betiği kullanma.

  • primaryScriptUri: Desteklenen dosya uzantılarına sahip birincil dağıtım betiği için genel olarak erişilebilir bir URL belirtin. Daha fazla bilgi için bkz . Dış betikleri kullanma.

  • supportingScriptUris: veya primaryScriptUriiçinde çağrılan destekleyici dosyalar için genel olarak erişilebilir URL'ler scriptContent dizisi belirtin. Daha fazla bilgi için bkz . Dış betikleri kullanma.

  • timeout: ISO 8601 biçiminde belirtilen izin verilen en fazla betik yürütme süresini belirtin. Varsayılan değer P1D'dir.

  • cleanupPreference. Betik yürütmesi terminal durumunda olduğunda iki destekleyici dağıtım kaynağının (depolama hesabı ve kapsayıcı örneği) temizlenmesi tercihini belirtin. Varsayılan ayar Her zaman'dır; bu da terminal durumuna (Başarılı, Başarısız, İptal Edildi) rağmen destekleyici kaynakları silme anlamına gelir. Daha fazla bilgi edinmek için bkz . Dağıtım betiği kaynaklarını temizleme.

  • retentionInterval: Dağıtım betiği yürütmesi terminal durumuna ulaştıktan sonra hizmetin dağıtım betiği kaynağını tutma aralığını belirtin. Bu süre dolduğunda dağıtım betiği kaynağı silinir. Süre, ISO 8601 desenini temel alır. Bekletme aralığı 1 ile 26 saat (PT26H) arasındadır. Bu özellik, OnExpiration olarak ayarlandığında kullanılırcleanupPreference. Daha fazla bilgi edinmek için bkz . Dağıtım betiği kaynaklarını temizleme.

Daha fazla örnek

  • Örnek 1: Bir anahtar kasası oluşturun ve anahtar kasasına sertifika atamak için dağıtım betiğini kullanın.
  • Örnek 2: Abonelik düzeyinde bir kaynak grubu oluşturun, kaynak grubunda bir anahtar kasası oluşturun ve ardından anahtar kasasına sertifika atamak için dağıtım betiğini kullanın.
  • Örnek 3: Kullanıcı tarafından atanan bir yönetilen kimlik oluşturun, katkıda bulunan rolünü kaynak grubu düzeyinde kimliğe atayın, bir anahtar kasası oluşturun ve ardından anahtar kasasına sertifika atamak için dağıtım betiğini kullanın.
  • Örnek 4: Bu, bu listedeki Örnek 1 ile aynı senaryodur. Dağıtım betiğini çalıştırmak için yeni bir kaynak grubu oluşturulur. Bu şablon bir abonelik düzeyi şablonudur.
  • Örnek 5: Örnek 4 ile aynı senaryodur. Bu şablon bir kaynak grubu düzeyi şablonudur.
  • Örnek 6: Kullanıcı tarafından atanan yönetilen kimliği el ile oluşturun ve Microsoft Entra uygulamaları oluşturmak için Microsoft Graph API'sini kullanma izni atayın; ARM şablonunda, bir Microsoft Entra uygulaması ve hizmet sorumlusu oluşturmak için bir dağıtım betiği kullanın ve nesne kimlikleri ile istemci kimliğinin çıktısını alın.

Satır içi betikleri kullanma

Aşağıdaki şablon türüyle Microsoft.Resources/deploymentScripts tanımlanmış bir kaynak içerir. Vurgulanan bölüm satır içi betiktir.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "\\\"John Dole\\\""
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runPowerShellInlineWithOutput",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "scriptContent": "
          param([string] $name)
          $output = \"Hello {0}\" -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "arguments": "[concat('-name', ' ', parameters('name'))]",
        "timeout": "PT1H",
        "cleanupPreference": "OnSuccess",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('runPowerShellInlineWithOutput').outputs.text]",
      "type": "string"
    }
  }
}

Not

Satır içi dağıtım betikleri çift tırnak içine alındığından, dağıtım betiklerinin içindeki dizelerin ters eğik çizgi (\) kullanılarak veya tek tırnak içine alınarak kaçış karakterine sahip olması gerekir. Önceki JSON örneğinde gösterildiği gibi dize değiştirme kullanmayı da düşünebilirsiniz.

Betik bir parametre alır ve parametre değerini verir. DeploymentScriptOutputs çıkışları depolamak için kullanılır. Çıkışlar bölümünde, satır depolanan value değerlere nasıl erişeceklerini gösterir. Write-Output hata ayıklama amacıyla kullanılır. Çıkış dosyasına nasıl erişeceğinizi öğrenmek için bkz . Dağıtım betiklerini izleme ve sorunlarını giderme. Özellik açıklamaları için bkz . Örnek şablonlar.

Betiği çalıştırmak için Cloud Shell'i açmak için Deneyin'i seçin ve ardından aşağıdaki kodu kabuk bölmesine yapıştırın.

$resourceGroupName = Read-Host -Prompt "Enter the name of the resource group to be created"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"

New-AzResourceGroup -Name $resourceGroupName -Location $location

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.json"

Write-Host "Press [ENTER] to continue ..."

Çıktı şuna benzer:

Resource Manager şablonu dağıtım betiği hello world çıktısının ekran görüntüsü.

Dış betikleri kullanma

Satır içi betiklere ek olarak, dış betik dosyalarını da kullanabilirsiniz. Yalnızca ps1 dosya uzantısına sahip birincil PowerShell betikleri desteklenir. CLI betikleri için, betikler geçerli bash betikleri olduğu sürece birincil betikler herhangi bir uzantıya (veya uzantı olmadan) sahip olabilir. Dış betik dosyalarını kullanmak için değerini ile primaryScriptUrideğiştirinscriptContent. Örneğin:

"primaryScriptUri": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/deploymentscript-helloworld.ps1",

Daha fazla bilgi için örnek şablona bakın.

Dış betik dosyalarına erişilebilir olmalıdır. Azure depolama hesaplarında depolanan betik dosyalarınızın güvenliğini sağlamak için bir SAS belirteci oluşturun ve şablonun URI'sine ekleyin. Süre sonu süresini, dağıtımı tamamlamak için yeterli süre tanıyacak şekilde ayarlayın. Daha fazla bilgi için bkz . SAS belirteci ile özel ARM şablonu dağıtma.

Veya dağıtım betiği primaryScriptUri supportingScriptUristarafından başvuruda bulunan betiklerin bütünlüğünü sağlamak sizin sorumluluğundadır. Yalnızca güvendiğiniz betiklere başvurun.

Destekleyici betikleri kullanma

Karmaşık mantıkları bir veya daha fazla destekleyici betik dosyasına ayırabilirsiniz. supportingScriptUris özelliği, gerekirse destekleyici betik dosyalarına bir dizi URI sağlamanıza olanak tanır:

"scriptContent": "
    ...
    ./Create-Cert.ps1
    ...
"

"supportingScriptUris": [
  "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/deployment-script/create-cert.ps1"
],

Destekleyici betik dosyaları hem satır içi betiklerden hem de birincil betik dosyalarından çağrılabilir. Destekleyici betik dosyalarının dosya uzantısı üzerinde hiçbir kısıtlaması yoktur.

Destekleyici dosyalar çalışma zamanında öğesine azscripts/azscriptinput kopyalanır. Satır içi betiklerden ve birincil betik dosyalarından destekleyici dosyalara başvurmak için göreli yolu kullanın.

PowerShell betiklerinden gelen çıkışlarla çalışma

Aşağıdaki şablon, iki deploymentScripts kaynak arasında değerlerin nasıl geçir yapılacağını gösterir:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "name": {
      "type": "string",
      "defaultValue": "John Dole"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate1",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-name', ' ', concat('\\\"', parameters('name'), '\\\"'))]",
        "scriptContent": "
          param([string] $name)
          $output = 'Hello {0}' -f $name
          Write-Output $output
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $output
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    },
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "scriptInTemplate2",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "dependsOn": [
        "scriptInTemplate1"
      ],
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azPowerShellVersion": "8.3",
        "timeout": "PT1H",
        "arguments": "[concat('-textToEcho', ' ', concat('\\\"', reference('scriptInTemplate1').outputs.text, '\\\"'))]",
        "scriptContent": "
          param([string] $textToEcho)
          Write-Output $textToEcho
          $DeploymentScriptOutputs = @{}
          $DeploymentScriptOutputs['text'] = $textToEcho
        ",
        "cleanupPreference": "Always",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('scriptInTemplate2').outputs.text]",
      "type": "string"
    }
  }
}

İlk kaynakta adlı $DeploymentScriptOutputsbir değişken tanımlarsınız ve çıkış değerlerini depolamak için bunu kullanırsınız. Şablondaki başka bir kaynaktan çıkış değerine erişmek için şunu kullanın:

reference('<ResourceName>').outputs.text

CLI betiklerinden gelen çıkışlarla çalışma

CLI/bash, Azure PowerShell dağıtım betiklerinin aksine betik çıkışlarını depolamak için ortak bir değişken sunmaz. Bunun yerine, betik çıkış dosyasının konumunu belirtmek için adlı AZ_SCRIPTS_OUTPUT_PATH bir ortam değişkeni kullanır. Bir ARM şablonu içinde dağıtım betiği yürütürken Bash kabuğu bu ortam değişkenini sizin için otomatik olarak yapılandırıyor. Önceden tanımlanmış değeri /mnt/azscripts/azscriptoutput/scriptoutputs.json olarak ayarlanır. Geçerli bir JSON dizesi nesne yapısına uyum sağlamak için çıkışlar gereklidir. Dosyanın içeriği bir anahtar-değer çifti olarak biçimlendirilmelidir. Örneğin, dize dizisi { "MyResult": [ "foo", "bar"] } olarak kaydedilmelidir. Yalnızca [ "foo", "bar" ] gibi dizi sonuçlarının depolanması geçersiz kabul edilir.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "identity": {
      "type": "string"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "runBashWithOutputs",
      "location": "[resourceGroup().location]",
      "kind": "AzureCLI",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[parameters('identity')]": {
          }
        }
      },
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "AzCliVersion": "2.40.0",
        "timeout": "PT30M",
        "arguments": "'foo' 'bar'",
        "environmentVariables": [
          {
            "name": "UserName",
            "value": "jdole"
          },
          {
            "name": "Password",
            "secureValue": "jDolePassword"
          }
        ],
        "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo \"arg2 is: $2\"; echo \"Username is: $UserName\"; echo \"password is: $Password\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
        "cleanupPreference": "OnExpiration",
        "retentionInterval": "P1D"

jq önceki örnekte kullanılmıştır. Kapsayıcı görüntüleriyle birlikte gelir. Bkz . Geliştirme ortamını yapılandırma.

Mevcut depolama hesabını kullanma

Betik yürütme ve sorun giderme için bir depolama hesabı ve kapsayıcı örneği gerekir. Mevcut bir depolama hesabını belirtme seçenekleriniz vardır, aksi takdirde kapsayıcı örneğiyle birlikte depolama hesabı betik hizmeti tarafından otomatik olarak oluşturulur. Mevcut depolama hesabını kullanma gereksinimleri:

  • Desteklenen depolama hesabı türleri şunlardır:

    SKU Desteklenen Tür
    Premium_LRS FileStorage
    Premium_ZRS FileStorage
    Standard_GRS Depolama, StorageV2
    Standard_GZRS StorageV2
    Standard_LRS Depolama, StorageV2
    Standard_RAGRS Depolama, StorageV2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

    Bu bileşimler dosya paylaşımlarını destekler. Daha fazla bilgi için bkz . Azure dosya paylaşımı oluşturma ve Depolama hesabı türleri.

  • Depolama hesabı güvenlik duvarı kuralları henüz desteklenmiyor. Daha fazla bilgi için bkz. Azure Depolama güvenlik duvarlarını ve sanal ağları yapılandırma.

  • Dağıtım sorumlusunun, dosya paylaşımlarını okuma, oluşturma, silme gibi depolama hesabını yönetme izinleri olmalıdır.

  • allowSharedKeyAccess Depolama hesabının özelliği olarak trueayarlanmalıdır. Azure Container Instance'a (ACI) depolama hesabı bağlamanın tek yolu erişim anahtarı kullanmaktır.

Mevcut bir depolama hesabını belirtmek için aşağıdaki JSON'yi öğesinin Microsoft.Resources/deploymentScriptsözellik öğesine ekleyin:

"storageAccountSettings": {
  "storageAccountName": "myStorageAccount",
  "storageAccountKey": "myKey"
},
  • storageAccountName: depolama hesabının adını belirtin.

  • storageAccountKey: depolama hesabı anahtarlarından birini belirtin. Anahtarı almak için listKeys() işlevini kullanabilirsiniz. Örneğin:

    "storageAccountSettings": {
        "storageAccountName": "[variables('storageAccountName')]",
        "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').keys[0].value]"
    }
    

Eksiksiz Microsoft.Resources/deploymentScripts bir tanım örneği için bkz. Örnek şablonlar.

Mevcut bir depolama hesabı kullanıldığında, betik hizmeti benzersiz bir ada sahip bir dosya paylaşımı oluşturur. Betik hizmetinin dosya paylaşımını nasıl temizlediğini öğrenmek için bkz . Dağıtım betiği kaynaklarını temizleme.

Dağıtım betikleri geliştirme

Sonlandırılmayan hataları işleme

Dağıtım betiğinizdeki değişkeni kullanarak PowerShell'in sonlandırılmayan $ErrorActionPreference hatalara nasıl yanıt vereceğini denetleyebilirsiniz. Değişken dağıtım betiğinizde ayarlı değilse, betik hizmeti varsayılan Continue değerini kullanır.

Betik hizmeti, betik ayarına $ErrorActionPreferencerağmen bir hatayla karşılaştığında kaynak sağlama durumunu Başarısız olarak ayarlar.

Ortam değişkenlerini kullanma

Dağıtım betiği şu ortam değişkenlerini kullanır:

Ortam değişkeni Default value Sistem ayrılmış
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud N
AZ_SCRIPTS_CLEANUP_PREFERENCE OnExpiration N
AZ_SCRIPTS_OUTPUT_PATH <>AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY/<AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME> Y
AZ_SCRIPTS_PATH_INPUT_DIRECTORY /mnt/azscripts/azscriptinput Y
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY /mnt/azscripts/azscriptoutput Y
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME Azure PowerShell: userscript.ps1; Azure CLI: userscript.sh Y
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config Y
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json Y
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME executionresult.json Y
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY /Abonelik/ N

kullanma AZ_SCRIPTS_OUTPUT_PATHhakkında daha fazla bilgi için bkz . CLI betiğinden gelen çıkışlarla çalışma.

Güvenli dizeleri dağıtım betiğine geçirme

Kapsayıcı örneklerinizde ortam değişkenlerini (EnvironmentVariable) ayarlamak, kapsayıcı tarafından çalıştırılan uygulamanın veya betiğin dinamik yapılandırmasını sağlamanıza olanak tanır. Dağıtım betiği, güvenli olmayan ve güvenli olmayan ortam değişkenlerini Azure Container Instance ile aynı şekilde işler. Daha fazla bilgi için bkz . Kapsayıcı örneklerinde ortam değişkenlerini ayarlama. Örnek için bkz . Örnek şablonlar.

Ortam değişkenleri için izin verilen maksimum boyut 64 KB'tır.

Dağıtım betiklerini izleme ve sorunlarını giderme

Betik hizmeti bir depolama hesabı (mevcut bir depolama hesabı belirtmediğiniz sürece) ve betik yürütme için bir kapsayıcı örneği oluşturur. Bu kaynaklar betik hizmeti tarafından otomatik olarak oluşturulursa, her iki kaynak da kaynak adlarında son eke sahiptir azscripts .

Resource Manager şablonu dağıtım betiği kaynak adlarının ekran görüntüsü.

Kullanıcı betiği, yürütme sonuçları ve stdout dosyası depolama hesabının dosya paylaşımlarında depolanır. adlı azscriptsbir klasör var. klasöründe giriş ve çıkış dosyaları için iki klasör daha vardır: azscriptinput ve azscriptoutput.

Çıkış klasörü bir executionresult.json ve betik çıkış dosyasını içerir. betik yürütme hata iletisini executionresult.json görebilirsiniz. Çıkış dosyası yalnızca betik başarıyla yürütülürken oluşturulur. Giriş klasörü bir sistem PowerShell betik dosyası ve kullanıcı dağıtım betik dosyalarını içerir. Kullanıcı dağıtım betiği dosyasını düzeltilmiş bir betikle değiştirebilir ve Azure kapsayıcı örneğinden dağıtım betiğini yeniden çalıştırabilirsiniz.

Azure portal’ı kullanma

Dağıtım betiği kaynağını dağıttığınızda, kaynak Azure portalındaki kaynak grubunun altında listelenir. Aşağıdaki ekran görüntüsünde dağıtım betiği kaynağının Genel Bakış sayfası gösterilmektedir:

Resource Manager şablonu dağıtım betiği portalına genel bakış ekran görüntüsü.

Genel bakış sayfasında kaynağın Sağlama durumu, Depolama hesabı, Kapsayıcı örneği ve Günlükler gibi bazı önemli bilgileri görüntülenir.

Sol menüden dağıtım betiği içeriğini, betike geçirilen bağımsız değişkenleri ve çıkışı görüntüleyebilirsiniz. Ayrıca dağıtım betiği için dağıtım betiği de dahil olmak üzere bir şablonu dışarı aktarabilirsiniz.

PowerShell kullanma

Azure PowerShell'i kullanarak dağıtım betiklerini abonelik veya kaynak grubu kapsamında yönetebilirsiniz:

Çıkış Get-AzDeploymentScript şuna benzer:

Name                : runPowerShellInlineWithOutput
Id                  : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName   : myds0618rg
Location            : centralus
SubscriptionId      : aaaabbbb-0000-cccc-1111-dddd2222eeee
ProvisioningState   : Succeeded
Identity            : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mydentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami
ScriptKind          : AzurePowerShell
AzPowerShellVersion : 9.7
StartTime           : 5/11/2023 7:46:45 PM
EndTime             : 5/11/2023 7:49:45 PM
ExpirationDate      : 5/12/2023 7:49:45 PM
CleanupPreference   : OnSuccess
StorageAccountId    : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0618rg/providers/Microsoft.ContainerInstance/containerGroups/ftnlvo6rlrvo2azscripts
Outputs             :
                      Key                 Value
                      ==================  ==================
                      text                Hello John Dole

RetentionInterval   : P1D
Timeout             : PT1H

Azure CLI kullanma

Azure CLI kullanarak dağıtım betiklerini abonelik veya kaynak grubu kapsamında yönetebilirsiniz:

Liste komutu çıkışı şuna benzer:

[
  {
    "arguments": "'foo' 'bar'",
    "azCliVersion": "2.40.0",
    "cleanupPreference": "OnExpiration",
    "containerSettings": {
      "containerGroupName": null
    },
    "environmentVariables": null,
    "forceUpdateTag": "20231101T163748Z",
    "id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
    "identity": {
      "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
      "type": "userAssigned",
      "userAssignedIdentities": {
        "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
        }
      }
    },
    "kind": "AzureCLI",
    "location": "centralus",
    "name": "runBashWithOutputs",
    "outputs": {
      "Result": [
        {
          "id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mytest/providers/Microsoft.KeyVault/vaults/mykv1027",
          "resourceGroup": "mytest"
        }
      ]
    },
    "primaryScriptUri": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "mytest",
    "retentionInterval": "1 day, 0:00:00",
    "scriptContent": "result=$(az keyvault list); echo \"arg1 is: $1\"; echo $result | jq -c '{Result: map({id: .id})}' > $AZ_SCRIPTS_OUTPUT_PATH",
    "status": {
      "containerInstanceId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/mytest/providers/Microsoft.ContainerInstance/containerGroups/eg6n7wvuyxn7iazscripts",
      "endTime": "2023-11-01T16:39:12.080950+00:00",
      "error": null,
      "expirationTime": "2023-11-02T16:39:12.080950+00:00",
      "startTime": "2023-11-01T16:37:53.139700+00:00",
      "storageAccountId": null
    },
    "storageAccountSettings": {
      "storageAccountKey": null,
      "storageAccountName": "dsfruro267qwb4i"
    },
    "supportingScriptUris": null,
    "systemData": {
      "createdAt": "2023-10-31T19:06:57.060909+00:00",
      "createdBy": "someone@contoso.com",
      "createdByType": "User",
      "lastModifiedAt": "2023-11-01T16:37:51.859570+00:00",
      "lastModifiedBy": "someone@contoso.com",
      "lastModifiedByType": "User"
    },
    "tags": null,
    "timeout": "0:30:00",
    "type": "Microsoft.Resources/deploymentScripts"
  }
]

REST API’yi kullanma

REST API kullanarak kaynak grubu düzeyinde ve abonelik düzeyinde dağıtım betiği kaynak dağıtım bilgilerini alabilirsiniz:

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>?api-version=2020-10-01
/subscriptions/<SubscriptionID>/providers/microsoft.resources/deploymentScripts?api-version=2020-10-01

Aşağıdaki örnekte ARMClient kullanılır:

armclient login
armclient get /subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01

Çıktı şuna benzer olacaktır:

{
  "kind": "AzurePowerShell",
  "identity": {
    "type": "userAssigned",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "userAssignedIdentities": {
      "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
        "principalId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444"
      }
    }
  },
  "location": "centralus",
  "systemData": {
    "createdBy": "someone@contoso.com",
    "createdByType": "User",
    "createdAt": "2023-05-11T02:59:04.7501955Z",
    "lastModifiedBy": "someone@contoso.com",
    "lastModifiedByType": "User",
    "lastModifiedAt": "2023-05-11T02:59:04.7501955Z"
  },
  "properties": {
    "provisioningState": "Succeeded",
    "forceUpdateTag": "20220625T025902Z",
    "azPowerShellVersion": "9.7",
    "scriptContent": "\r\n          param([string] $name)\r\n          $output = \"Hello {0}\" -f $name\r\n          Write-Output $output\r\n          $DeploymentScriptOutputs = @{}\r\n          $DeploymentScriptOutputs['text'] = $output\r\n        ",
    "arguments": "-name \\\"John Dole\\\"",
    "retentionInterval": "P1D",
    "timeout": "PT1H",
    "containerSettings": {},
    "status": {
      "containerInstanceId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
      "storageAccountId": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Storage/storageAccounts/64lxews2qfa5uazscripts",
      "startTime": "2023-05-11T02:59:07.5951401Z",
      "endTime": "2023-05-11T03:00:16.7969234Z",
      "expirationTime": "2023-05-12T03:00:16.7969234Z"
    },
    "outputs": {
      "text": "Hello John Dole"
    },
    "cleanupPreference": "OnSuccess"
  },
  "id": "/subscriptions/aaaabbbb-0000-cccc-1111-dddd2222eeee/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput",
  "type": "Microsoft.Resources/deploymentScripts",
  "name": "runPowerShellInlineWithOutput"
}

Aşağıdaki REST API günlüğü döndürür:

/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/microsoft.resources/deploymentScripts/<DeploymentScriptResourceName>/logs?api-version=2020-10-01

Yalnızca dağıtım betiği kaynakları silinmeden önce çalışır.

Portalda deploymentScripts kaynağını görmek için Gizli türleri göster'i seçin:

Portalda gizli türleri göster seçeneğini içeren Resource Manager şablonu dağıtım betiğinin ekran görüntüsü.

Dağıtım betiği kaynaklarını temizleme

Otomatik olarak oluşturulan iki destekleyici kaynak, silme hataları olmadığı sürece hiçbir zaman kaynaktan deploymentScript daha uzun yaşayamayacaktır. Destekleyici kaynakların yaşam döngüsü özelliği tarafından cleanupPreference denetlenir, kaynağın deploymentScript yaşam döngüsü şu özellik tarafından retentionInterval denetlenir:

  • cleanupPreference: Betik yürütmesi terminal durumuna geldiğinde iki destekleyici kaynağın temizleme tercihini belirtin. Desteklenen değerler şunlardır:

    • Her zaman: Betik yürütme terminal durumuna geçtikten sonra iki destekleyici kaynağı silin. Mevcut bir depolama hesabı kullanılırsa, betik hizmeti hizmet tarafından oluşturulan dosya paylaşımını siler. Destek kaynakları temizlendikten deploymentScripts sonra kaynak hala mevcut olabileceğinden, betik hizmeti betik yürütme sonuçlarını (örneğin, stdout, çıkışlar ve döndürme değeri) kaynaklar silinmeden önce kalıcı hale getirmektedir.

    • OnSuccess: İki destekleyici kaynağı yalnızca betik yürütme başarılı olduğunda silin. Mevcut bir depolama hesabı kullanılıyorsa, betik hizmeti yalnızca betik yürütme başarılı olduğunda dosya paylaşımını kaldırır.

      Betik yürütmesi başarılı olmazsa betik hizmeti, destek kaynaklarını ve ardından dağıtım betiği kaynağını temizlemeden önce süresi dolana kadar retentionInterval bekler.

    • OnExpiration: İki destekleyici kaynağı yalnızca ayarın retentionInterval süresi dolduğunda silin. Mevcut bir depolama hesabı kullanılıyorsa, betik hizmeti dosya paylaşımını kaldırır, ancak depolama hesabını korur.

    Kapsayıcı örneği ve depolama hesabı öğesine cleanupPreferencegöre silinir. Ancak betik başarısız olursa ve cleanupPreference Her Zaman olarak ayarlanmadıysa, dağıtım işlemi kapsayıcıyı otomatik olarak bir saat boyunca veya kapsayıcı temizlenene kadar çalışır durumda tutar. Betiğin sorunlarını gidermek için zamanı kullanabilirsiniz. Başarılı dağıtımlardan sonra kapsayıcıyı çalışır durumda tutmak istiyorsanız betiğinize bir uyku adımı ekleyin. Örneğin, betiğinizin sonuna Start-Sleep ekleyin. Uyku adımını eklemezseniz kapsayıcı terminal durumuna ayarlanır ve henüz silinmemiş olsa bile erişilemiyordur.

  • retentionInterval: Kaynağın deploymentScript tutulacağı ve sonra süresinin dolacağı ve silineceği zaman aralığını belirtin.

Not

Depolama hesabını ve betik hizmeti tarafından oluşturulan kapsayıcı örneğini başka amaçlarla kullanmanız önerilmez. betik yaşam döngüsüne bağlı olarak iki kaynak kaldırılabilir.

Dağıtım betiği CanNotDelete kilidi olan bir kaynak grubuna dağıtılırsa, otomatik olarak oluşturulan depolama hesabı ve kapsayıcı örneği silinemez. Bu sorunu çözmek için dağıtım betiğini kilitsiz başka bir kaynak grubuna dağıtabilirsiniz. Örnek şablonlar'da Örnek 4 ve Örnek 5'e bakın.

Betiği birden çok kez çalıştırma

Dağıtım betiği yürütme, bir kez etkili bir işlemdir. Kaynak özelliklerinden hiçbiri deploymentScripts (satır içi betik dahil) değiştirilmezse, şablonu yeniden dağıttığınızda betik yürütülmüyor. Dağıtım betiği hizmeti, şablondaki kaynak adlarını aynı kaynak grubundaki mevcut kaynaklarla karşılaştırır. Aynı dağıtım betiğini birden çok kez yürütmek istiyorsanız iki seçenek vardır:

  • Kaynağınızın deploymentScripts adını değiştirin. Örneğin, kaynak adı olarak veya kaynak adının bir parçası olarak utcNow şablonu işlevini kullanın. Kaynak adını değiştirmek yeni deploymentScripts bir kaynak oluşturur. Betik yürütme geçmişini tutmak için iyidir.

    Not

    utcNow İşlev yalnızca parametre için varsayılan değerde kullanılabilir.

  • Şablon özelliğinde forceUpdateTag farklı bir değer belirtin. Örneğin, değer olarak kullanın utcNow .

Not

Bir kez etkili olan dağıtım betiklerini yazın. Bu, yeniden yanlışlıkla çalıştırılırsa sistem değişikliklerine neden olmamasını sağlar. Örneğin, dağıtım betiği bir Azure kaynağı oluşturmak için kullanılıyorsa, kaynağı oluşturmadan önce mevcut olmadığını doğrulayın; bu nedenle betik başarılı olur veya kaynağı yeniden oluşturmazsınız.

Geliştirme ortamını yapılandırma

Dağıtım betiği geliştirme ortamınız olarak önceden yapılandırılmış bir kapsayıcı görüntüsü kullanabilirsiniz. Daha fazla bilgi için bkz . Şablonlarda dağıtım betikleri için geliştirme ortamını yapılandırma.

Betik başarıyla test edildikten sonra şablonlarınızda dağıtım betiği olarak kullanabilirsiniz.

Dağıtım betiği hata kodları

Hata kodu Açıklama
DeploymentScriptInvalidOperation Şablondaki dağıtım betiği kaynak tanımı geçersiz özellik adları içeriyor.
DeploymentScriptResourceConflict Belirsiz durumdaki bir dağıtım betiği kaynağı silinemiyor ve yürütme 1 saati aşmadı. Veya aynı dağıtım betiğini aynı kaynak tanımlayıcısıyla (aynı abonelik, kaynak grubu adı ve kaynak adı) ancak aynı anda farklı betik gövdesi içeriğiyle yeniden çalıştıramazsınız.
DeploymentScriptOperationFailed Dağıtım betiği işlemi dahili olarak başarısız oldu. Microsoft desteğine başvurun.
DeploymentScriptStorageAccountAccessKeyNotSpecified Erişim anahtarı mevcut depolama hesabı için belirtilmedi.
DeploymentScriptContainerGroupContainsInvalidContainers Dağıtım betiği hizmeti tarafından oluşturulan bir kapsayıcı grubu dışarıdan değiştirildi ve geçersiz kapsayıcılar eklendi.
DeploymentScriptContainerGroupInNonterminalState İki veya daha fazla dağıtım betiği kaynağı aynı kaynak grubunda aynı Azure kapsayıcı örneği adını kullanır ve bunlardan biri henüz yürütmeyi tamamlamamıştır.
DeploymentScriptStorageAccountInvalidKind BlobBlobStorage veya BlobStorage türünün mevcut depolama hesabı dosya paylaşımlarını desteklemez ve kullanılamaz.
DeploymentScriptStorageAccountInvalidKindAndSku Mevcut depolama hesabı dosya paylaşımlarını desteklemiyor. Desteklenen depolama hesabı türlerinin listesi için bkz . Mevcut depolama hesabını kullanma.
DeploymentScriptStorageAccountNotFound Depolama hesabı yok veya bir dış işlem veya araç tarafından silindi.
DeploymentScriptStorageAccountWithServiceEndpointEnabled Belirtilen depolama hesabının bir hizmet uç noktası var. Hizmet uç noktasına sahip depolama hesabı desteklenmez.
DeploymentScriptStorageAccountInvalidAccessKey Mevcut depolama hesabı için geçersiz erişim anahtarı belirtildi.
DeploymentScriptStorageAccountInvalidAccessKeyFormat Geçersiz depolama hesabı anahtarı biçimi. Bkz. Depolama hesabı erişim anahtarlarını yönetme.
DeploymentScriptExceededMaxAllowedTime Dağıtım betiği yürütme süresi, dağıtım betiği kaynak tanımında belirtilen zaman aşımı değerini aştı.
DeploymentScriptInvalidOutputs Dağıtım betiği çıkışı geçerli bir JSON nesnesi değil.
DeploymentScriptContainerInstancesServiceLoginFailure Kullanıcı tarafından atanan yönetilen kimlik, 1 dakikalık aralıkla 10 denemeden sonra oturum açamadı.
DeploymentScriptContainerGroupNotFound Dağıtım betik hizmeti tarafından oluşturulan kapsayıcı grubu bir dış araç veya işlem tarafından silindi.
DeploymentScriptDownloadFailure Destekleyici betik indirilemedi. Bkz . Destekleyici betiği kullanma.
DeploymentScriptError Kullanıcı betiği hata verdi.
DeploymentScriptBootstrapScriptExecutionFailed Bootstrap betiği hata verdi. Bootstrap betiği, dağıtım betiği yürütmeyi düzenleyen sistem betiğidir.
DeploymentScriptExecutionFailed Dağıtım betiği yürütme sırasında bilinmeyen hata.
DeploymentScriptContainerInstancesServiceUnavailable Azure kapsayıcı örneğini (ACI) oluştururken ACI bir hizmet kullanılamıyor hatası verdi.
DeploymentScriptContainerGroupInNonterminalState Azure kapsayıcı örneğini (ACI) oluştururken, başka bir dağıtım betiği aynı kapsamda aynı ACI adını (aynı abonelik, kaynak grubu adı ve kaynak adı) kullanıyor.
DeploymentScriptContainerGroupNameInvalid Belirtilen Azure kapsayıcı örneği adı (ACI), ACI gereksinimlerini karşılamıyor. Bkz. Azure Container Instances'ta sık karşılaşılan sorunları giderme.

Microsoft Graph'i bir dağıtım betiği içinde kullanma

Bir dağıtım betiği, Microsoft Entra Id'de nesneler oluşturmak ve bunlarla çalışmak için Microsoft Graph'ı kullanabilir.

Komutlar

Azure CLI dağıtım betiklerini kullanırken komut grubu içindeki az ad komutları kullanarak uygulamalar, hizmet sorumluları, gruplar ve kullanıcılarla çalışabilirsiniz. Ayrıca komutunu kullanarak Microsoft Graph API'lerini az rest doğrudan çağırabilirsiniz.

Azure PowerShell dağıtım betiklerini kullandığınızda, doğrudan Microsoft Graph API'lerini çağırmak için cmdlet'ini kullanabilirsiniz Invoke-RestMethod .

İzinler

Dağıtım betiğinizin kullandığı kimliğin, gerçekleştirdiği işlemler için uygun izinlerle Microsoft Graph API'si ile çalışma yetkisine sahip olması gerekir. Kullanıcı tarafından atanan yönetilen kimliği önceden oluşturup Microsoft Graph için bir uygulama rolü atayarak şablon dağıtımınızın dışında kimliği yetkilendirmeniz gerekir. Daha fazla bilgi için bu hızlı başlangıç örneğine bakın.

Özel sanal ağa erişme

Microsoft.Resources/deploymentScripts sürüm 2023-08-01 ile dağıtım betiklerini bazı ek yapılandırmalarla özel ağlarda çalıştırabilirsiniz.

  • Kullanıcı tarafından atanan bir yönetilen kimlik oluşturun ve özelliğinde identity belirtin. Kimliği atamak için bkz . Kimlik.

  • olarak ayarlanmış true bir depolama hesabı oluşturun ve mevcut depolama hesabını allowSharedKeyAccess kullanmak için dağıtım betiğini belirtin. Var olan bir depolama hesabını belirtmek için bkz . Mevcut depolama hesabını kullanma. Depolama hesabı için bazı ek yapılandırmalar gereklidir.

    1. Depolama hesabını Azure portalında açın.

    2. Sol menüden Erişim Denetimi (IAM) öğesini ve ardından Rol atamaları sekmesini seçin.

    3. Storage File Data Privileged Contributor Rolü kullanıcı ataması yönetilen kimliğine ekleyin.

    4. Soldaki menüden Güvenlik + ağ altında Ağ'ı ve ardından Güvenlik duvarları ve sanal ağlar'ı seçin.

    5. Seçili sanal ağlardan ve IP adreslerinden Etkin'i seçin.

      Özel ağa erişmek için depolama hesabını yapılandırma işleminin ekran görüntüsü.

    6. Sanal ağlar'ın altında bir alt ağ ekleyin. Ekran görüntüsünde alt ağa dspvnVnet adı verilir.

    7. Özel Durumlar'ın altında, güvenilen hizmetler listesindeki Azure hizmetlerinin bu depolama hesabına erişmesine izin ver'i seçin.

Aşağıdaki ARM şablonu, bir dağıtım betiği çalıştırmak için ortamı yapılandırmayı gösterir:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string",
      "maxLength": 10
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "userAssignedIdentityName": {
      "type": "string",
      "defaultValue": "[format('{0}Identity', parameters('prefix'))]"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('{0}stg{1}', parameters('prefix'), uniqueString(resourceGroup().id))]"
    },
    "vnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Vnet', parameters('prefix'))]"
    },
    "subnetName": {
      "type": "string",
      "defaultValue": "[format('{0}Subnet', parameters('prefix'))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-09-01",
      "name": "[parameters('vnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "10.0.0.0/16"
          ]
        },
        "enableDdosProtection": false,
        "subnets": [
          {
            "name": "[parameters('subnetName')]",
            "properties": {
              "addressPrefix": "10.0.0.0/24",
              "serviceEndpoints": [
                {
                  "service": "Microsoft.Storage"
                }
              ],
              "delegations": [
                {
                  "name": "Microsoft.ContainerInstance.containerGroups",
                  "properties": {
                    "serviceName": "Microsoft.ContainerInstance/containerGroups"
                  }
                }
              ]
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "networkAcls": {
          "bypass": "AzureServices",
          "virtualNetworkRules": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]",
              "action": "Allow",
              "state": "Succeeded"
            }
          ],
          "defaultAction": "Deny"
        },
        "allowSharedKeyAccess": true
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]"
      ]
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-07-31-preview",
      "name": "[parameters('userAssignedIdentityName')]",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Storage/storageAccounts/{0}', parameters('storageAccountName'))]",
      "name": "[guid(tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')), '2023-07-31-preview').principalId]",
        "roleDefinitionId": "[tenantResourceId('Microsoft.Authorization/roleDefinitions', '69566ab7-960f-475b-8e7c-b3118f30c6bd')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName'))]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName'))]"
      ]
    }
  ]
}

Dağıtımı test etmek için aşağıdaki ARM şablonunu kullanabilirsiniz:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "utcValue": {
      "type": "string",
      "defaultValue": "[utcNow()]"
    },
    "storageAccountName": {
      "type": "string"
    },
    "vnetName": {
      "type": "string"
    },
    "subnetName": {
      "type": "string"
    },
    "userAssignedIdentityName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2023-08-01",
      "name": "[format('{0}DS', parameters('prefix'))]",
      "location": "[parameters('location')]",
      "identity": {
        "type": "userAssigned",
        "userAssignedIdentities": {
          "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('userAssignedIdentityName')))]": {}
        }
      },
      "kind": "AzureCLI",
      "properties": {
        "forceUpdateTag": "[parameters('utcValue')]",
        "azCliVersion": "2.47.0",
        "storageAccountSettings": {
          "storageAccountName": "[parameters('storageAccountName')]"
        },
        "containerSettings": {
          "subnetIds": [
            {
              "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetName'), parameters('subnetName'))]"
            }
          ]
        },
        "scriptContent": "echo \"Hello world!\"",
        "retentionInterval": "P1D",
        "cleanupPreference": "OnExpiration"
      }
    }
  ]
}

Sonraki adımlar

Bu makalede dağıtım betiklerini kullanmayı öğrendiniz. Dağıtım betiği öğreticisinde gezinmek için: