قم بتشغيل المهام ضمن حسابات المستخدمين دفعة واحدة

ملاحظة

تختلف حسابات المستخدمين التي تمت مناقشتها في هذه المقالة عن حسابات المستخدمين المستخدمة في بروتوكول سطح المكتب البعيد (RDP) أو Secure Shell (SSH)، لأسباب أمنية.

للاتصال بعقدة تقوم بتشغيل تكوين جهاز Linux الظاهري عبر SSH، راجع تثبيت وتكوين xrdp لاستخدام سطح المكتب البعيد مع Ubuntu. للاتصال بالعقد التي تعمل بنظام Windows عبر RDP، راجع كيفية الاتصال بجهاز Azure الظاهري الذي يعمل بنظام التشغيل Windows وتسجيل الدخول إليه.

للاتصال بعقدة تعمل عبر RDP، راجع تمكين اتصال سطح المكتب البعيد لدور في Azure Cloud Services.

تعمل المهمة في Azure Batch دائماً ضمن حساب مستخدم. بشكل افتراضي، يتم تشغيل المهام ضمن حسابات المستخدمين القياسية، دون أذونات المسؤول. بالنسبة لسيناريوهات معينة، قد ترغب في تكوين حساب المستخدم الذي تريد تشغيل مهمة تحته. تناقش هذه المقالة أنواع حسابات المستخدمين وكيفية تكوينها للسيناريو الخاص بك.

أنواع حسابات المستخدمين

يوفر Azure Batch نوعين من حسابات المستخدمين لتشغيل المهام:

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

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

هام

قدم إصدار Batch service 2017-01-01.4.0 تغييراً مفاجئاً يتطلب تحديث التعليمة البرمجية الخاصة بك لاستدعاء هذا الإصدار أو أحدث. راجع تحديث التعليمة البرمجية الخاصة بك إلى أحدث مكتبة Batch Client للحصول على إرشادات سريعة لتحديث رمز Batch الخاص بك من إصدار أقدم.

وصول حساب المستخدم إلى الملفات والدلائل

يمتلك كل من حساب المستخدم التلقائي وحساب المستخدم المحدد حق الوصول للقراءة/ الكتابة إلى دليل عمل المهمة، والدليل المشترك، ودليل المهام متعدد المثيلات. يتمتع كلا النوعين من الحسابات بحق الوصول للقراءة إلى دلائل بدء التشغيل والإعداد للوظيفة.

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

لمزيد من المعلومات حول الوصول إلى الملفات والأدلة من مهمة، راجع الملفات والأدلة.

وصول مرتفع للمهام

يشير مستوى الارتفاع لحساب المستخدم إلى ما إذا كانت المهمة تعمل بوصول مرتفع. يمكن تشغيل كل من حساب المستخدم التلقائي وحساب المستخدم المحدد بوصول مرتفع. الخياران لمستوى الارتفاع هما:

  • NonAdmin: تعمل المهمة كمستخدم قياسي دون وصول مرتفع. دائماً ما يكون مستوى الارتفاع الافتراضي لحساب مستخدم Batch هو NonAdmin.
  • المسؤول: تعمل المهمة كمستخدم لديه وصول مرتفع وتعمل بأذونات مسؤول كاملة.

حسابات المستخدم التلقائي

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

البديل لنطاق التجمع هو نطاق المهمة. عندما يتم تكوين مواصفات المستخدم التلقائي لنطاق المهمة، تقوم خدمة الدُفعات بإنشاء حساب مستخدم تلقائي لتلك المهمة فقط.

هناك أربعة تكوينات محتملة لمواصفات المستخدم التلقائي، يتوافق كل منها مع حساب مستخدم تلقائي فريد:

  • وصول غير المسؤول مع نطاق المهمة
  • وصول المسؤول (المرتفع) مع نطاق المهمة
  • وصول غير المسؤول مع نطاق التجمع
  • وصول المسؤول مع نطاق التجمع

هام

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

قم بتشغيل مهمة كمستخدم تلقائي مع وصول مرتفع.

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

ملاحظة

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

توضح قصاصات التعليمة البرمجية التالية كيفية تكوين مواصفات المستخدم التلقائي. عينت الأمثلة مستوى الارتفاع على Adminوالنطاق علىTask.

دفعة .NET

task.UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.Admin, scope: AutoUserScope.Task));

Batch Java

taskToAdd.withId(taskId)
        .withUserIdentity(new UserIdentity()
            .withAutoUser(new AutoUserSpecification()
                .withElevationLevel(ElevationLevel.ADMIN))
                .withScope(AutoUserScope.TASK));
        .withCommandLine("cmd /c echo hello");

Batch Python

user = batchmodels.UserIdentity(
    auto_user=batchmodels.AutoUserSpecification(
        elevation_level=batchmodels.ElevationLevel.admin,
        scope=batchmodels.AutoUserScope.task))
task = batchmodels.TaskAddParameter(
    id='task_1',
    command_line='cmd /c "echo hello world"',
    user_identity=user)
batch_client.task.add(job_id=jobid, task=task)

قم بتشغيل مهمة كمستخدم تلقائي مع نطاق التجمع

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

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

ملاحظة

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

ميزة التشغيل تحت نفس حساب المستخدم التلقائي هي أن المهام قادرة على مشاركة البيانات مع المهام الأخرى التي تعمل على نفس العقدة.

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

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

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

task.UserIdentity = new UserIdentity(new AutoUserSpecification(scope: AutoUserScope.Pool));

حسابات المستخدمين المسماة

يمكنك تحديد حسابات المستخدمين المسماة عند إنشاء تجمع. حساب مستخدم مسمى له اسم وكلمة مرور تقومان بتوفيرهما. يمكنك تحديد مستوى الارتفاع لحساب مستخدم مُسمى. بالنسبة لعقد Linux، يمكنك أيضاً توفير مفتاح SSH الخاص.

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

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

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

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

قم بإنشاء حسابات مستخدمين مسماة

لإنشاء حسابات مستخدمين مسماة دفعة، أضف مجموعة من حسابات المستخدمين إلى التجمع. توضح قصاصات التعليمة البرمجية التالية كيفية إنشاء حسابات مستخدمين مسماة في.NET وJava وPython. توضح قصاصات التعليمة البرمجية هذه كيفية إنشاء كلٍ من حسابات المسؤولين وغير المسؤولين المسماة على مجموعة.

مثال على Batch .NET (Windows)

CloudPool pool = null;
Console.WriteLine("Creating pool [{0}]...", poolId);

// Create a pool using Virtual Machine Configuration.
pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 3,
    virtualMachineSize: "standard_d1_v2",
    VirtualMachineConfiguration: new VirtualMachineConfiguration(
    imageReference: new ImageReference(
                        publisher: "MicrosoftWindowsServer",
                        offer: "WindowsServer",
                        sku: "2019-datacenter-core",
                        version: "latest"),
    nodeAgentSkuId: "batch.node.windows amd64");

// Add named user accounts.
pool.UserAccounts = new List<UserAccount>
{
    new UserAccount("adminUser", "xyz123", ElevationLevel.Admin),
    new UserAccount("nonAdminUser", "123xyz", ElevationLevel.NonAdmin),
};

// Commit the pool.
await pool.CommitAsync();

مثال على Batch .NET (Linux)

CloudPool pool = null;

// Obtain a collection of all available node agent SKUs.
List<NodeAgentSku> nodeAgentSkus =
    batchClient.PoolOperations.ListNodeAgentSkus().ToList();

// Define a delegate specifying properties of the VM image to use.
Func<ImageReference, bool> isUbuntu1804 = imageRef =>
    imageRef.Publisher == "Canonical" &&
    imageRef.Offer == "UbuntuServer" &&
    imageRef.Sku.Contains("20.04-LTS");

// Obtain the first node agent SKU in the collection that matches
// Ubuntu Server 20.04.
NodeAgentSku ubuntuAgentSku = nodeAgentSkus.First(sku =>
    sku.VerifiedImageReferences.Any(isUbuntu2004));

// Select an ImageReference from those available for node agent.
ImageReference imageReference =
    ubuntuAgentSku.VerifiedImageReferences.First(isUbuntu2004);

// Create the virtual machine configuration to use to create the pool.
VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration(imageReference, ubuntuAgentSku.Id);

Console.WriteLine("Creating pool [{0}]...", poolId);

// Create the unbound pool.
pool = batchClient.PoolOperations.CreatePool(
    poolId: poolId,
    targetDedicatedComputeNodes: 3,
    virtualMachineSize: "Standard_A1",
    virtualMachineConfiguration: virtualMachineConfiguration);
