تعرف على سير عمل PowerShell لأتمتة Azure

يتم تنفيذ كتب التشغيل في Azure Automation كمهام سير عمل Windows PowerShell، ونصوص Windows PowerShell النصية التي تستخدم Windows Workflow Foundation. سير العمل هو سلسلة من الخطوات المبرمجة والمتصلة التي تشغل مهام طويلة الأمد أو تعيّن تنسيق خطوات متعددة عبر أجهزة متعددة أو عقد مدارة.

في أثناء كتابة سير العمل باستخدام نافذة بناء الجملة PowerShell وتشغيله بواسطة نافذة PowerShell، تتم معالجته بواسطة Windows Workflow Foundation. تتضمن مزايا سير العمل على برنامج نصي عادي الأداء المتزامن لإجراء ما ضد أجهزة متعددة والاسترداد التلقائي من حالات الفشل.

إشعار

تنطبق هذه المقالة على PowerShell 5.1؛ لا يدعم PowerShell 7.1 (معاينة) وPowerShell 7.2 (معاينة) مهام سير العمل. البرنامج النصي PowerShell Workflow يشبه إلى حد بعيد برنامج Windows PowerShell النصي ولكن به بعض الاختلافات المهمة التي يمكن أن تكون مربكة للمستخدم الجديد. لذلك، نوصي بكتابة دفاتر التشغيل الخاصة بك باستخدام PowerShell Workflow فقط إذا كنت بحاجة إلى استخدام نقاط التحقق.

للحصول على التفاصيل الكاملة للمواضيع الواردة في هذه المقالة، راجع بدء استخدام Windows PowerShell Workflow.

استخدام كلمة سير العمل الأساسية

الخطوة الأولى لتحويل برنامج نصي PowerShell إلى سير عمل PowerShell هي إحاطته بالكلمة Workflow الأساسية. يبدأ سير العمل بالكلمة Workflow الأساسية متبوعة بالنص الأساسي للبرنامج النصي المضمن في أقواس. يتبع Workflow اسم سير العمل الكلمة الأساسية كما هو موضح في بناء الجملة التالي:

Workflow Test-Workflow
{
    <Commands>
}

يجب أن يتطابق اسم سير العمل مع اسم دفتر التشغيل الآلي. إذا كان يتم استيراد دفتر التشغيل، فيجب أن يتطابق اسم الملف مع اسم سير العمل ويجب أن ينتهي ب .ps1.

لإضافة معلمات إلى سير العمل، استخدم Param الكلمة الأساسية تماما كما تفعل في البرنامج النصي.

تعرف على الاختلافات بين تعليمة برمجية PowerShell Workflow وPowerShell النصي

يبدو رمز PowerShell Workflow متطابقًا تقريبًا مع التعليمات البرمجية النصية لـ PowerShell باستثناء بعض التغييرات المهمة. تصف الأقسام التالية التغييرات التي تحتاج إلى إجرائها على برنامج PowerShell النصي ليتم تشغيله في سير عمل.

الأنشطة

النشاط هو مهمة محددة في سير العمل يتم تنفيذها في تسلسل. يقوم Windows PowerShell Workflow تلقائيًا بتحويل العديد من أوامر cmdlets الخاصة بـ Windows PowerShell إلى أنشطة عند تشغيله لسير عمل. عند تحديد أحد أوامر cmdlets هذه في دفتر التشغيل الخاص بك، يتم تشغيل النشاط المقابل بواسطة Windows Workflow Foundation.

إذا لم يكن ل cmdlet أي نشاط مطابق، يقوم Windows PowerShell Workflow تلقائيا بتشغيل cmdlet في نشاط InlineScript . يتم استبعاد بعض أوامر cmdlets ولا يمكن استخدامها في سير عمل إلا إذا قمت بتضمينها بشكل صريح في كتلة InlineScript. لمزيد من المعلومات، راجع استخدام الأنشطة في مهام سير عمل البرنامج النصي.

تشترك أنشطة سير العمل في مجموعة من المعلمات العامة لتكوين عملياتها. راجع about_WorkflowCommonParameters.

المعلمات الموضعية

لا يمكنك استخدام المعلمات الموضعية مع الأنشطة وأوامر cmdlets في سير العمل. لذلك، يجب عليك استخدام أسماء المعلمات. ضع في اعتبارك تعليمة برمجية التالي الذي يحصل على جميع الخدمات قيد التشغيل:

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

إذا حاولت تشغيل هذه التعليمة البرمجية في سير عمل، فستتلقى رسالة مثل Parameter set cannot be resolved using the specified named parameters. لتصحيح هذه المشكلة، قم بتوفير اسم المعلمة، كما في المثال التالي:

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

عناصر ملغاة التسلسل

يتم إلغاء تسلسل العناصر الموجودة في مهام سير العمل، ما يعني أن خصائصها لا تزال متاحة، ولكن ليس أسلوبها. على سبيل المثال، ضع في اعتبارك التعليمات البرمجية PowerShell التالية، التي توقف خدمة باستخدام Stop أسلوب Service الكائن.

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

إذا حاولت تشغيل هذا في سير عمل، فستتلقى خطأ يقول Method invocation is not supported in a Windows PowerShell Workflow.

أحد الخيارات هو تضمين هذين الخطين من التعليمات البرمجية في كتلة InlineScript . في هذه الحالة، Service يمثل كائن خدمة داخل الكتلة.

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

خيار آخر هو استخدام cmdlet آخر له نفس وظائف الطريقة، إذا كان أحدها متاحًا. في مثالنا، Stop-Service يوفر cmdlet نفس وظيفة Stop الأسلوب، وقد تستخدم التعليمات البرمجية التالية لسير عمل.

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

استخدم InlineScript

InlineScript يكون النشاط مفيدا عندما تحتاج إلى تشغيل أمر واحد أو أكثر كبرنامج نصي PowerShell تقليدي بدلا من سير عمل PowerShell. في أثناء إرسال الأوامر في سير العمل إلى Windows Workflow Foundation للمعالجة، تتم معالجة الأوامر الموجودة في كتلة InlineScript بواسطة Windows PowerShell.

يستخدم InlineScript الصيغة التالية الموضحة أدناه.

InlineScript
{
    <Script Block>
} <Common Parameters>

يمكنك إرجاع الإخراج من InlineScript عن طريق تعيين الإخراج إلى متغير. يقوم المثال التالي بإيقاف إحدى الخدمات ثم إخراج اسم الخدمة.

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

    $Output.Name
}

يمكنك تمرير القيم إلى كتلة InlineScript، ولكن يجب استخدام معدل نطاق $Using . المثال التالي مطابق للمثال السابق فيما عدا أن اسم الخدمة يتم توفيره بواسطة متغير.

Workflow Stop-MyService
{
    $ServiceName = "MyService"

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

    $Output.Name
}

بينما قد تكون أنشطة InlineScript مهمة في مهام سير عمل معينة، فإنها لا تدعم بنيات سير العمل. يجب عليك استخدامها فقط عند الضرورة للأسباب التالية:

  • لا يمكنك استخدام نقاط التحقق داخل كتلة InlineScript. في حالة حدوث فشل داخل الكتلة، يجب أن تستأنف من بداية الكتلة.
  • لا يمكنك استخدام التنفيذ المتوازي داخل كتلة InlineScript.
  • يؤثر InlineScript على قابلية التوسع في سير العمل نظرًا إلى أنه يحتفظ بجلسة Windows PowerShell لكامل طول كتلة InlineScript.

لمزيد من المعلومات حول استخدام InlineScript، راجع تشغيل أوامر Windows PowerShell في سير العمل about_InlineScript.

استخدم المعالجة المتوازية

تتمثل إحدى ميزات سير عمل Windows PowerShell في القدرة على تنفيذ مجموعة من الأوامر بشكل متوازٍ بدلاً من تنفيذ تسلسلي كما هو الحال مع برنامج نصي نموذجي.

يمكنك استخدام Parallel الكلمة الأساسية لإنشاء كتلة برنامج نصي مع أوامر متعددة تعمل بشكل متزامن. يستخدم هذا النحو التالي الموضح أدناه. في هذه الحالة، يبدأ Activity1 و Activity2 في نفس الوقت. يبدأ النشاط 3 فقط بعد اكتمال كل من النشاط 1 والنشاط 2.

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

على سبيل المثال، ضع في اعتبارك أوامر PowerShell التالية التي تنسخ ملفات متعددة إلى وجهة الشبكة. يتم تشغيل هذه الأوامر بالتتابع بحيث يجب أن ينتهي ملف واحد من النسخ قبل بدء تشغيل الملف التالي.

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

يقوم سير العمل التالي بتشغيل نفس هذه الأوامر بالتوازي بحيث تبدأ جميعًا في النسخ في الوقت ذاته. يتم عرض رسالة الإكمال فقط بعد نسخها جميعًا.

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

يمكنك استخدام ForEach -Parallel البناء لمعالجة الأوامر لكل عنصر في مجموعة في وقت واحد. تتم معالجة العناصر الموجودة في المجموعة بالتوازي بينما تعمل الأوامر الموجودة في كتلة البرنامج النصي بالتتابع. تستخدم هذه العملية بناء الجملة التالي للموضح أدناه. في هذه الحالة، يبدأ النشاط 1 في نفس الوقت لجميع العناصر في المجموعة. لكل عنصر، يبدأ النشاط 2 بعد اكتمال النشاط 1. يبدأ النشاط 3 فقط بعد اكتمال كل من النشاط 1 والنشاط 2 لجميع العناصر. نستخدم المعلمة ThrottleLimit للحد من التوازي. يمكن أن يتسبب ارتفاع كبير جدا في ThrottleLimit حدوث مشاكل. تعتمد القيمة المثالية للمعلمة ThrottleLimit على العديد من العوامل في بيئتك. ابدأ بقيمة منخفضة وجرب قيمًا متزايدة مختلفة حتى تجد قيمة تناسب ظروفك الخاصة.

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

