Menggunakan skrip penyebaran dalam templat ARM

Pelajari cara menggunakan skrip penyebaran di templat Azure Resource Manager (ARM). deploymentScripts Dengan sumber daya, pengguna dapat menjalankan skrip dalam penyebaran ARM dan meninjau hasil eksekusi.

Tip

Kami merekomendasikan Bicep karena menawarkan kemampuan yang sama dengan templat ARM dan sintaksnya lebih mudah digunakan. Untuk mempelajari selengkapnya, lihat Skrip penyebaran.

Skrip ini dapat digunakan untuk melakukan langkah-langkah kustom seperti:

  • Menambahkan pengguna ke direktori.
  • Melakukan operasi data plane, misalnya, menyalin blob atau database benih.
  • Mencari dan memvalidasi kunci lisensi.
  • Membuat sertifikat yang ditandatangani sendiri.
  • Buat objek di ID Microsoft Entra.
  • Mencari blok Alamat IP dari sistem kustom.

Manfaat skrip penyebaran:

  • Mudah untuk di-code, gunakan, dan di-debug. Anda dapat mengembangkan skrip penyebaran di lingkungan pengembangan favorit Anda. Skrip dapat di-embed dalam templat atau dalam file skrip eksternal.
  • Anda dapat menentukan bahasa dan platform skrip. Saat ini, skrip penyebaran Azure PowerShell dan Azure CLI di lingkungan Linux didukung.
  • Memungkinkan melewati argumen baris perintah ke skrip.
  • Dapat menentukan output skrip dan meneruskannya kembali ke penyebaran.

Sumber daya skrip penyebaran hanya tersedia di wilayah tempat Instans Kontainer Azure tersedia. Lihat Ketersediaan sumber daya untuk Azure Container Instances di wilayah Azure. Saat ini, skrip penyebaran hanya menggunakan jaringan publik.

Penting

Layanan skrip penyebaran memerlukan dua sumber daya pendukung untuk eksekusi dan pemecahan masalah skrip: akun penyimpanan dan instans kontainer. Anda dapat menentukan akun penyimpanan yang ada, jika tidak, layanan skrip membuatnya untuk Anda. Dua sumber daya pendukung yang dibuat secara otomatis biasanya dihapus oleh layanan skrip saat eksekusi skrip penyebaran masuk dalam status terminal. Anda ditagih untuk sumber daya pendukung hingga dihapus. Untuk informasi harga, lihat Harga Instans Kontainer dan Microsoft Azure Storage. Untuk mempelajari lebih lanjut, lihat Membersihkan sumber daya skrip penyebaran.

Catatan

Coba lagi logika untuk masuk Azure sekarang disertakan ke skrip wrapper. Jika Anda memberikan izin ke templat yang sama dengan skrip penyebaran Anda, layanan skrip penyebaran mencoba masuk kembali selama 10 menit dengan interval 10 detik hingga penetapan peran identitas terkelola berhasil direplikasi.

Sumber daya pelatihan

Jika Anda lebih suka mempelajari tentang skrip penyebaran melalui panduan langkah demi langkah, lihat Memperluas templat ARM dengan menggunakan skrip penyebaran.

Mengonfigurasi izin minimum

Untuk API skrip penyebaran versi 2020-10-01 atau yang lebih baru, ada dua prinsip yang terlibat dalam eksekusi skrip penyebaran:

  • Prinsip penyebaran (prinsip yang digunakan untuk menyebarkan templat): prinsip digunakan untuk membuat sumber daya yang mendasari yang diperlukan agar sumber daya skrip penyebaran dapat dijalankan — akun penyimpanan dan instans kontainer Azure. Untuk mengonfigurasi izin hak istimewa paling sedikit, tetapkan peran kustom dengan properti berikut ke prinsip penyebaran:

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

    Jika Penyimpanan Azure dan penyedia sumber daya Instans Kontainer Azure belum terdaftar, Anda juga perlu menambahkan Microsoft.Storage/register/action dan Microsoft.ContainerInstance/register/action.

  • Prinsip skrip penyebaran: Prinsip ini hanya diperlukan jika skrip penyebaran perlu melakukan autentikasi ke Azure dan memanggil Azure CLI/PowerShell. Ada dua cara untuk menentukan prinsip skrip penyebaran:

    • Tentukan identitas terkelola yang ditetapkan pengguna di properti identity (lihat Contoh templat). Ketika ditentukan, layanan skrip memanggil Connect-AzAccount -Identity sebelum meminta skrip penyebaran. Identitas terkelola harus memiliki akses yang diperlukan untuk menyelesaikan operasi dalam skrip. Saat ini, hanya identitas terkelola yang ditetapkan pengguna yang didukung untuk properti identity. Untuk masuk dengan identitas yang berbeda, gunakan metode kedua dalam daftar ini.
    • Teruskan kredensial perwailan layanan sebagai variabel lingkungan yang aman, dan kemudian dapat menghubungi Connect-AzAccount atau az login dalam skrip penyebaran.

    Jika identitas terkelola digunakan, prinsip penyebaran memerlukan peran Operator Identitas Terkelola (peran bawaan) yang ditetapkan ke sumber daya identitas terkelola.