// Add named user accounts.
pool.UserAccounts = new List<UserAccount>
{
    new UserAccount(
        name: "adminUser",
        password: "xyz123",
        elevationLevel: ElevationLevel.Admin,
        linuxUserConfiguration: new LinuxUserConfiguration(
            uid: 12345,
            gid: 98765,
            sshPrivateKey: new Guid().ToString()
            )),
    new UserAccount(
        name: "nonAdminUser",
        password: "123xyz",
        elevationLevel: ElevationLevel.NonAdmin,
        linuxUserConfiguration: new LinuxUserConfiguration(
            uid: 45678,
            gid: 98765,
            sshPrivateKey: new Guid().ToString()
            )),
};

// Commit the pool.
await pool.CommitAsync();

مثال على Batch Java

List<UserAccount> userList = new ArrayList<>();
userList.add(new UserAccount().withName(adminUserAccountName).withPassword(adminPassword).withElevationLevel(ElevationLevel.ADMIN));
userList.add(new UserAccount().withName(nonAdminUserAccountName).withPassword(nonAdminPassword).withElevationLevel(ElevationLevel.NONADMIN));
PoolAddParameter addParameter = new PoolAddParameter()
        .withId(poolId)
        .withTargetDedicatedNodes(POOL_VM_COUNT)
        .withVmSize(POOL_VM_SIZE)
        .withVirtualMachineConfiguration(configuration)
        .withUserAccounts(userList);
batchClient.poolOperations().createPool(addParameter);

مثال على Batch Python

users = [
    batchmodels.UserAccount(
        name='pool-admin',
        password='******',
        elevation_level=batchmodels.ElevationLevel.admin)
    batchmodels.UserAccount(
        name='pool-nonadmin',
        password='******',
        elevation_level=batchmodels.ElevationLevel.non_admin)
]
pool = batchmodels.PoolAddParameter(
    id=pool_id,
    user_accounts=users,
    virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
        image_reference=image_ref_to_use,
        node_agent_sku_id=sku_to_use),
    vm_size=vm_size,
    target_dedicated=vm_count)
batch_client.pool.add(pool)

قم بتشغيل مهمة ضمن حساب مستخدم مسمى مع وصول مرتفع

لتشغيل مهمة كمستخدم غير مكتمل، قم بتعيين خاصية UserIdentity الخاصة بالمهمة إلى حساب مستخدم مسمى تم إنشاؤه باستخدام خاصية ElevationLevel التي تم تعيينها على Admin.

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

CloudTask task = new CloudTask("1", "cmd.exe /c echo 1");
task.UserIdentity = new UserIdentity(AdminUserAccountName);

قم بتحديث التعليمة البرمجية الخاصة بك إلى أحدث مكتبة لعميل الدُفعات

قدم إصدار خدمة Batch 2017-01-01.4.0 تغييراً فاصلاً، حيث استبدل خاصية runElevated المتوفرة في الإصدارات السابقة بخاصية userIdentity. توفر الجداول التالية تعييناً بسيطاً يمكنك استخدامه لتحديث التعليمة البرمجية من الإصدارات السابقة لمكتبات العميل.

دفعة .NET

إذا كانت التعليمة البرمجية الخاصة بك تستخدم... فقم بتحديثها إلى....
CloudTask.RunElevated = true; CloudTask.UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.Admin));
CloudTask.RunElevated = false; CloudTask.UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.NonAdmin));
CloudTask.RunElevated غير مُحدد لا يوجد تحديث مطلوب

Batch Java

إذا كانت التعليمة البرمجية الخاصة بك تستخدم... فقم بتحديثها إلى....
CloudTask.withRunElevated(true); CloudTask.withUserIdentity(new UserIdentity().withAutoUser(new AutoUserSpecification().withElevationLevel(ElevationLevel.ADMIN));
CloudTask.withRunElevated(false); CloudTask.withUserIdentity(new UserIdentity().withAutoUser(new AutoUserSpecification().withElevationLevel(ElevationLevel.NONADMIN));
CloudTask.withRunElevated غير مُحدد لا يوجد تحديث مطلوب

Batch Python

إذا كانت التعليمة البرمجية الخاصة بك تستخدم... فقم بتحديثها إلى....
run_elevated=True أين، user_identity=user
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.admin))
run_elevated=False أين، user_identity=user
user = batchmodels.UserIdentity(
     auto_user=batchmodels.AutoUserSpecification(
          elevation_level=batchmodels.ElevationLevel.non_admin))
run_elevated غير مُحدد لا يوجد تحديث مطلوب

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