Apa yang dimaksud dengan skrip penerapan?
Pada unit ini, Anda akan mempelajari bagaimana deploymentScripts sumber daya dapat menyempurnakan 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 yang dimaksud dengan skrip penerapan?
Sumber daya deploymentScripts adalah skrip PowerShell atau Bash yang berjalan dalam kontainer Docker sebagai bagian dari penyebaran template Anda. Citra kontainer default memiliki Azure CLI atau 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 kredensialnya dan siklus hidupnya dikelola oleh platform Azure. Identitas inilah yang digunakan perintah 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 apakah ada sumber daya deploymentScripts yang sudah ada di grup sumber daya yang ditargetkan. Jika demikian, membandingkan properti tersebut. Jika semuanya cocok, tidak ada hal baru yang terjadi. Jika sumber daya tidak ada atau diubah, Azure Resource Manager membuat instans kontainer baru dan menjalankan skrip penyebaran di dalam instans kontainer tersebut. Setiap output yang ditentukan 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:
-
nameuntuk sumber dayadeploymentScripts. - Nilai
typedanapiVersion. - Lokasi (
locationnilai) tempat sumber daya pendukung dibuat. - Sebuah objek
propertieskosong. Anda akan segera mengerjakan itu.
Dua nilai spesifik deploymentScripts diperlukan:
kind: Jenis skrip yang akan dijalankan (baikAzurePowerShellatauAzureCLI).{ "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 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 merupakan apa yang 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 properties bagian 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 mengirimkan hasil 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
Petunjuk / Saran
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 membuatnya sederhana dan hanya menambahkan secukupnya agar skrip dapat dijalankan. 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 berkas teks eksternal ke dalam penerapan 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.