Contoh templat

JSON berikut adalah contohnya. Untuk informasi selengkapnya, lihat skema templat terbaru.

{
  "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/01234567-89AB-CDEF-0123-456789ABCDEF/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"
  }
}

Catatan

Contoh tersebut adalah untuk tujuan demonstrasi. Properti scriptContent dan primaryScriptUri tidak bisa ada secara bersamaan dalam sebuah templat.

Catatan

scriptContentmemperlihatkan skrip dengan beberapa baris. portal Microsoft Azure dan pipeline Azure DevOps tidak dapat mengurai skrip penyebaran dengan beberapa baris. Anda dapat merantai perintah PowerShell (menggunakan titik koma atau \r\n atau \n) ke dalam satu baris, atau menggunakan properti primaryScriptUri dengan file skrip eksternal. Ada banyak alat escape/ unescape string JSON gratis yang tersedia. Contohnya,https://www.freeformatter.com/json-escape.html.

Detail nilai properti:

  • identity: Untuk deployment script API versi 2020-10-01 atau yang lebih baru, identitas terkelola yang ditetapkan pengguna bersifat opsional kecuali Jika Anda perlu melakukan tindakan khusus Azure dalam skrip. Untuk API versi 2019-10-01-preview, identitas terkelola diperlukan karena layanan skrip penyebaran menggunakannya untuk menjalankan skrip. Ketika properti identitas ditentukan, layanan skrip memanggil Connect-AzAccount -Identity sebelum memanggil skrip pengguna. Saat ini, hanya identitas terkelola yang ditetapkan pengguna yang didukung. Untuk masuk dengan identitas yang berbeda, Anda dapat memanggil Connect-AzAccount dalam skrip.

  • tags: Tag skrip penyebaran. Jika layanan skrip penyebaran menghasilkan akun penyimpanan dan instans kontainer, tag diteruskan ke kedua sumber daya, yang dapat digunakan untuk mengidentifikasinya. Cara lain untuk mengidentifikasi sumber daya ini adalah melalui akhirannya, yang berisi "azscript". Untuk informasi selengkapnya, lihat Memantau dan memecahkan masalah skrip penyebaran.

  • kind: Menentukan jenis skrip. Saat ini, skrip Azure PowerShell dan Azure CLI didukung. Nilainya adalah AzurePowerShell dan AzureCLI.

  • forceUpdateTag: Mengubah nilai ini antara penyebaran template memaksa skrip penyebaran untuk menjalankan kembali. Jika Anda menggunakan fungsi newGuid() atauutcNow(), kedua fungsi hanya dapat digunakan dalam nilai default untuk parameter. Untuk mempelajari lebih lanjut, lihat Menjalankan skrip lebih dari sekali.

  • containerSettings: Tentukan pengaturan untuk menyesuaikan Instans Kontainer Azure. Skrip penerapan memerlukan Instans Kontainer Azure baru. Anda tidak dapat menentukan Instans Kontainer Azure yang sudah ada. Namun, Anda dapat menyesuaikan nama grup kontainer dengan menggunakan containerGroupName. Jika tidak ditentukan, nama grup dibuat secara otomatis.

  • storageAccountSettings: Tentukan pengaturan untuk menggunakan akun penyimpanan yang ada. Jika storageAccountName tidak ditentukan, akun penyimpanan akan dibuat secara otomatis. Lihat Menggunakan akun penyimpanan yang sudah ada.

  • azPowerShellVersion/azCliVersion: Menentukan versi model yang akan digunakan. Lihat daftar versi Azure PowerShell yang didukung. Versi menentukan gambar kontainer mana yang akan digunakan:

    • Versi Az yang lebih besar dari atau sama dengan 9 menggunakan Ubuntu 22.04.
    • Versi Az lebih besar dari atau sama dengan 6 tetapi kurang dari 9 menggunakan Ubuntu 20.04.
    • Versi Az kurang dari 6 menggunakan Ubuntu 18.04.

    Penting

    Dianjurkan untuk meningkatkan ke versi terbaru Ubuntu, karena Ubuntu 18.04 mendekati akhir masa pakainya dan tidak akan lagi menerima pembaruan keamanan melebihi 31 Mei 2023.

    Lihat daftar versi Azure CLI yang didukung.

    Penting

    Skrip penerapan menggunakan gambar CLI yang tersedia dari Microsoft Container Registry (MCR). Biasanya diperlukan waktu sekitar satu bulan untuk mensertifikasi gambar CLI untuk skrip penyebaran. Jangan gunakan versi CLI yang dirilis dalam waktu 30 hari. Untuk menemukan tanggal rilis untuk gambar, lihat Catatan rilis Azure CLI. Jika versi yang tidak didukung digunakan, pesan kesalahan mencantumkan versi yang didukung.

  • arguments: Menentukan nilai parameter. Nilai dipisahkan oleh spasi.

    Deployment Scripts membagi argumen menjadi array string dengan memanggil panggilan sistem CommandLineToArgvW. Langkah ini diperlukan karena argumen diteruskan sebagai properti perintah ke Instans Kontainer Azure, dan properti perintah adalah array string.

    Jika argumen berisi karakter yang lolos, gunakan JsonEscaper untuk lolos dari karakter dua kali. Tempelkan string escaped asli Anda ke dalam alat, lalu pilih Escape. Alat ini mengeluarkan string double escaped. Misalnya, dalam templat sampel sebelumnya, Argumennya adalah -name \"John Dole\". String yang lolos adalah-name \\\"John Dole\\\".

    Untuk meneruskan parameter template ARM dari tipe objek sebagai argumen, konversikan objek menjadi string dengan menggunakan fungsi string(), lalu gunakan fungsi replace() untuk mengganti \" apa pun menjadi \\\". Contohnya:

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

    Untuk informasi selengkapnya, lihat contoh templat.

  • environmentVariables: Tentukan variabel lingkungan untuk meneruskan ke skrip. Untuk informasi selengkapnya, lihat Mengembangkan skrip penyebaran.

  • scriptContent: Menentukan konten skrip. Untuk menjalankan skrip eksternal, gunakan primaryScriptUri sebagai gantinya. Misalnya, lihat Menggunakan skrip sebaris dan Menggunakan skrip eksternal.

  • primaryScriptUri: Tentukan URL yang dapat diakses publik ke skrip penyebaran utama dengan ekstensi file yang didukung. Untuk informasi selengkapnya, lihat Menggunakan skrip eksternal.

  • supportingScriptUris: Tentukan array URL yang dapat diakses publik untuk mendukung file yang dipanggil baik scriptContent atau primaryScriptUri. Untuk informasi selengkapnya, lihat Menggunakan skrip eksternal.

  • timeout: Menentukan waktu eksekusi skrip maksimum yang diizinkan yang ditentukan dalam format ISO 8601. Nilai default adalah P1D.

  • cleanupPreference. Tentukan preferensi membersihkan dua sumber daya penyebaran pendukung, akun penyimpanan dan instans kontainer, saat eksekusi skrip masuk dalam status terminal. Pengaturan default adalah Always, yang berarti menghapus sumber daya pendukung meskipun status terminal (Berhasil, Gagal, Dibatalkan). Untuk mempelajari lebih lanjut, lihat Membersihkan sumber daya skrip penerapan.

  • retentionInterval: Tentukan interval di mana layanan mempertahankan sumber daya skrip penyebaran setelah eksekusi skrip penyebaran mencapai status terminal. Sumber daya skrip penyebaran dihapus ketika durasi ini kedaluwarsa. Durasi didasarkan pada pola ISO 8601 . Interval retensi antara 1 dan 26 jam (PT26H). Properti ini digunakan ketika cleanupPreference diatur ke OnExpiration. Untuk mempelajari lebih lanjut, lihat Membersihkan sumber daya skrip penerapan.

Sampel lainnya

  • Sampel 1: buat brankas kunci dan gunakan skrip penyebaran untuk menetapkan sertifikat ke key vault.
  • Sampel 2: buat grup sumber daya di tingkat langganan, buat brankas kunci di grup sumber daya, lalu gunakan skrip penyebaran untuk menetapkan sertifikat ke key vault.
  • Sampel 3: buat identitas terkelola yang ditetapkan pengguna, tetapkan peran kontributor ke identitas di tingkat grup sumber daya, buat brankas kunci, lalu gunakan skrip penyebaran untuk menetapkan sertifikat ke brankas kunci.
  • Sampel 4: skenarionya sama dengan Sampel 1 dalam daftar ini. Grup sumber daya baru dibuat untuk menjalankan skrip penyebaran. Templat ini adalah templat tingkat langganan.
  • Sampel 5: skenarionya sama dengan Sampel 4. Templat ini merupakan templat tingkat grup sumber daya.
  • Sampel 6: Buat identitas terkelola yang ditetapkan pengguna secara manual dan tetapkan izin untuk menggunakan Microsoft Graph API untuk membuat aplikasi Microsoft Entra; dalam templat ARM, gunakan skrip penyebaran untuk membuat aplikasi Microsoft Entra dan perwakilan layanan, dan menghasilkan ID objek dan ID klien.

Menggunakan skrip sebaris

Templat berikut ini memiliki satu sumber daya yang ditentukan dengan tipe Microsoft.Resources/deploymentScripts tersebut. Bagian yang disorot adalah skrip sebaris.

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

Catatan

Karena skrip penyebaran sebaris diapit dalam tanda kutip ganda, string di dalam skrip penyebaran harus diberi tanda escape menggunakan garis miring terbalik (\) atau diapit dalam tanda kutip tunggal. Anda juga dapat mempertimbangkan menggunakan substitusi string seperti yang ditunjukkan pada sampel JSON sebelumnya.

Skrip mengambil satu parameter, dan output nilai parameter. DeploymentScriptOutputs digunakan untuk menyimpan output. Di bagian output, garis value memperlihatkan cara mengakses nilai yang disimpan. Write-Output digunakan untuk tujuan debugging. Untuk mempelajari cara mengakses file output, lihat Memantau dan memecahkan masalah skrip penyebaran. Untuk deskripsi properti, lihat Contoh templat.

Untuk menjalankan skrip, pilihTry ituntuk membuka Cloud Shell, lalu tempelkan kode berikut ke panel shell.

$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 ..."

Output-nya terlihat seperti:

Cuplikan layar output hello world skrip penyebaran templat Resource Manager.

Menggunakan skrip eksternal

Selain skrip sebaris, Anda juga dapat menggunakan file skrip eksternal. Hanya skrip PowerShell utama dengan ekstensi file ps1 yang didukung. Untuk skrip CLI, skrip utama dapat memiliki ekstensi apa pun (atau tanpa ekstensi), selama skrip adalah skrip bash yang valid. Untuk menggunakan file skrip eksternal, ganti scriptContent dengan primaryScriptUri. Contohnya:

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

Untuk informasi selengkapnya, lihat contoh templat.

Berkas skrip eksternal harus bisa diakses. Untuk mengamankan file skrip Anda yang disimpan di akun penyimpanan Azure, buat token SAS dan sertakan dalam URI untuk templat. Atur waktu kedaluwarsa untuk memungkinkan cukup waktu menyelesaikan penerapan. Untuk informasi selengkapnya, lihat Menggunakan templat ARM pribadi dengan token SAS.

Anda bertanggung jawab untuk memastikan integritas skrip yang dirujuk oleh skrip penyebaran, baik primaryScriptUri atau supportingScriptUris. Hanya rujuk skrip yang Anda percayai.

Gunakan skrip pendukung

Anda dapat memisahkan logika yang rumit menjadi satu atau beberapa file skrip pendukung. Properti supportingScriptUris ini memungkinkan Anda untuk memberikan berbagai URI ke file skrip pendukung jika diperlukan:

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

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

File skrip pendukung dapat dipanggil dari skrip sebaris dan file skrip utama. Mendukung file skrip tidak memiliki batasan pada ekstensi file.

Berkas pendukung disalin ke azscripts/azscriptinput pada waktu proses. Gunakan jalur relatif untuk mereferensikan file pendukung dari skrip sebaris dan file skrip utama.

Bekerja dengan output dari skrip PowerShell

Templat berikut menunjukkan bagaimana melewati nilai antara dua sumber daya deploymentScripts:

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

Di sumber daya pertama, Anda mendefinisikan variabel yang disebut $DeploymentScriptOutputs, dan menggunakannya untuk menyimpan nilai output. Untuk mengakses nilai output dari sumber daya lain dalam templat, gunakan:

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

Bekerja dengan output dari skrip CLI

Berbeda dengan skrip penyebaran Azure PowerShell, CLI/bash tidak mengekspos variabel umum untuk menyimpan output skrip. Sebagai gantinya, ia menggunakan variabel lingkungan bernama AZ_SCRIPTS_OUTPUT_PATH untuk menunjukkan lokasi file output skrip. Saat menjalankan skrip penyebaran dalam templat ARM, shell Bash secara otomatis mengonfigurasi variabel lingkungan ini untuk Anda. Nilai yang telah ditentukan sebelumnya ditetapkan sebagai /mnt/azscripts/azscriptoutput/scriptoutputs.json. Output diperlukan untuk sesuai dengan struktur objek string JSON yang valid. Konten file harus diformat sebagai pasangan kunci-nilai. Misalnya, array string harus disimpan sebagai { "MyResult": [ "foo", "bar"] }. Menyimpan hanya hasil array, seperti [ "foo", "bar" ], dianggap tidak valid.

{
  "$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 digunakan dalam sampel sebelumnya. Disertai dengan gambar kontainer. Lihat Mengonfigurasi lingkungan pengembangan.

Gunakan nama akun penyimpanan yang ada

Akun penyimpanan dan instans kontainer diperlukan untuk eksekusi dan pemecahan masalah skrip. Anda memiliki opsi untuk menentukan akun penyimpanan yang ada, jika tidak, akun penyimpanan bersama dengan instans kontainer secara otomatis dibuat oleh layanan skrip. Persyaratan untuk menggunakan akun penyimpanan yang ada:

  • Jenis akun penyimpanan yang didukung adalah:

    SKU Jenis yang Didukung
    Premium_LRS FileStorage
    Premium_LRS FileStorage
    Standard_GRS Storage, StorageV2
    Standard_GZRS StorageV2
    Standard_LRS Storage, StorageV2
    Standard_RAGRS Storage, StorageV2
    Standard_RAGZRS StorageV2
    Standard_LRS StorageV2

    Kombinasi ini mendukung file share. Untuk informasi selengkapnya, lihat Membuat Azure file share dan Tipe akun penyimpanan.

  • Aturan firewall akun penyimpanan belum didukung. Untuk informasi selengkapnya, lihat Mengonfigurasi firewall Azure Storage dan jaringan virtual.

  • Deployment principal harus memiliki izin untuk mengelola akun penyimpanan, yang mencakup membaca, membuat, menghapus file share.

Untuk menentukan akun penyimpanan yang sudah ada, tambahkan JSON berikut ke elemen properti Microsoft.Resources/deploymentScripts :

"storageAccountSettings": {
  "storageAccountName": "myStorageAccount",
  "storageAccountKey": "myKey"
},
  • storageAccountName: tentukan nama akun penyimpanan.

  • storageAccountKey: tentukan salah satu kunci akun penyimpan. Anda dapat menggunakan listKeys() fungsi untuk mengambil kunci. Contohnya:

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

Lihat Sample templates untuk sampel definisi Microsoft.Resources/deploymentScripts yang lengkap.

Saat akun penyimpanan yang ada digunakan, layanan skrip membuat file share dengan nama yang unik. Lihat Membersihkan sumber daya skrip penyebaran untuk cara layanan skrip membersihkan file share.

Mengembangkan skrip penyebaran

Menangani kesalahan yang tidak menentukan

Anda dapat mengontrol bagaimana PowerShell merespons kesalahan nonterminasi dengan menggunakan $ErrorActionPreference variabel dalam skrip penyebaran Anda. Jika variabel tidak diatur dalam skrip penyebaran Anda, layanan skrip menggunakan nilai default Continue.

Layanan skrip mengatur status penyediaan sumber daya gagal ketika skrip menemui kesalahan terlepas dari pengaturan $ErrorActionPreference.

Menggunakan variabel lingkungan

Skrip penerapan menggunakan variabel lingkungan ini:

Variabel lingkungan Nilai default Cadangan sistem
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_INPUT_DIRECTORY /mnt/azscripts/azscriptinput Y
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME Azure PowerShell: userscript.ps1; Azure CLI: userscript.sh Y
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME primaryscripturi.config Y
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config Y
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.jspada Y
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME executionresult.jspada Y
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY /subscriptions/ N

Untuk informasi selengkapnya tentang menggunakan AZ_SCRIPTS_OUTPUT_PATH, lihat Bekerja dengan output dari skrip CLI.

Berikan string aman ke skrip penyebaran

Mengatur variabel lingkungan (EnvironmentVariable) dalam instans kontainer Anda memungkinkan Anda untuk memberikan konfigurasi dinamis dari aplikasi atau skrip yang dijalankan oleh kontainer. Skrip penyebaran menangani variabel lingkungan yang tidak aman dan aman dengan cara yang sama seperti Azure Container Instance. Untuk informasi selengkapnya, lihat Mengatur variabel lingkungan dalam instans kontainer. Misalnya, lihat Contoh templat.

Ukuran maksimum yang diperbolehkan untuk variabel lingkungan adalah 64 KB.

Memantau dan memecahkan masalah skrip penyebaran

Layanan skrip membuat akun penyimpanan (kecuali Jika Anda menentukan akun penyimpanan yang ada) dan instans kontainer untuk eksekusi skrip. Jika sumber daya ini secara otomatis dibuat oleh layanan skrip, kedua sumber daya memiliki akhiran azscripts dalam nama sumber daya.

Cuplikan layar nama sumber daya skrip penyebaran templat Resource Manager.

Skrip pengguna, hasil eksekusi, dan file stdout disimpan dalam file share akun penyimpanan. Ada folder bernama azscripts. Dalam folder, ada dua folder lagi untuk file input dan output: azscriptinput dan azscriptoutput.

Folder output berisi executionresult.json dan file output skrip. Anda dapat melihat pesan kesalahan eksekusi skrip executionresult.jsdi. Ouput file dibuat hanya ketika skrip berhasil dijalankan. Folder input berisi file skrip PowerShell sistem dan file skrip penerapan pengguna. Anda dapat mengganti file skrip penyebaran pengguna dengan file yang direvisi, dan menjalankan ulang skrip penyebaran dari instans kontainer Azure.

Menggunakan portal Azure

Setelah Anda menerapkan sumber daya skrip penyebaran, sumber daya tercantum di bawah grup sumber daya di portal Microsoft Azure. Screenshot berikut ini memperlihatkan halaman Overview dari sumber daya skrip penyebaran:

Cuplikan layar gambaran umum portal skrip penyebaran templat Resource Manager.

Halaman overview menampilkan beberapa informasi penting tentang sumber daya, seperti status Penyediaan, akun Penyimpanan, instans kontainer, dan Log.

Dari menu sebelah kiri, Anda dapat melihat konten skrip penyebaran, argumen yang diteruskan ke skrip, dan output. Anda juga dapat mengekspor templat untuk skrip penyebaran termasuk skrip penyebaran.

Menggunakan PowerShell

Menggunakan Azure PowerShell, Anda bisa mengelola skrip penyebaran di lingkup langganan atau grup sumber daya:

Output Get-AzDeploymentScript mirip dengan:

Name                : runPowerShellInlineWithOutput
Id                  : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput
ResourceGroupName   : myds0618rg
Location            : centralus
SubscriptionId      : 01234567-89AB-CDEF-0123-456789ABCDEF
ProvisioningState   : Succeeded
Identity            : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/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/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.Storage/storageAccounts/ftnlvo6rlrvo2azscripts
ContainerInstanceId : /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0618rg/providers/Microsoft.ContainerInstance/containerGroups/ftnlvo6rlrvo2azscripts
Outputs             :
                      Key                 Value
                      ==================  ==================
                      text                Hello John Dole

RetentionInterval   : P1D
Timeout             : PT1H

Gunakan Azure CLI

Menggunakan Azure CLI, Anda bisa mengelola skrip penyebaran di lingkup langganan atau grup sumber daya:

Output daftar perintah mirip dengan:

[
  {
    "arguments": "'foo' 'bar'",
    "azCliVersion": "2.40.0",
    "cleanupPreference": "OnExpiration",
    "containerSettings": {
      "containerGroupName": null
    },
    "environmentVariables": null,
    "forceUpdateTag": "20231101T163748Z",
    "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runBashWithOutputs",
    "identity": {
      "tenantId": "01234567-89AB-CDEF-0123-456789ABCDEF",
      "type": "userAssigned",
      "userAssignedIdentities": {
        "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/myidentity/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
          "clientId": "01234567-89AB-CDEF-0123-456789ABCDEF",
          "principalId": "01234567-89AB-CDEF-0123-456789ABCDEF"
        }
      }
    },
    "kind": "AzureCLI",
    "location": "centralus",
    "name": "runBashWithOutputs",
    "outputs": {
      "Result": [
        {
          "id": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/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/01234567-89AB-CDEF-0123-456789ABCDEF/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"
  }
]

Menggunakan REST API

Anda bisa mendapatkan informasi penyebaran sumber daya skrip penyebaran di tingkat grup resource dan tingkat langganan dengan menggunakan REST API:

/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

Contoh berikut menggunakan ARMClient:

armclient login
armclient get /subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/myrg/providers/microsoft.resources/deploymentScripts/myDeployementScript?api-version=2020-10-01

Output mirip dengan:

{
  "kind": "AzurePowerShell",
  "identity": {
    "type": "userAssigned",
    "tenantId": "01234567-89AB-CDEF-0123-456789ABCDEF",
    "userAssignedIdentities": {
      "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myidentity1008rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myuami": {
        "principalId": "01234567-89AB-CDEF-0123-456789ABCDEF",
        "clientId": "01234567-89AB-CDEF-0123-456789ABCDEF"
      }
    }
  },
  "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/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.ContainerInstance/containerGroups/64lxews2qfa5uazscripts",
      "storageAccountId": "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/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/01234567-89AB-CDEF-0123-456789ABCDEF/resourceGroups/myds0624rg/providers/Microsoft.Resources/deploymentScripts/runPowerShellInlineWithOutput",
  "type": "Microsoft.Resources/deploymentScripts",
  "name": "runPowerShellInlineWithOutput"
}

REST API berikut mengembalikan log:

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

Ini hanya berfungsi sebelum sumber daya skrip penyebaran dihapus.

Untuk melihat sumber daya deploymentScripts di portal, pilih Show hidden types:

Cuplikan layar skrip penyebaran templat Resource Manager dengan opsi perlihatkan jenis tersembunyi di portal.

Membersihkan sumber daya skrip penyebaran

Kedua sumber daya pendukung yang dibuat secara otomatis tidak pernah dapat mengulurkan deploymentScript sumber daya, kecuali ada kegagalan menghapusnya. Siklus hidup sumber daya pendukung dikendalikan oleh cleanupPreference properti , siklus hidup sumber daya dikendalikan deploymentScript oleh retentionInterval properti :

  • cleanupPreference: Tentukan preferensi pembersihan dua sumber daya pendukung saat eksekusi skrip masuk dalam status terminal. Nilai yang didukung adalah:

    • Selalu: Hapus dua sumber daya pendukung setelah eksekusi skrip berada dalam status terminal. Jika akun penyimpanan yang ada digunakan, layanan skrip akan menghapus berbagi file yang dibuat oleh layanan. deploymentScripts Karena sumber daya mungkin masih ada setelah sumber daya pendukung dibersihkan, layanan skrip mempertahankan hasil eksekusi skrip, misalnya, stdout, output, dan nilai pengembalian sebelum sumber daya dihapus.

    • OnSuccess: Hapus dua sumber daya pendukung hanya ketika eksekusi skrip berhasil. Jika akun penyimpanan yang ada digunakan, layanan skrip akan menghapus berbagi file hanya saat eksekusi skrip berhasil.

      Jika eksekusi skrip tidak berhasil, layanan skrip menunggu hingga kedaluwarsa retentionInterval sebelum membersihkan sumber daya pendukung lalu sumber daya skrip penyebaran.

    • OnExpiration: Hapus dua sumber daya pendukung hanya saat pengaturan kedaluwarsa retentionInterval . Jika akun penyimpanan yang ada digunakan, layanan skrip akan menghapus berbagi file yang dibuat di akun penyimpanan.

    Instans kontainer dan akun penyimpanan dihapus sesuai dengan cleanupPreference. Namun, jika skrip gagal dan cleanupPreference tidak diatur ke Selalu, proses penyebaran secara otomatis menjaga kontainer tetap berjalan selama satu jam atau sampai kontainer dibersihkan. Anda dapat menggunakan waktu untuk memecahkan masalah skrip. Jika Anda ingin menjaga kontainer tetap berjalan setelah penyebaran berhasil, tambahkan langkah sleep ke skrip Anda. Misalnya, tambahkan Start-Sleep ke akhir skrip Anda. Jika Anda tidak menambahkan langkah sleep, kontainer diatur ke status terminal dan tidak dapat diakses meskipun belum dihapus.

  • retentionInterval: Tentukan interval waktu bahwa deploymentScript sumber daya akan dipertahankan dan setelah itu akan kedaluwarsa dan dihapus.

Catatan

Tidak disarankan untuk menggunakan akun penyimpanan dan instans kontainer yang dihasilkan oleh layanan skrip untuk tujuan lain. Dua sumber daya mungkin dihapus tergantung pada siklus hidup skrip.

Akun penyimpanan dan instans kontainer yang dibuat secara otomatis tidak dapat dihapus jika skrip penyebaran disebarkan ke grup sumber daya dengan kunci CanNotDelete. Untuk mengatasi masalah ini, Anda dapat menyebarkan skrip penyebaran ke grup sumber daya lain tanpa kunci. Lihat Sampel 4 dan Sampel 5 dalam Templat sampel.

Jalankan skrip lebih dari sekali

Eksekusi skrip penyebaran adalah operasi yang tidak didemoten. Jika tidak ada sumber daya properti deploymentScripts (termasuk skrip sebaris) yang diubah, skrip tidak dijalankan saat Anda melakukan redeploy template. Layanan skrip penyebaran membandingkan nama sumber daya dalam templat dengan sumber daya yang ada dalam grup sumber daya yang sama. Ada dua opsi jika Anda ingin menjalankan skrip penyebaran yang sama beberapa kali:

  • Ubah nama sumber daya deploymentScripts Anda. Misalnya, gunakan fungsi template utcNow sebagai nama sumber daya atau sebagai bagian dari nama sumber daya. Mengubah nama sumber daya akan membuat sumber daya deploymentScripts baru. Ini bagus untuk menjaga riwayat eksekusi skrip.

    Catatan

    Fungsi utcNow ini hanya dapat digunakan dalam nilai default untuk parameter.

  • Tentukan nilai yang berbeda dalam properti templat forceUpdateTag. Misalnya, gunakan utcNow sebagai nilai.

Catatan

Tulis skrip penyebaran yang idempotent. Hal ini memastikan ketika menjalankannya lagi secara tidak sengaja, tidak akan menyebabkan perubahan sistem. Misalnya, jika skrip penyebaran digunakan untuk membuat sumber daya Azure, verifikasi sumber daya tidak ada sebelum membuatnya, sehingga skrip akan berhasil atau Anda tidak membuat sumber daya lagi.

Mengonfigurasi lingkungan pengembangan

Anda dapat menggunakan gambar kontainer yang telah dikonfigurasi sebelumnya sebagai lingkungan pengembangan skrip penyebaran Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi lingkungan pengembangan untuk skrip penyebaran dalam templat.

Setelah skrip berhasil diuji, Anda dapat menggunakannya sebagai skrip penyebaran di templat Anda.

Kode kesalahan skrip penyebaran

Kode kesalahan Deskripsi
DeploymentScriptInvalidOperation Definisi sumber daya skrip penyebaran dalam templat berisi nama properti yang tidak valid.
DeploymentScriptResourceConflict Tidak dapat menghapus sumber daya skrip penyebaran yang dalam status nonterminal dan eksekusi belum melebihi 1 jam. Atau tidak dapat menjalankan ulang skrip penyebaran yang sama dengan pengidentifikasi sumber daya yang sama (langganan, nama grup sumber daya, dan nama sumber daya yang sama) tetapi konten isi skrip yang berbeda pada saat yang sama.
DeploymentScriptOperationFailed Operasi skrip penyebaran gagal secara internal. Hubungi dukungan Microsoft.
DeploymentScriptStorageAccountAccessKeyNotSpecified Kunci akses belum ditentukan untuk akun penyimpanan yang ada.
DeploymentScriptContainerGroupContainsInvalidContainers Grup kontainer yang dibuat oleh layanan skrip penyebaran dimodifikasi secara eksternal, dan kontainer yang tidak valid ditambahkan.
DeploymentScriptContainerGroupInNonterminalState Dua atau lebih sumber daya skrip penyebaran menggunakan nama instans kontainer Azure yang sama dalam grup sumber daya yang sama, dan salah satunya belum menyelesaikan eksekusinya.
DeploymentScriptStorageAccountInvalidKind Akun penyimpanan yang ada dari tipe BlobBlobStorage atau BlobStorage tidak mendukung file share, dan tidak dapat digunakan.
DeploymentScriptStorageAccountInvalidKindAndSku Akun penyimpanan yang ada tidak mendukung file share. Untuk daftar jenis akun penyimpanan yang didukung, lihat Menggunakan akun penyimpanan yang sudah ada.
DeploymentScriptStorageAccountNotFound Akun penyimpanan tidak ada atau telah dihapus oleh proses atau alat eksternal.
DeploymentScriptStorageAccountWithServiceEndpointEnabled Akun penyimpanan yang ditentukan memiliki titik akhir layanan. Akun penyimpanan dengan titik akhir layanan tidak didukung.
DeploymentScriptStorageAccountInvalidAccessKey Kunci akses tidak valid yang ditentukan untuk akun penyimpanan yang ada.
DeploymentScriptStorageAccountInvalidAccessKeyFormat Format kunci akun penyimpanan tidak valid. Lihat Mengelola kunci akses akun penyimpanan.
DeploymentScriptExceededMaxAllowedTime Waktu eksekusi skrip penyebaran melebihi nilai batas waktu yang ditentukan dalam definisi sumber daya skrip penyebaran.
DeploymentScriptInvalidOutputs Output skrip penyebaran bukan objek JSON yang valid.
DeploymentScriptContainerInstancesServiceLoginFailure Identitas terkelola yang ditetapkan pengguna tidak dapat masuk setelah 10 upaya dengan interval 1 menit.
DeploymentScriptContainerGroupNotFound Grup Kontainer yang dibuat oleh layanan skrip penyebaran dihapus oleh alat atau proses eksternal.
DeploymentScriptDownloadFailure Gagal mengunduh skrip pendukung. Lihat Menggunakan skrip pendukung.
DeploymentScriptError Skrip pengguna menghasilkan kesalahan.
DeploymentScriptBootstrapScriptExecutionFailed Skrip bootstrap menghasilkan kesalahan. Skrip Bootstrap adalah skrip sistem yang mengatur eksekusi skrip penyebaran.
DeploymentScriptExecutionFailed Kesalahan yang tak diketahui selama eksekusi skrip penyebaran.
DeploymentScriptContainerInstancesServiceUnavailable Saat membuat instans kontainer Azure (ACI), ACI menhasilkan kesalahan layanan yang tidak tersedia.
DeploymentScriptContainerGroupInNonterminalState Saat membuat instans kontainer Azure (ACI), skrip penyebaran lain menggunakan nama ACI yang sama dalam lingkup yang sama (langganan, nama grup sumber daya, dan nama sumber daya yang sama).
DeploymentScriptContainerGroupNameInvalid Nama instans kontainer Azure (ACI) yang ditentukan tidak memenuhi persyaratan ACI. Lihat Memecahkan masalah umum di Azure Container Instances.

Menggunakan Microsoft Graph dalam skrip penyebaran

Skrip penyebaran dapat menggunakan Microsoft Graph untuk membuat dan bekerja dengan objek di ID Microsoft Entra.

Perintah

Saat menggunakan skrip penyebaran Azure CLI, Anda dapat menggunakan perintah dalam az ad grup perintah untuk bekerja dengan aplikasi, perwakilan layanan, grup, dan pengguna. Anda juga dapat langsung memanggil MICROSOFT Graph API dengan menggunakan az rest perintah .

Saat menggunakan skrip penyebaran Azure PowerShell, Anda dapat menggunakan Invoke-RestMethod cmdlet untuk langsung memanggil API Microsoft Graph.

Izin

Identitas yang digunakan skrip penyebaran Anda perlu diotorisasi untuk bekerja dengan Microsoft Graph API, dengan izin yang sesuai untuk operasi yang dilakukannya. Anda harus mengotorisasi identitas di luar penyebaran templat Anda, seperti dengan membuat identitas terkelola yang ditetapkan pengguna sebelumnya dan menetapkan peran aplikasi untuk Microsoft Graph. Untuk informasi selengkapnya, lihat contoh mulai cepat ini.

Mengakses jaringan virtual privat

Dengan Microsoft.Resources/deploymentScripts versi 2023-08-01, Anda dapat menjalankan skrip penyebaran di jaringan privat dengan beberapa konfigurasi tambahan.

  • Buat identitas terkelola yang ditetapkan pengguna, dan tentukan di identity properti . Untuk menetapkan identitas, lihat Identitas.

  • Buat akun penyimpanan dengan allowSharedKeyAccess diatur ke true , dan tentukan skrip penyebaran untuk menggunakan akun penyimpanan yang ada. Untuk menentukan akun penyimpanan yang sudah ada, lihat Menggunakan akun penyimpanan yang sudah ada. Beberapa konfigurasi tambahan diperlukan untuk akun penyimpanan.

    1. Buka akun penyimpanan di portal Azure.

    2. Dari menu sebelah kiri, pilih Kontrol Akses (IAM), lalu pilih tab Penetapan peran.

    3. Storage File Data Privileged Contributor Tambahkan peran ke identitas terkelola penetapan pengguna.

    4. Dari menu sebelah kiri, di bawah Keamanan + jaringan, pilih Jaringan, lalu pilih Firewall dan jaringan virtual.

    5. Pilih Diaktifkan dari jaringan virtual dan alamat IP yang dipilih.

      Cuplikan layar mengonfigurasi akun penyimpanan untuk mengakses jaringan privat.

    6. Di bawah Jaringan virtual, tambahkan subnet. Pada cuplikan layar, subnet disebut dspvnVnet.

    7. Di bawah Pengecualian, pilih Izinkan layanan Azure pada daftar layanan tepercaya untuk mengakses akun penyimpanan ini.

Templat ARM berikut menunjukkan cara mengonfigurasi lingkungan untuk menjalankan skrip penyebaran:

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

Anda dapat menggunakan templat ARM berikut untuk menguji penyebaran:

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

Langkah berikutnya

Dalam artikel ini, Anda telah mempelajari cara menggunakan skrip penyebaran. Untuk menelusuri tutorial skrip penyebaran: