Apa itu skrip penyebaran?

Selesai

Di unit ini, Anda akan mempelajari bagaimana sumber daya deploymentScripts dapat memperluas templat Azure Resource Manager (ARM).

Template ARM merupakan hal yang luar biasa. Anda dapat menggunakannya untuk mendeklarasikan kondisi infrastruktur cloud yang diinginkan serta membiarkan API dan layanan mencari tahu cara membawa Anda ke sana. Namun, terkadang Anda perlu melakukan tindakan yang berada di luar apa yang disediakan Azure Resource Manager.

Apa itu skrip penyebaran?

Sumber daya deploymentScripts adalah skrip PowerShell atau Bash yang berjalan dalam kontainer Docker sebagai bagian dari penyebaran template Anda. Gambar kontainer default memiliki Azure CLI atau Microsoft Azure PowerShell yang tersedia. Skrip ini berjalan selama pemrosesan templat ARM, sehingga Anda dapat menambahkan perilaku kustom ke proses penyebaran.

Skrip penyebaran menggunakan identitas terkelola untuk mengautentikasi ke Azure. Identitas terkelola adalah perwakilan layanan yang info masuk dan siklus hidupnya dikelola oleh platform Azure. Identitas ini adalah apa yang akan digunakan oleh perintah Microsoft Azure PowerShell atau Azure CLI untuk bertindak pada lingkungan. Karena Anda menetapkan identitas, Anda mengontrol cakupan pengaruh sumber daya deploymentScripts.

Sumber daya deploymentScripts menghasilkan output yang dapat digunakan oleh sumber daya lain dalam penyebaran. Anda kemudian dapat mencari informasi dari sistem eksternal atau menyediakan data berdasarkan kondisi lingkungan Anda saat ini untuk memengaruhi sisa penyebaran.

Cara kerja skrip penyebaran

Sumber daya deploymentScripts mengambil skrip yang disediakan pengguna (baik dari templat atau oleh URI) dan mungkin beberapa skrip pendukung, serta menjalankannya dalam instans kontainer Azure. Instans kontainer tersebut diberi identitas terkelola yang Anda sediakan. Skrip dan outputnya disimpan dalam berbagi untuk akun penyimpanan Azure.

Saat penyebaran templat berjalan, templat memeriksa jika ada sumber daya deploymentScripts yang ada di grup sumber daya yang ditargetkan. Jika demikian, itu membandingkan properti. Jika semuanya cocok, tidak ada hal baru yang terjadi. Jika sumber daya tidak ada atau telah diubah, Azure Resource Manager membuat instans kontainer baru dan menjalankan skrip penyebaran di dalam instans kontainer tersebut. Output yang ditentukan akan diteruskan kembali ke Azure Resource Manager untuk digunakan nanti dalam penyebaran.

Struktur skrip penyebaran

Untuk menambahkan perilaku kustom ke templat ARM, Anda mulai dengan sumber daya deploymentScripts. Paling minimal, Anda perlu memberikan detail umum seperti:

  • name untuk sumber daya deploymentScripts.
  • Nilai type dan apiVersion.
  • Lokasi (nilai location) di mana sumber daya pendukung akan dibuat.
  • Sebuah objek properties kosong. Anda akan mendapatkannya segera.

Dua nilai spesifik deploymentScripts diperlukan:

  • kind: Jenis skrip yang akan dijalankan (baik AzurePowerShell atau AzureCLI).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      }
    }
    
    resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: 'myFirstDeploymentScript'
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
        }
      }
    }
    
  • identity: Identitas terkelola yang akan digunakan instans kontainer. Anda dapat membuat identitas terkelola sebelumnya dan menentukannya seperti contoh berikut, atau Anda dapat membuatnya di templat dan mereferensikannya di sana (yang akan Anda lakukan di latihan berikutnya).

    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      }
    }
    
    resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
      name: 'myFirstDeploymentScript'
      location: resourceGroup().location
      kind: 'AzurePowerShell'
      identity: {
        type: 'UserAssigned'
        userAssignedIdentities: {
          '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
        }
      }
    }
    

Setelah mengatur elemen tersebut, Anda dapat pindah ke bagian properties sumber daya deploymentScripts. Bagian utama dari ini adalah scriptContent, yang menentukan skrip aktual untuk dijalankan:

"properties": {
  "scriptContent": "
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
  ",
}
properties: {
  scriptContent: '''
    $output = 'Hello Learner!'
    Write-Output $output
    $DeploymentScriptOutputs = @{}
    $DeploymentScriptOutputs['text'] = $output
  '''
}

Perhatikan bahwa scriptContent menggunakan string multibaris. Di Bicep, Anda dapat menentukan string multibaris dengan menggunakan tiga tanda kutip bersama -sama (''') sebelum dan sesudah string Anda.

Umum bagi skrip penyebaran untuk meneruskan output kembali ke penyebaran. Misalnya, jika Anda menggunakan skrip untuk mencari beberapa informasi dari API, Anda dapat meneruskan informasi kembali ke penyebaran sebagai output. Sumber daya lain dalam penyebaran kemudian dapat menggunakan informasi dalam definisi mereka sendiri.

Untuk skrip PowerShell, Anda meneruskan output kembali dengan membuat variabel bernama $DeploymentScriptOutputs, yang perlu menjadi tabel hash. Contoh skrip menginisialisasi tabel hash dan kemudian membuat output yang disebut text, yang mengambil nilainya dari variabel lokal $output:

$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output
$output = 'Hello Learner!'
Write-Output $output
$DeploymentScriptOutputs = @{}
$DeploymentScriptOutputs['text'] = $output

Tip

Anda juga dapat menulis skrip penyebaran di Bash. Untuk membuat output dari skrip Bash, Anda perlu membuat file JSON di lokasi yang ditentukan oleh variabel lingkungan AZ_SCRIPTS_OUTPUT_PATH.

Di dalam bagian properties ini, Anda juga menentukan berbagai opsi yang dapat diambil deploymentScripts. Dalam modul ini, kita akan membuatnya tetap sederhana dan menambahkan cukup guna mendapatkan skrip untuk menjalankan. Paling minimal, Anda perlu menyediakan versi Azure PowerShell atau Azure CLI untuk digunakan, skrip untuk dijalankan, dan interval retensi.

Interval retensi adalah berapa lama hasil harus disimpan jika Anda ingin menyimpan sumber daya. Secara default, hasilnya dihapus setelah Anda menjalankan skrip.

"properties": {
  "azPowerShellVersion": "3.0",
  "scriptContent": "
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
  ",
  "retentionInterval": "P1D"
}
properties: {
  azPowerShellVersion: '3.0'
  scriptContent: '''
    $output = 'Hello Learner!'
    Write-Output $output
    $DeploymentScriptOutputs = @{}
    $DeploymentScriptOutputs['text'] = $output
  '''
  retentionInterval: 'P1D'
}

Templat lengkap kami akan terlihat seperti ini:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.1",
  "apiProfile": "",
  "parameters": {},
  "variables": {},
  "functions": [],
  "resources": [
    {
      "type": "Microsoft.Resources/deploymentScripts",
      "apiVersion": "2020-10-01",
      "name": "myFirstDeploymentScript",
      "location": "[resourceGroup().location]",
      "kind": "AzurePowerShell",
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid": {}
        }
      },
      "properties": {
        "azPowerShellVersion": "3.0",
        "scriptContent": "
            $output = 'Hello Learner!'
            Write-Output $output
            $DeploymentScriptOutputs = @{}
            $DeploymentScriptOutputs['text'] = $output
        ",
        "retentionInterval": "P1D"
      }
    }
  ],
  "outputs": {
    "scriptResult": {
      "type": "string",
      "value": "[reference('myFirstDeploymentScript').outputs.text]"
    }
  }
}
resource myFirstDeploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01' = {
  name: 'myFirstDeploymentScript'
  location: resourceGroup().location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '/subscriptions/01234567-89AB-CDEF-0123-456789ABCDEF/resourcegroups/deploymenttest/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myscriptingid': {}
    }
  }
  properties: {
    azPowerShellVersion: '3.0'
    scriptContent: '''
      $output = 'Hello Learner!'
      Write-Output $output
      $DeploymentScriptOutputs = @{}
      $DeploymentScriptOutputs['text'] = $output
    '''
    retentionInterval: 'P1D'
  }
}

output scriptResult string = myFirstDeploymentScript.properties.outputs.text

Menyertakan file skrip

Menyematkan skrip sebaris dalam templat bisa jadi rumit, sulit dibaca dan dipahami, serta sulit diubah. Bicep menggunakan fungsi loadTextContent() untuk menyematkan file teks eksternal dalam penyebaran Anda. Saat Bicep mentranspilasikan templat Anda ke JSON, Bicep menyematkan file eksternal ke dalam templat yang dipancarkannya.

Misalnya, Anda memiliki file PowerShell bernama myscript.ps1 di folder yang sama dengan templat Bicep Anda. Anda dapat memberi tahu Bicep untuk menyematkan file seperti ini:

properties: {
  azPowerShellVersion: '3.0'
  scriptContent: loadTextContent('myscript.ps1')
  retentionInterval: 'P1D'
}

Anda dapat menemukan semua properti untuk sumber daya deploymentScripts dalam dokumentasi referensi templat ARM.