Aracılığıyla paylaş


Azure Resource Manager şablonlarında dağıtım betiklerini kullanma

Azure Resource Manager (ARM) şablonlarında dağıtım betiklerini kullanmayı öğrenin. deploymentScripts kaynağıyla, kullanıcılar ARM dağıtımlarında betikleri çalıştırabilir 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 Dağıtım betiği bölümüne bakın.

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.
  • Kendinden imzalı bir sertifika oluşturun.
  • Microsoft Entra Id'de bir nesne oluşturun.
  • Özel sistemden IP adresi bloklarını sorgulayın.

Dağıtım komut dosyasının avantajları:

  • 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ı argümanlarının kod betiğine aktarılmasını sağlayın.
  • Betik çıkışlarını belirtebilir ve bunları dağıtıma geri iletebilir.

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 deployment scripti yalnızca genel ağı kullanıyor.

Dağıtım betiği hizmeti, betikleri çalıştırmak ve sorunlarını gidermek için iki destekleyici kaynak (depolama hesabı ve kapsayıcı örneği) oluşturur. Bu kaynakların adları, dağıtım betiğinin kaynak kimliğinin belirleyici karması kullanılarak oluşturulur ve sonek azscripts eklenir (örneğin, jgczqtxom5oreazscripts). Sonuç olarak, aynı dağıtım betiğinin yinelenen yürütmeleri aynı depolama hesabını yeniden kullanabilir.

Nadir durumlarda, "storage-account-name< adlı >depolama hesabı zaten alınmış" hatasıyla karşılaşabilirsiniz. Bu durum genellikle aynı dağıtım betiğinin önceki bir yürütmesi tarafından oluşturulan bir depolama hesabı başarıyla temizlenmediği zaman oluşur.

Uyarı

Genellikle, dağıtım betiği tamamlandıktan sonra hizmet bu destekleyici kaynakları temizler. Kaldırılana kadar bu kaynaklar için ücret alınır. Fiyatlandırma bilgileri için bkz. Azure Container Instances fiyatlandırması ve Azure Blob 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 dakika boyunca 10 saniye aralıklarla 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

2020-10-01 veya daha yeni sürümlü dağıtım betiği API'si için, betik yürütümünde iki temel unsur yer alır:

  • Dağıtım kimliği (şablonu dağıtmak için kullanılan kimlik): Bu kimlik, dağıtım betiği kaynağının yürütülmesi için gerekli temel kaynakları oluşturmak amacıyla kullanılır: bir depolama hesabı ve bir Azure kapsayıcı örneği. 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/*"
          ],
         "dataActions": [
            "Microsoft.Storage/storageAccounts/fileServices/*"
          ]
        }
      ],
      "assignableScopes": [
        "[subscription().id]"
      ]
    }
    

    Azure Depolama ve Azure Container Instance kaynak sağlayıcıları kaydedilmediyse, Microsoft.Storage/register/action ve Microsoft.ContainerInstance/register/action eklemeniz 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 veya Azure PowerShell'i çağırması 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 Connect-AzAccount -Identity kodunu çalıştırır. Betikteki işlemi tamamlamak için yönetilen kimliğin gerekli erişime sahip olması şarttır. Ş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 komutunu çağırın.

    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": "2023-08-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": "14.0",  // 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. Birçok ücretsiz JSON metni kaçış/kaçıştan çıkarma aracı mevcuttur. Örneğin, https://www.freeformatter.com/json-escape.html.

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

  • identity: API sürümü 2020-10-01 veya daha sonrası olan dağıtım betiği için, betikte Azure'a özgü eylemler gerçekleştirmeniz gerekmediği sürece, yönetilen kimlik, kullanıcı tarafından atanmak üzere isteğe bağlıdır. API sürümü 2019-10-01-preview için, betikleri yürütmek amacıyla dağıtım betiği hizmetinin kullandığı yönetilen bir kimlik gereklidir. 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 Dağıtım betiklerini izleme ve sorunlarını giderme konusuna bakın.

  • kind: Betiğin türünü belirleyin. Ş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 newGuid() işlevlerini kullanırsanızutcNow(), her iki işlev de yalnızca bir parametre için varsayılan değerde kullanılabilir. Daha fazla bilgi için Betik'i birden çok kez çalıştırma bölümüne bakın.

  • 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 -name \"John Dole\"'dir. 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 Ö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 Dağıtım betikleri geliştirme bölümüne bakın.

  • 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 Dış betikleri kullanma bölümüne bakın.

  • supportingScriptUris: scriptContent veya primaryScriptUri içinde çağrılan destekleyici dosyalar için herkese açık URL'ler dizisini belirtin. Daha fazla bilgi için Dış betikleri kullanma bölümüne bakın.

  • 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 durumuna geçtiğinde, iki destekleyici dağıtım kaynağının (depolama hesabı ve kapsayıcı örneği) temizlenmesi tercihinin belirlenmesini sağlayın. 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, cleanupPreference OnExpiration olarak ayarlandığında kullanılır. Daha fazla bilgi edinmek için bkz . Dağıtım betiği kaynaklarını temizleme.

Daha fazla örnek

  • Örnek 1: 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 şablonda türüyle Microsoft.Resources/deploymentScripts tanımlanan bir kaynak vardır:

{
  "$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": "2023-08-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çış karakteri kullanılarak yazılması 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 Dağıtım betiklerini izleyin ve sorunlarını giderin bölümüne bakın. Ö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:

Azure Resource Manager şablonu dağıtım betiği çıktısının ekran görüntüsü, **merhaba dünya**.

Harici komut dosyalarını 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, "scriptContent" öğesini "primaryScriptUri" ile değiştirin. Ö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.

Betik dosyalarının dışarıdan mutlaka erişilebilir olması gerekmektedir. 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. Özel ARM şablonunu SAS belirteci ile dağıtma.

Veya dağıtım betiği primaryScriptUrisupportingScriptUristarafı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 birden 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.

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

PowerShell komut dosyası çıktılarıyla ç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": "2023-08-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": "2023-08-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 diğer kaynaklardan birinin çıkış değerine erişmek için şunu kullanın:

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

CLI betiklerinden gelen çıktı ile çalışmak

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": "2023-08-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"
      }
    }
  ],
  "outputs": {
    "result": {
      "value": "[reference('runBashWithOutputs').outputs]",
      "type": "object"
    }
  }
}

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

Mevcut depolama hesabını kullanma

Betiğin yürütülmesi ve sorun giderilmesi için bir depolama hesabı ve bir kapsayıcı örneği oluşturulması gereklidir. Mevcut bir depolama hesabı belirtebilme seçenekleriniz vardır, aksi takdirde depolama hesabı ve kapsayıcı örneği betik hizmeti tarafından otomatik olarak oluşturulur. Mevcut depolama hesabını kullanma gereksinimleri:

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

    SKU (Stok Kod Birimi) Desteklenen Tip
    Premium_LRS Dosya Depolama
    Premium_ZRS Dosya Depolama
    Standart_GRS Depolama, StorageV2
    Standart_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]"
    }
    

Örnek şablonlar için eksiksiz bir tanım örneğine bakın.

Mevcut bir depolama hesabı kullanıldığında, betik hizmeti benzersiz bir isimle bir dosya paylaşımı oluşturur. Betik hizmetinin dosya paylaşımını nasıl temizlediğini görmek için Dağıtım betiği kaynaklarını temizleme bölümüne bakın.

Dağıtım betikleri geliştirme

Sonlandırılmayan hataları ele alma

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 olarak ayarlar.

Ortam değişkenlerini kullanma

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

Ortam değişkeni Varsayılan değer Sistem ayrılmış
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud N
AZ_SCRIPTS_TEMIZLEME_TERCİHİ 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_BETİKLER_DİZİNİ_KULLANICI_BETİK_DOSYA_ADI Azure PowerShell: userscript.ps1; Azure CLI: userscript.sh Y
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_DESTEKLEYİCİ_SCRIPT_URI_DOSYA_ADI supportingscripturi.config Y
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json Y
AZ_SCRIPTS_YOLU_YÜRÜTME_SONUÇLARI_DOSYA_ADI executionresult.json Y
Kullanıcı Atanan Kimlik - AZ_SCRIPTS_USER_ASSIGNED_IDENTITY /Abonelik/ N

Kullanma AZ_SCRIPTS_OUTPUT_PATH hakkında daha fazla bilgi için bkz: CLI betiğinden gelen çıkışlarla çalışmayı.

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 birini 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 adlarında azscripts son ekine sahiptir.

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 : 14.0
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": "14.0",
    "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ı temizle

Otomatik olarak oluşturulan iki destekleyici kaynak, silme hataları olmadığı sürece deploymentScript kaynaktan 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 sonra deploymentScripts kaynak hala mevcut olabilir. Bu durumda, komut dosyası servisi kaynaklar silinmeden önce betik yürütme sonuçlarını (örneğin, stdout, çıktılar ve dönüş değeri) saklamaktadır.

    • 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 önce retentionInterval süresi dolana kadar bekler, sonra destek kaynaklarını ve dağıtım betiği kaynağını temizler.

    • 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ı, cleanupPreference uyarınca 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ütmek, idempotent 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ıyor. 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 tutmada faydalıdır.

    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

Yinelemeli 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 Şablonlarda dağıtım betikleri için geliştirme ortamını yapılandırma kısmına bakın.

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
DağıtımBetikGeçersizİşlem Şablondaki dağıtım betiği kaynak tanımında geçersiz özellik adları bulunuyor.
Dağıtım Komut Dosyası Kaynak Çatışması 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.
Dağıtım Scripti İşlemi Başarısız Oldu Dağıtım betiği işlemi içsel bir hatadan dolayı başarısız oldu. Microsoft desteğine başvurun.
DağıtımScriptDepolamaHesabıErişimAnahtarıBelirtilmedi Erişim anahtarı mevcut depolama hesabı için belirtilmedi.
DağıtımKomutDosyasıKapsamGrubuGeçersizKaplardanOluşuyor 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.
DağıtımScriptKonteynerGrubuTerminalOlmayanDurumda İ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.
DağıtımSkriptiDepolamaHesabıGeçersizTür BlobBlobStorage veya BlobStorage türünün mevcut depolama hesabı dosya paylaşımlarını desteklemez ve kullanılamaz.
Geçersiz Tür ve Stok Birimi ile Dağıtım Betiği Depolama Hesabı Mevcut depolama hesabı dosya paylaşımlarını desteklemiyor. Desteklenen depolama hesabı türlerinin listesi için bkz . Mevcut depolama hesabını kullanma.
DağıtımKomutDosyasıDepolamaHesabıBulunamadı Depolama hesabı yok veya bir dış işlem veya araç tarafından silindi.
Dağıtım Betiği Hizmet Noktası Etkinleştirilmiş Depolama Hesabı Belirtilen depolama hesabının bir hizmet uç noktası var. Hizmet uç noktasına sahip depolama hesabı desteklenmez.
DağıtımScriptDepolamaHesabıGeçersizErişimAnahtarı Mevcut depolama hesabı için geçersiz erişim anahtarı belirtildi.
DeploymentScriptDepolamaHesabıGeçersizErişimAnahtarıFormatı Geçersiz depolama hesabı anahtarı biçimi. Bkz. Depolama hesabı erişim anahtarlarını yönetme.
Dağıtım ScriptiİzinVerilenMaksimumSüreyiAştı 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ı.
Dağıtım Scripti Geçersiz Çıktılar Dağıtım betiği çıkışı geçerli bir JSON nesnesi değil.
DağıtımScriptContainerInstancesHizmetiGirişHatası Kullanıcı tarafından atanan yönetilen kimlik, 1 dakikalık aralıkla 10 denemeden sonra oturum açamadı.
DağıtımScriptiKapsayıcıGrubuBulunamadı Dağıtım betiği hizmeti tarafından oluşturulan kapsayıcı grubun bir dış araç veya işlem tarafından silindiği belirtilmiştir.
DeploymentScriptDownloadFailure Destekleyici betik indirilemedi. Bkz. Destekleyici betiği kullanma.
DeploymentScriptHatası Kullanıcı betiği hata verdi.
DağıtımScriptÖnyüklemeScriptYürütmeBaşarısız oldu Bootstrap betiği hata verdi. Bootstrap betiği, dağıtım betiği yürütmeyi düzenleyen sistem betiğidir.
DağıtımScriptYürütmeBaşarısız Dağıtım betiği yürütme sırasında bilinmeyen hata.
Dağıtım Komut Dosyası Konteyner Örnekleri Hizmeti Mevcut Değil Azure kapsayıcı örneğini (ACI) oluştururken ACI hizmetin kullanılamaz olduğunu belirtti.
DağıtımScriptKonteynerGrubuTerminalOlmayanDurumda 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.
DağıtımScriptContainerGrupAdıGeçersiz 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. Şablon dağıtımınızın dışında, kullanıcı tarafından atanan yönetilen kimliği önceden oluşturarak ve Microsoft Graph için bir uygulama rolü atayarak kimliği yetkilendirmeniz gerekiyor. 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ış allowSharedKeyAccess bir depolama hesabı oluşturun ve mevcut depolama hesabını true 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": "2025-01-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": "2025-06-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 öğreticisini incelemek için: