Mempelajari PowerShell Workflow untuk Azure Automation

Runbook di Azure Automation diimplementasikan sebagai alur kerja Windows PowerShell, skrip Windows PowerShell yang menggunakan Windows Workflow Foundation. Alur kerja adalah urutan langkah-langkah terprogram dan terhubung yang menjalankan tugas jangka panjang atau memerlukan koordinasi beberapa langkah di beberapa perangkat atau node terkelola.

Sementara alur kerja ditulis dengan sintaks Windows PowerShell dan diluncurkan oleh Windows PowerShell, alur kerja diproses oleh Windows Workflow Foundation. Manfaat alur kerja melalui skrip normal mencakup performa simultan tindakan terhadap beberapa perangkat dan pemulihan otomatis dari kegagalan.

Catatan

Artikel ini berlaku untuk PowerShell 5.1; PowerShell 7.1 (pratinjau) dan PowerShell 7.2 (pratinjau) tidak mendukung alur kerja. Skrip PowerShell Workflow sangat mirip dengan skrip Windows PowerShell tetapi memiliki beberapa perbedaan signifikan yang dapat membingungkan pengguna baru. Oleh karena itu, sebaiknya Anda menulis runbook menggunakan PowerShell Workflow hanya jika Anda perlu menggunakan titik pemeriksaan.

Untuk detail lengkap tentang topik dalam artikel ini, lihat Memulai dengan Windows PowerShell Workflow.

Menggunakan kata kunci Workflow

Langkah pertama untuk mengonversi skrip PowerShell ke alur kerja PowerShell adalah mengapitnya dengan kata kunci Workflow. Alur kerja dimulai dengan kata kunci Workflow diikuti dengan isi skrip yang diapit oleh tanda kurung. Nama alur kerja mengikuti kata kunci Workflow seperti yang diperlihatkan dalam sintaks berikut:

Workflow Test-Workflow
{
    <Commands>
}

Nama alur kerja harus cocok dengan nama runbook Automation. Jika runbook sedang diimpor, nama file harus sesuai dengan nama alur kerja dan harus berakhir dengan .ps1.

Untuk menambahkan parameter ke alur kerja, gunakan kata kunci Param seperti yang Anda lakukan dalam skrip.

Mempelajari perbedaan antara kode PowerShell Workflow dan kode skrip PowerShell

Kode PowerShell Workflow terlihat hampir identik dengan kode skrip PowerShell kecuali untuk beberapa perubahan signifikan. Bagian berikut ini menjelaskan perubahan yang perlu Anda lakukan pada skrip PowerShell agar dapat berjalan dalam alur kerja.

Aktivitas

Aktivitas adalah tugas tertentu dalam alur kerja yang dilakukan secara berurutan. Windows PowerShell Workflow secara otomatis mengonversi banyak cmdlet Windows PowerShell menjadi aktivitas saat menjalankan alur kerja. Ketika Anda menentukan salah satu cmdlet ini di runbook Anda, aktivitas yang sesuai dijalankan oleh Windows Workflow Foundation.

Jika cmdlet tidak memiliki aktivitas yang sesuai, Windows PowerShell Workflow secara otomatis menjalankan cmdlet dalam aktivitas InlineScript. Beberapa cmdlet dikecualikan dan tidak dapat digunakan dalam alur kerja kecuali Anda secara eksplisit menyertakannya dalam blok InlineScript. Untuk informasi selengkapnya, lihat Menggunakan Aktivitas dalam Script Workflows.

Aktivitas alur kerja berbagi sekumpulan parameter umum untuk mengonfigurasi operasinya. Lihat about_WorkflowCommonParameters.

Parameter Posisi

Anda tidak dapat menggunakan parameter posisi dengan aktivitas dan cmdlet dalam alur kerja. Oleh karena itu, Anda harus menggunakan nama parameter. Pertimbangkan kode berikut yang membuat semua layanan berjalan:

Get-Service | Where-Object {$_.Status -eq "Running"}

Jika Anda mencoba menjalankan kode ini dalam alur kerja, Anda menerima pesan seperti Parameter set cannot be resolved using the specified named parameters. Untuk memperbaiki masalah ini, berikan nama parameter, seperti dalam contoh berikut:

Workflow Get-RunningServices
{
    Get-Service | Where-Object -FilterScript {$_.Status -eq "Running"}
}

Objek yang dideserialisasi

Objek dalam alur kerja dideserialisasi, yang berarti bahwa propertinya masih tersedia, tetapi tidak metodenya. Misalnya, pertimbangkan kode PowerShell berikut, yang menghentikan layanan menggunakan metode Stop dari objek Service.

$Service = Get-Service -Name MyService
$Service.Stop()

Jika Anda mencoba menjalankan ini dalam alur kerja, Anda akan menerima kesalahan yang mengatakan Method invocation is not supported in a Windows PowerShell Workflow.

Salah satu opsinya adalah menggabungkan kedua baris kode ini dalam blok InlineScript. Dalam kasus ini, Service mewakili objek layanan di dalam blok.

Workflow Stop-Service
{
    InlineScript {
        $Service = Get-Service -Name MyService
        $Service.Stop()
    }
}

Pilihan lainnya adalah menggunakan cmdlet lain yang memiliki fungsi yang sama dengan metode, jika tersedia. Dalam contoh kami, cmdlet Stop-Service menyediakan fungsionalitas yang sama dengan metode Stop, dan Anda dapat menggunakan kode berikut untuk alur kerja.

Workflow Stop-MyService
{
    $Service = Get-Service -Name MyService
    Stop-Service -Name $Service.Name
}

Menggunakan InlineScript

Aktivitas InlineScript berguna saat Anda perlu menjalankan satu atau beberapa perintah sebagai skrip PowerShell tradisional bukan alur kerja PowerShell. Saat perintah dalam alur kerja dikirim ke Windows Workflow Foundation untuk diproses, perintah dalam blok InlineScript diproses oleh Windows PowerShell.

InlineScript menggunakan sintaks berikut yang ditunjukkan di bawah ini.

InlineScript
{
    <Script Block>
} <Common Parameters>

Anda dapat mengembalikan output dari InlineScript dengan menetapkan output ke variabel. Contoh berikut menghentikan layanan lalu mengeluarkan nama layanan.

Workflow Stop-MyService
{
    $Output = InlineScript {
        $Service = Get-Service -Name MyService
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Anda dapat meneruskan nilai ke dalam blok InlineScript, tetapi Anda harus menggunakan pengubah cakupan $Using. Contoh berikut identik dengan contoh sebelumnya kecuali bahwa nama layanan disediakan oleh variabel.

Workflow Stop-MyService
{
    $ServiceName = "MyService"

    $Output = InlineScript {
        $Service = Get-Service -Name $Using:ServiceName
        $Service.Stop()
        $Service
    }

    $Output.Name
}

Meskipun aktivitas InlineScript mungkin penting dalam alur kerja tertentu, mereka tidak mendukung konstruksi alur kerja. Anda harus menggunakannya hanya jika diperlukan karena alasan berikut:

  • Anda tidak dapat menggunakan titik pemeriksaan di dalam blok InlineScript. Jika terjadi kegagalan dalam blok, itu harus dilanjutkan dari awal blok.
  • Anda tidak dapat menggunakan eksekusi paralel di dalam blok InlineScript.
  • InlineScript memengaruhi skalabilitas alur kerja karena InlineScript menahan sesi Windows PowerShell untuk seluruh panjang blok InlineScript.

Untuk informasi selengkapnya tentang menggunakan InlineScript, lihat Menjalankan Perintah Windows PowerShell dalam Workflow dan about_InlineScript.

Menggunakan pemrosesan paralel

Salah satu keunggulan Windows PowerShell Workflows adalah kemampuan untuk melakukan serangkaian perintah secara paralel dan bukan secara berurutan seperti pada skrip biasa.

Anda dapat menggunakan kata kunci Parallel untuk membuat blok skrip dengan beberapa perintah yang berjalan bersamaan. Ini menggunakan sintaks berikut yang ditunjukkan di bawah ini. Dalam hal ini, Activity1 dan Activity2 dimulai pada saat yang sama. Activity3 dimulai hanya setelah Activity1 dan Activity2 selesai.

Parallel
{
    <Activity1>
    <Activity2>
}
<Activity3>

Misalnya, pertimbangkan perintah PowerShell berikut yang menyalin beberapa file ke tujuan jaringan. Perintah ini dijalankan secara berurutan sehingga satu file harus selesai disalin sebelum file berikutnya dimulai.

Copy-Item -Path C:\LocalPath\File1.txt -Destination \\NetworkPath\File1.txt
Copy-Item -Path C:\LocalPath\File2.txt -Destination \\NetworkPath\File2.txt
Copy-Item -Path C:\LocalPath\File3.txt -Destination \\NetworkPath\File3.txt

Alur kerja berikut menjalankan perintah yang sama ini secara paralel sehingga semuanya mulai menyalin secara bersamaan. Hanya setelah semuanya disalin adalah pesan penyelesaian yang ditampilkan.

Workflow Copy-Files
{
    Parallel
    {
        Copy-Item -Path "C:\LocalPath\File1.txt" -Destination "\\NetworkPath"
        Copy-Item -Path "C:\LocalPath\File2.txt" -Destination "\\NetworkPath"
        Copy-Item -Path "C:\LocalPath\File3.txt" -Destination "\\NetworkPath"
    }

    Write-Output "Files copied."
}

Anda dapat menggunakan konstruksi ForEach -Parallel untuk memproses perintah untuk setiap item dalam kumpulan secara bersamaan. Item dalam kumpulan diproses secara paralel sementara perintah dalam blok skrip berjalan secara berurutan. Proses ini menggunakan sintaks berikut yang ditunjukkan di bawah ini. Dalam kasus ini, Activity1 dimulai pada saat yang sama untuk semua item dalam kumpulan. Untuk setiap item, Activity2 dimulai setelah Activity1 selesai. Activity3 dimulai hanya setelah Activity1 dan Activity2 selesai untuk semua item. Kami menggunakan parameter ThrottleLimit untuk membatasi paralelisme. Nilai ThrottleLimit yang terlalu tinggi dapat menyebabkan masalah. Nilai ideal untuk parameter ThrottleLimit bergantung pada banyak faktor di lingkungan Anda. Mulailah dengan nilai yang rendah dan coba nilai peningkatan yang berbeda sampai Anda menemukan nilai yang sesuai untuk keadaan spesifik Anda.

ForEach -Parallel -ThrottleLimit 10 ($<item> in $<collection>)
{
    <Activity1>
    <Activity2>
}
<Activity3>

Contoh berikut ini mirip dengan contoh sebelumnya menyalin file secara paralel. Dalam kasus ini, pesan ditampilkan untuk setiap file setelah disalin. Hanya setelah semuanya disalin adalah pesan penyelesaian akhir yang ditampilkan.

Workflow Copy-Files
{
    $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")

    ForEach -Parallel -ThrottleLimit 10 ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\NetworkPath
        Write-Output "$File copied."
    }

    Write-Output "All files copied."
}

Catatan

Kami tidak menyarankan menjalankan runbook turunan secara paralel karena ini telah terbukti memberikan hasil yang tidak dapat diandalkan. Output dari runbook turunan terkadang tidak muncul, dan pengaturan di salah satu runbook turunan dapat memengaruhi runbook turunan paralel lainnya. Variabel seperti VerbosePreference, WarningPreference, dan lainnya mungkin tidak menyebar ke runbook turunan. Dan jika runbook turunan mengubah nilai-nilai ini, mereka mungkin tidak dapat dipulihkan dengan benar setelah pemanggilan.

Menggunakan titik pemeriksaan dalam alur kerja

Titik pemeriksaan adalah rekam jepret dari status alur kerja saat ini yang menyertakan nilai saat ini untuk variabel dan output apa pun yang dihasilkan ke titik tersebut. Jika alur kerja berakhir dengan kesalahan atau ditangguhkan, alur kerja dimulai dari titik pemeriksaan terakhirnya saat berjalan berikutnya, alih-alih dimulai dari awal.

Anda dapat mengatur titik pemeriksaan dalam alur kerja dengan aktivitas Checkpoint-Workflow tersebut. Azure Automation memiliki fitur yang disebut pembagian adil, di mana runbook apa pun yang berjalan selama tiga jam dibongkar untuk memungkinkan runbook lain berjalan. Akhirnya, runbook yang dibongkar dimuat ulang. Saat itu terjadi, itu melanjutkan eksekusi dari titik pemeriksaan terakhir yang diambil di runbook.

Untuk menjamin bahwa runbook akhirnya selesai, Anda harus menambahkan titik pemeriksaan pada interval yang berjalan selama kurang dari tiga jam. Jika selama setiap menjalankan titik pemeriksaan baru ditambahkan, dan jika runbook dikeluarkan setelah tiga jam karena kesalahan, runbook dilanjutkan tanpa batas waktu.

Dalam contoh berikut, pengecualian terjadi setelah Activity2, menyebabkan alur kerja berakhir. Ketika alur kerja dijalankan lagi, alur kerja dimulai dengan menjalankan Activity2, karena aktivitas ini tepat setelah kumpulan titik pemeriksaan terakhir.

<Activity1>
Checkpoint-Workflow
<Activity2>
<Exception>
<Activity3>

Atur titik pemeriksaan dalam alur kerja setelah aktivitas yang mungkin rentan terhadap pengecualian dan tidak boleh diulangi jika alur kerja dilanjutkan. Misalnya, alur kerja Anda mungkin membuat komputer virtual. Anda dapat mengatur titik pemeriksaan baik sebelum dan sesudah perintah untuk membuat komputer virtual. Jika pembuatan gagal, perintah akan diulangi jika alur kerja dimulai lagi. Jika alur kerja gagal setelah pembuatan berhasil, komputer virtual tidak dibuat lagi saat alur kerja dilanjutkan.

Contoh berikut menyalin beberapa file ke lokasi jaringan dan mengatur titik pemeriksaan setelah setiap file. Jika lokasi jaringan hilang, alur kerja berakhir dengan kesalahan. Ketika dimulai lagi, itu dilanjutkan di titik pemeriksaan terakhir. Hanya file yang sudah disalin yang dilewati.

Workflow Copy-Files
{
    $files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")

    ForEach ($File in $Files)
    {
        Copy-Item -Path $File -Destination \\NetworkPath
        Write-Output "$File copied."
        Checkpoint-Workflow
    }

    Write-Output "All files copied."
}

Karena informasi masuk nama pengguna tidak berlanjut setelah Anda memanggil aktivitas Suspend-Workflow atau setelah titik pemeriksaan terakhir, Anda perlu mengatur informasi masuk ke null lalu mengambilnya lagi dari penyimpanan aset setelah Suspend-Workflow atau titik pemeriksaan dipanggil. Jika tidak, Anda mungkin menerima pesan kesalahan berikut: The workflow job cannot be resumed, either because persistence data could not be saved completely, or saved persistence data has been corrupted. You must restart the workflow.

Kode yang sama berikut ini menunjukkan cara menangani situasi ini di runbook PowerShell Workflow Anda.

workflow CreateTestVms
{
    $Cred = Get-AzAutomationCredential -Name "MyCredential"
    $null = Connect-AzAccount -Credential $Cred

    $VmsToCreate = Get-AzAutomationVariable -Name "VmsToCreate"

    foreach ($VmName in $VmsToCreate)
        {
        # Do work first to create the VM (code not shown)

        # Now add the VM
        New-AzVM -VM $Vm -Location "WestUs" -ResourceGroupName "ResourceGroup01"

        # Checkpoint so that VM creation is not repeated if workflow suspends
        $Cred = $null
        Checkpoint-Workflow
        $Cred = Get-AzAutomationCredential -Name "MyCredential"
        $null = Connect-AzAccount -Credential $Cred
        }
}

Catatan

Untuk runbook PowerShell non-grafis, Add-AzAccount dan Add-AzureRMAccount merupakan alias untuk Connect-AzAccount. Anda dapat menggunakan cmdlet ini atau Anda dapat memperbarui modul di akun Automation ke versi terbaru. Anda mungkin perlu memperbarui modul meskipun baru saja membuat akun Automation baru.

Untuk informasi selengkapnya tentang titik pemeriksaan, lihat Menambahkan Titik Pemeriksaan ke Script Workflow.

Langkah berikutnya