ข้ามไปที่เนื้อหา

การใช้ตะขอ

คุณสามารถใช้ hooks ใน SolusVM 2 เพื่อเรียกใช้สคริปต์แบบกำหนดเองโดยอัตโนมัติก่อนหรือหลังเหตุการณ์เฉพาะเกิดขึ้น

โดยสรุป นี่คือวิธีการทำงานของ hooks ใน SolusVM 2:

  • คุณสามารถสร้างไดเร็กทอรีพิเศษบนโหนดการจัดการและ/หรือทรัพยากรการประมวลผลใดๆ ได้ คุณสามารถให้ hook ที่เชื่อมโยงกับเหตุการณ์เฉพาะทำงานแตกต่างออกไปในทรัพยากรการประมวลผล A และ B และจะหายไปจากทรัพยากรการประมวลผล C ทั้งหมด

  • ในไดเร็กทอรี คุณต้องวางไฟล์ปฏิบัติการหนึ่งไฟล์ขึ้นไปที่มีสคริปต์ที่กำหนดเอง สคริปต์แบบกำหนดเองสามารถเขียนด้วย Bash, PHP, Python, Golang, Java หรือภาษาการเขียนโปรแกรมอื่น ๆ ที่สามารถแยกวิเคราะห์ไฟล์ JSON ที่ส่งผ่านไปได้

  • ทุกครั้งที่มีเหตุการณ์ใดเหตุการณ์หนึ่งที่รองรับ เช่น เซิร์ฟเวอร์เสมือนที่กำลังรีบูต เกิดขึ้นสำหรับเซิร์ฟเวอร์เสมือน SolusVM 2 จะดำเนินการสคริปต์แบบกำหนดเองทั้งหมดที่พบในโหนดการจัดการหรือทรัพยากรการคำนวณที่โฮสต์เซิร์ฟเวอร์เสมือนนั้น คุณสามารถดูรายการเหตุการณ์ที่รองรับทั้งหมดเพิ่มเติมได้ในหัวข้อนี้ คุณไม่สามารถสร้าง hooks สำหรับเหตุการณ์ที่ไม่สนับสนุนได้ ทุก hook ที่กำหนดค่าไว้จะถูกทริกเกอร์สองครั้งต่อเหตุการณ์: ก่อนและหลังเหตุการณ์เกิดขึ้น Hooks จะถูกทริกเกอร์ไม่ว่าเหตุการณ์ที่รองรับจะเริ่มต้นผ่าน GUI, CLI หรือ API หรือไม่ก็ตาม

  • เมื่อฮุคถูกทริกเกอร์ SolusVM 2 จะส่งผ่านออบเจ็กต์ JSON ที่มีข้อมูลต่อไปนี้: ประเภทของเหตุการณ์ ไม่ว่าฮุกจะถูกทริกเกอร์ก่อนหรือหลังเหตุการณ์หรือไม่ และข้อมูลที่เกี่ยวข้องบางอย่าง เช่น ID ของเซิร์ฟเวอร์เสมือน ในคำถาม.

ตัวอย่างเช่น เมื่อมีการสร้างเซิร์ฟเวอร์เสมือนใหม่ เหตุการณ์ "สร้างเซิร์ฟเวอร์เสมือน" จะถูกทริกเกอร์ โดยจะส่งผ่านที่อยู่ 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 จนกว่าสคริปต์แบบกำหนดเองทั้งหมดจะออก หรือจนกว่าจะผ่านไปหนึ่งนาที ขึ้นอยู่กับว่ากรณีใดจะเกิดขึ้นก่อน ตัวอย่างเช่น นี่คือสิ่งที่เกิดขึ้นเมื่อมีการรีสตาร์ทเซิร์ฟเวอร์เสมือน และมี hooks อย่างน้อยหนึ่งรายการที่กำหนดค่าบนโหนดการจัดการหรือทรัพยากรการคำนวณที่โฮสต์เซิร์ฟเวอร์เสมือนนั้น:

  1. คำสั่งเพื่อรีสตาร์ทเซิร์ฟเวอร์เสมือนนั้นได้รับผ่าน GUI, CLI หรือ API
  2. SolusVM 2 รันไฟล์ปฏิบัติการทั้งหมดในไดเร็กทอรี /usr/local/solus/hooks/ โดยส่งผ่านออบเจ็กต์ JSON ที่มีข้อมูลที่เกี่ยวข้องทั้งหมดไปยังแต่ละรายการ รวมถึง ID เหตุการณ์ที่รองรับและตัวบ่งชี้ระยะ "ก่อน"
  3. โปรแกรมปฏิบัติการทั้งหมดออกหรือผ่านไปหนึ่งนาที
  4. เซิร์ฟเวอร์เสมือนถูกรีสตาร์ท
  5. SolusVM 2 รันไฟล์ปฏิบัติการทั้งหมดในไดเร็กทอรี /usr/local/solus/hooks/ โดยส่งผ่านออบเจ็กต์ JSON ที่มีข้อมูลที่เกี่ยวข้องทั้งหมดไปยังแต่ละรายการ รวมถึง ID เหตุการณ์ที่รองรับและตัวบ่งชี้ระยะ "โพสต์"

