انتقل إلى المحتوى

استخدام الخطافات

يمكنك استخدام الخطافات في SolusVM 2 لتشغيل البرامج النصية المخصصة تلقائيًا قبل أو بعد وقوع أحداث معينة.

باختصار، إليك كيفية عمل الخطافات في SolusVM 2:

  • يمكنك إنشاء دليل خاص على عقدة الإدارة و/أو أي موارد حسابية. يمكن أن يكون لديك رابط مرتبط بحدث معين يتصرف بشكل مختلف على موارد الحساب A وB، ويكون غائبًا تمامًا عن مورد الحساب C.

  • في الدليل، تحتاج إلى وضع ملف قابل للتنفيذ أو أكثر يحتوي على برنامج نصي مخصص. يمكن كتابة البرامج النصية المخصصة بلغة Bash أو PHP أو Python أو Golang أو Java أو أي لغة برمجة أخرى قادرة على تحليل ملف JSON الذي تم تمريره إليها.

  • في كل مرة يحدث فيها أحد الأحداث المدعومة، مثل إعادة تشغيل الخادم الظاهري، لخادم ظاهري، يقوم SolusVM 2 بتنفيذ جميع البرامج النصية المخصصة الموجودة في عقدة الإدارة أو حساب المورد الذي يستضيف ذلك الخادم الظاهري. يمكنك العثور على القائمة الكاملة للأحداث المدعومة بشكل أكبر في هذا الموضوع. لا يمكنك إنشاء خطافات للأحداث غير المدعومة. يتم تشغيل كل ربط تم تكوينه مرتين لكل حدث: قبل وقوع الحدث وبعده. يتم تشغيل الخطافات بغض النظر عما إذا كان قد تم بدء حدث مدعوم عبر واجهة المستخدم الرسومية (GUI) أو واجهة سطر الأوامر (CLI) أو واجهة برمجة التطبيقات (API).

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

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

إنشاء هوك

نوصي باستخدام ملف واحد كنقطة بداية، والذي سيحدد البرامج النصية أو الأوامر الأخرى التي سيتم تنفيذها.

لإنشاء ربط على عقدة الإدارة أو حساب المورد:

  1. قم بتسجيل الدخول إلى عقدة الإدارة أو حساب المورد عبر SSH كمستخدم "جذر".

  2. قم بإنشاء دليل باسم /usr/local/solus/hooks/ إذا لم يكن موجودًا.

mkdir /usr/local/solus/hooks/

  1. قم بإنشاء ملف ولصق البرنامج النصي المخصص الخاص بك في الملف. يمكنك إعطاء الملف أي اسم تريده، على سبيل المثال، "hook.sh".

touch /usr/local/solus/hooks/hook.sh

  1. اجعل الملف قابلاً للتنفيذ.

chmod +x /usr/local/solus/hooks/hook.sh

تم الآن إنشاء الخطاف الخاص بك. سيتم تشغيل الملف القابل للتنفيذ في كل مرة يحدث فيها حدث مدعوم. لا يمكنك تكوين SolusVM 2 لتشغيل ملفات تنفيذية محددة لأحداث محددة فقط. يجب أن يكون البرنامج النصي المخصص قادرًا على تحليل كائن JSON وتنفيذ إجراء (إجراءات) معينة اعتمادًا على محتوياته.

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

  1. يتم إعطاء أمر إعادة تشغيل الخادم الظاهري عبر واجهة المستخدم الرسومية (GUI) أو واجهة سطر الأوامر (CLI) أو واجهة برمجة التطبيقات (API).
  2. يقوم SolusVM 2 بتشغيل جميع الملفات التنفيذية في الدليل /usr/local/solus/hooks/، ويمرر إلى كل منها كائن JSON الذي يحتوي على جميع المعلومات ذات الصلة، بما في ذلك معرف الحدث المدعوم ومؤشر المرحلة "ما قبل".
  3. جميع الملفات التنفيذية تخرج أو تمر دقيقة.
  4. تتم إعادة تشغيل الخادم الظاهري.
  5. يقوم SolusVM 2 بتشغيل جميع الملفات التنفيذية في الدليل /usr/local/solus/hooks/، ويمرر إلى كل منها كائن JSON الذي يحتوي على جميع المعلومات ذات الصلة، بما في ذلك معرف الحدث المدعوم ومؤشر مرحلة "النشر".

Note

لا تضع أي ملفات بخلاف الخطافات في الدليل /usr/local/solus/hooks/.

تشريح كائن JSON

يجب أن يتوقع خطافك بيانات على stdin (الإدخال القياسي) بتنسيق JSON صالح. في كل مرة يحدث فيها حدث تشغيل، يتم تمرير كائن JSON يحتوي على جميع البيانات ذات الصلة إلى كل ثنائي في الدليل /usr/local/solus/hooks/. إليك ما قد يبدو عليه هذا الكائن:

{
    "action": "server-restart",
    "stage": "pre",
    "data": {
      "uuid": "c7ee19aa-2722-4139-9223-60ed4baf09e2",
      "virtualization_type": "kvm"
    }
  }

هنا، يحدد "الإجراء" نوع الحدث الذي أدى إلى تشغيل الخطاف (في هذه الحالة، تتم إعادة تشغيل الخادم الظاهري)، ويحدد "المرحلة" ما إذا كان الحدث على وشك الحدوث أم أنه قد حدث للتو (في هذه الحالة، الأول)، و تحدد "البيانات" المعلومات ذات الصلة بالحدث (في هذه الحالة، معرف الخادم الظاهري ونوع المحاكاة الافتراضية الخاص به). لذلك، يخبرنا الكائن المعني أن الخادم الظاهري المستند إلى KVM بالمعرف "c7ee19aa-2722-4139-9223-60ed4baf09e2" على وشك إعادة التشغيل، ويمكن، على سبيل المثال، استخدام البرنامج النصي المخصص الذي يستدعيه الخطاف قم بإخطار مالك الخادم الظاهري.

مفاتيح "الإجراء" و"المرحلة" و"البيانات" موجودة دائمًا.

  • يمكن أن يحتوي مفتاح "المرحلة" فقط على القيمتين "ما قبل" و"ما بعد".

  • يمكن أن يحتوي مفتاح "الإجراء" على عدد من القيم المقابلة للأحداث المدعومة.

  • "server-create"

  • "server-delete"
  • "server-migrate"
  • "server-reinstall"
  • "server-restart"
  • "server-start"
  • "server-stop"
  • "server-network-create"
  • "server-network-delete"
  • "server-network-update"

  • يتضمن كائن "البيانات" عددًا من المفاتيح التي يمكن أن تحتوي على قيم مختلفة. يتوافق واحد أو أكثر من المفاتيح المحددة مع كل مفتاح "إجراء" محدد. على سبيل المثال، كائن JSON المطابق لخادم افتراضي يتم إعادة تشغيله (إجراء "إعادة تشغيل الخادم") سيتضمن دائمًا مفتاحي "uuid" و"virtualization_type" داخل كائن "data"، وليس أي مفاتيح أخرى أبدًا.

Note

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

Note

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

أمثلة هوك

مثال باش

  1. قم بتسجيل الدخول إلى عقدة الإدارة أو حساب المورد عبر SSH كمستخدم "جذر".

  2. قم بإنشاء دليل باسم /usr/local/solus/hooks/ إذا لم يكن موجودًا.

mkdir /usr/local/solus/hooks/

  1. قم بإنشاء ملف .

touch /usr/local/solus/hooks/hook.sh

  1. اجعلها قابلة للتنفيذ.

chmod +x /usr/local/solus/hooks/hook.sh

  1. الصق المحتوى التالي في الملف.

    #!/bin/bash
    set -xEeuo pipefail
    
    tfile=$(mktemp /tmp/hook_test_$(date "+%Y-%m-%d-%H-%M-%S-%N")_XXX)
    
    cat /dev/stdin | jq > $tfile
    
  2. تثبيت برنامج "jq" على الخادم.

apt install jq أو dnf install jq

مثال بايثون

  1. قم بتسجيل الدخول إلى عقدة الإدارة أو حساب المورد عبر SSH كمستخدم "جذر".

  2. قم بإنشاء دليل باسم /usr/local/solus/hooks/ إذا لم يكن موجودًا.

mkdir /usr/local/solus/hooks/

  1. قم بإنشاء ملف .

touch /usr/local/solus/hooks/hook.py

  1. اجعلها قابلة للتنفيذ.

chmod +x /usr/local/solus/hooks/hook.py

  1. الصق المحتوى التالي في الملف.

    #!/usr/bin/env python3
    import sys
    import json
    
    ACTION_SERVER_RESTART = "server-restart"
    STAGE_PRE = "pre"
    STAGE_POST = "post"
    
    event = json.loads(sys.stdin.read())
    
    
    def handle_server_restart_pre(event_data):
        print(f'Server going restart: {event_data["uuid"]}')
    
    
    def handle_server_restart_post(event_data):
        print(f'Server was restarted: {event_data["uuid"]}')
    
    
    action = event["action"]
    stage = event["stage"]
    data = event["data"]
    
    if ACTION_SERVER_RESTART == action:
        if STAGE_PRE == stage:
            handle_server_restart_pre(data)
            sys.exit(0)
        if STAGE_POST == stage:
            handle_server_restart_post(data)
            sys.exit(0)
    
  2. قم بتثبيت وحدة "json" على الخادم.

python -c "help('modules')"

اختبار الخطاف الخاص بك

  1. قم بتسجيل الدخول إلى عقدة الإدارة أو حساب المورد عبر SSH كمستخدم "جذر".
  2. قم بتمرير كائن JSON إلى خطافك، على سبيل المثال:

    echo '{
    "action": "server-restart",
    "stage": "pre",
    "data":
    
    { "uuid": "c7ee19aa-2722-4139-9223-60ed4baf09e2", "virtualization_type": "kvm" }
    }' | /usr/local/solus/hooks/hook.sh