مشاركة عبر


تبديل السياق في Azure Automation

تبديل السياق هو عندما يغير السياق في عملية واحدة السياق في عملية مختلفة. سياق Azure هو مجموعة من المعلومات التي تُعرّف هدف Azure PowerShell cmdlets. يتكون السياق من الخصائص التالية:

الخاصية الوصف
الاسم اسم السياق.
العميل اسم المستخدم أو كيان الخدمة المستخدم لمصادقة الاتصالات مع Azure.
البيئة يمثل Azure العالمية أو إحدى خدمات Azure السحابية المحلية، مثل Azure Government. يمكنك أيضًا تحديد نظام أساسي سحابي مختلط، مثل Azure Stack.
الاشتراك يمثل اشتراك Azure الذي يحتوي على الموارد التي تريد إدارتها.
المستأجر مثيل مخصص وموثوق به لمعرف Microsoft Entra الذي يمثل مؤسسة واحدة.
بيانات الاعتماد المعلومات التي تستخدمها Azure للتحقق من هويتك وتأكيد التخويل الخاص بك للوصول إلى الموارد في Azure.

عند تسجيل دخول حساب يمكنه الوصول إلى العديد من الاشتراكات، قد تتم إضافة أي من هذه الاشتراكات إلى سياق المستخدم. لضمان الاشتراك الصحيح، يجب الإعلان عنه عند الاتصال. على سبيل المثال، استخدم Add-AzAccount -Credential $Cred -subscription 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'. ومع ذلك، قد تنشأ مشكلات عند تشغيل دفاتر التشغيل التي تدير اشتراكًا واحدًا في نفس عملية بيئة الاختبار المعزولة مثل دفاتر التشغيل الأخرى التي تدير الموارد في اشتراك آخر من نفس حساب Automation. يمكن أن تؤثر التغييرات التي يتم إجراؤها على السياق بواسطة دفتر تشغيل واحد على دفاتر التشغيل الأخرى باستخدام السياق الافتراضي. بما أن السياق يتضمن معلومات، مثل بيانات الاعتماد التي يجب استخدامها والاشتراك الذي يجب استهدافه، يمكن أن تستهدف cmdlets الاشتراك الخاطئ الناتج عن not found أو أخطاء الأذونات. تُعرف هذه المشكلة باسم تبديل السياق.

إدارة سياقات Azure

لتجنب تشغيل دفاتر التشغيل الخاصة بك مقابل الموارد في الاشتراك الخاطئ، راجع التوصيات التالية:

  1. تعطيل حفظ سياق بيئة الاختبار المعزولة ضمن دفتر تشغيل Automation باستخدام الأمر التالي في بداية كل دفتر تشغيل: Disable-AzContextAutosave -Scope Process.
  2. تدعم Azure PowerShell cmdlets -DefaultProfile المعلمة. تمت إضافة هذه المعلمة إلى كافة Az وAzure Resource Manager (AzureRM) cmdlets لدعم تشغيل برامج نصية متعددة في نفس العملية، مما يسمح لك بتحديد السياق الذي تريد استخدامه لكل cmdlet. احفظ كائن السياق في دفتر التشغيل الخاص بك عند إنشائه وفي كل مرة يتم تغييره. ثم استخدمه كمرجع في كافة عمليات الاستدعاء التي يتم إجراؤها باستخدام Az أو AzureRM cmdlet. على سبيل المثال، $AzureContext = Set-AzContext -SubscriptionId $subID
  3. مرّر كائن السياق إلى PowerShell cmdlet على سبيل المثال، Get-AzVM -ResourceGroupName "myGroup" -DefaultProfile $AzureContext.

إليك قصاصة برمجية لدفتر تشغيل PowerShell باستخدام هوية مدارة تم تعيينها من قبل النظام باتباع التوصيات لتجنب تبديل السياق.

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

# Pass context object - even though the context had just been set
# This is the step that guarantees the context will not be switched.
Get-AzVM -ResourceGroupName "resourceGroupName" -DefaultProfile $AzureContext | Select Name

الأعراض المحتملة

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

The subscription named <subscription name> cannot be found.

Get-AzVM : The client '<clientid>' with object id '<objectid>' does not have authorization to perform action 'Microsoft.Compute/virtualMachines/read' over scope '/subscriptions/<subscriptionIdOfSubscriptionWhichDoesntContainTheVM>/resourceGroups/REsourceGroupName/providers/Microsoft.Compute/virtualMachines/VMName '.
   ErrorCode: AuthorizationFailed
   StatusCode: 403
   ReasonPhrase: Forbidden Operation
   ID : <AGuidRepresentingTheOperation> At line:51 char:7 + $vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $UNBV... +
Get-AzureRmResource : Resource group "SomeResourceGroupName" could not be found.
... resources = Get-AzResource -ResourceGroupName $group.ResourceGro ...
                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (:) [Get-AzResource], CloudException
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResourceCmdlet

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