المثال التالي مشابه للمثال السابق الذي ينسخ الملفات بالتوازي. في هذه الحالة، يتم عرض رسالة لكل ملف بعد نسخه. يتم عرض رسالة الإكمال النهائية فقط بعد نسخها جميعًا.

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

إشعار

لا نوصي بتشغيل تابع دفاتر التشغيل بالتوازي حيث ثبت أن هذا يعطي نتائج غير موثوق بها. في بعض الأحيان، لا يظهر الإخراج من دفتر التشغيل التابع، ويمكن أن تؤثر الإعدادات في دفتر التشغيل التابع على كتيبات التشغيل الفرعية الأخرى المتوازية. قد لا يتم نشر متغيرات مثل VerbosePreferenceو WarningPreferenceوغيرها إلى دفاتر التشغيل الفرعية. وإذا قام دفتر التشغيل التابع بتغيير هذه القيم، فقد لا تتم استعادتها بشكل صحيح بعد الاستدعاء.

استخدم نقاط التحقق في سير العمل

نقطة التحقق هي لقطة للحالة الحالية لسير العمل التي تتضمن القيم الحالية للمتغيرات وأي مخرجات تم إنشاؤها لتلك النقطة. إذا انتهى سير العمل بالخطأ أو تم تعليقه، فإنه يبدأ من آخر نقطة اختبار له في المرة التالية التي يتم تشغيله فيها، بدلاً من البدء من البداية.

يمكنك تعيين نقطة تحقق في سير عمل مع Checkpoint-Workflow النشاط. يحتوي Azure Automation على ميزة تسمى مشاركة عادلة، حيث يتم إلغاء تحميل أي دفتر تشغيل يعمل لمدة ثلاث ساعات للسماح بتشغيل دفاتر التشغيل الأخرى. في النهاية، تتم إعادة تحميل دفتر التشغيل الذي تم تفريغه. عندما يكون كذلك، فإنه يستأنف التنفيذ من آخر نقطة تفتيش مأخوذة في دفتر التشغيل.

لضمان اكتمال سجل التشغيل في النهاية، يجب إضافة نقاط تحقق على فواصل زمنية تعمل لمدة تقل عن ثلاث ساعات. إذا تمت إضافة نقطة فحص جديدة خلال كل عملية تشغيل، وإذا تم طرد دفتر التشغيل بعد ثلاث ساعات بسبب خطأ، فسيتم استئناف كتاب التشغيل إلى أجل غير مسمى.

في المثال التالي، يحدث استثناء بعد Activity2، ما يؤدي إلى إنهاء سير العمل. عند تشغيل سير العمل مرة أخرى، يبدأ بتشغيل Activity2، حيث إن هذا النشاط كان بعد تعيين نقطة التحقق الأخيرة.

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

قم بتعيين نقاط التحقق في سير العمل بعد الأنشطة التي قد تكون عرضة للاستثناء ويجب عدم تكرارها إذا تم استئناف سير العمل. على سبيل المثال، قد يُنشئ سير عملك جهازًا ظاهرياً. يمكنك تعيين نقطة فحص قبل وبعد الأوامر لإنشاء الجهاز الظاهري. إذا فشل الإنشاء، يتم تكرار الأوامر إذا تم بدء سير العمل مرة أخرى. إذا فشل سير العمل بعد نجاح الإنشاء، فلن يتم إنشاء الجهاز الظاهري مرة أخرى عند استئناف سير العمل.

المثال التالي ينسخ ملفات متعددة إلى موقع شبكة ويعين نقطة تحقق بعد كل ملف. إذا تم فقد موقع الشبكة، فسينتهي سير العمل بالخطأ. عندما يتم تشغيله مرة أخرى، فإنه يستأنف عند آخر نقطة تفتيش. يتم تخطي الملفات التي تم نسخها بالفعل فقط.

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

نظرا لعدم استمرار بيانات اعتماد اسم المستخدم بعد استدعاء نشاط Suspend-Workflow أو بعد نقطة التحقق الأخيرة، تحتاج إلى تعيين بيانات الاعتماد إلى فارغة ثم استردادها مرة أخرى من مخزن الأصول بعد Suspend-Workflow استدعاء نقطة التحقق أو . وإلا، فقد تتلقى رسالة الخطأ التالية: 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.

يوضح التالي نفس تعليمة برمجة كيفية التعامل مع هذا الموقف في PowerShell Workflow كتب التشغيل.

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
        }
}

إشعار

بالنسبة إلى كتب تشغيل PowerShell غير الرسومية، Add-AzAccountوAdd-AzureRMAccount اسم مستعار لـ Connect-AzAccount. يمكنك استخدام cmdlets هذه أو يمكنك تحديث الوحدات النمطية في حساب التنفيذ التلقائي الخاص بك إلى أحدث الإصدارات. قد تحتاج إلى تحديث الوحدات النمطية الخاصة بك حتى إذا قمت بإنشاء حساب تنفيذ تلقائي جديد.

لمزيد من المعلومات حول نقاط التحقق، راجع إضافة نقاط التحقق إلى سير عمل البرنامج النصي.

الخطوات التالية