Note

อย่าวางไฟล์ใดๆ นอกเหนือจาก hooks ในไดเร็กทอรี /usr/local/solus/hooks/

กายวิภาคของวัตถุ JSON

Hook ของคุณต้องคาดหวังข้อมูลบน stdin (อินพุตมาตรฐาน) ในรูปแบบ JSON ที่ถูกต้อง ทุกครั้งที่มีเหตุการณ์ทริกเกอร์เกิดขึ้น ออบเจ็กต์ JSON ที่มีข้อมูลที่เกี่ยวข้องทั้งหมดจะถูกส่งผ่านไปยังทุกไบนารีในไดเร็กทอรี /usr/local/solus/hooks/ วัตถุนี้อาจมีลักษณะดังนี้:

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

ในที่นี้ "การกระทำ" ระบุว่าเหตุการณ์ประเภทใดที่ทริกเกอร์ฮุค (ในกรณีนี้ เซิร์ฟเวอร์เสมือนกำลังถูกรีสตาร์ท) "ระยะ" ระบุว่าเหตุการณ์กำลังจะเกิดขึ้นหรือเพิ่งเกิดขึ้น (ในกรณีนี้คือเหตุการณ์แรก) และ "data" ระบุข้อมูลที่เกี่ยวข้องกับเหตุการณ์ (ในกรณีนี้คือ ID เซิร์ฟเวอร์เสมือนและประเภทการจำลองเสมือน) ดังนั้น วัตถุที่เป็นปัญหาบอกเราว่าเซิร์ฟเวอร์เสมือนที่ใช้ KVM ซึ่งมี ID "c7ee19aa-2722-4139-9223-60ed4baf09e2" กำลังจะรีสตาร์ท และตัวอย่างเช่น สคริปต์แบบกำหนดเองที่เรียกโดย hook สามารถนำไปใช้เพื่อ แจ้งเจ้าของเซิร์ฟเวอร์เสมือน

ปุ่ม "action", "stage" และ "data" จะแสดงอยู่เสมอ

  • คีย์ "stage" มีเพียงค่า "pre" และ "post" เท่านั้น

  • ปุ่ม "action" สามารถมีค่าได้หลายค่าที่สอดคล้องกับเหตุการณ์ที่สนับสนุน

  • "server-create"

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

  • ออบเจ็กต์ "data" มีคีย์จำนวนหนึ่งที่สามารถมีค่าต่างกันได้ คีย์เฉพาะตั้งแต่หนึ่งคีย์ขึ้นไปสอดคล้องกับคีย์ "การกระทำ" แต่ละคีย์ ตัวอย่างเช่น ออบเจ็กต์ JSON ที่สอดคล้องกับเซิร์ฟเวอร์เสมือนที่กำลังรีสตาร์ท (การดำเนินการ "รีสตาร์ทเซิร์ฟเวอร์") จะรวมคีย์ "uuid" และ "virtualization_type" ไว้ในออบเจ็กต์ "data" เสมอ และจะไม่มีคีย์อื่นใดอีก

Note

เหตุการณ์เดียวอาจทำให้เกิด hook หลายรายการ ตัวอย่างเช่น การสร้างเซิร์ฟเวอร์เสมือนใหม่จะทริกเกอร์ทั้ง hooks "server-create" และ "server-network-create"

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 ติดตั้ง jq หรือ dnf ติดตั้ง 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 ไปที่ hook ของคุณ เช่น:

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