การใช้ตะขอ¶
คุณสามารถใช้ 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 ขาเข้า นำข้อมูลนั้น และใช้เพื่อสร้างกฎไฟร์วอลล์ที่จำเป็นบนทรัพยากรการประมวลผลที่โฮสต์อ็อบเจ็กต์นั้น
การสร้างตะขอ¶
เราขอแนะนำให้ใช้ไฟล์เดียวเป็นจุดเริ่มต้น ซึ่งจะกำหนดสคริปต์หรือคำสั่งอื่นที่จะดำเนินการ
หากต้องการสร้างเบ็ดบนโหนดการจัดการหรือทรัพยากรการคำนวณ:
-
เข้าสู่ระบบโหนดการจัดการหรือทรัพยากรการประมวลผลผ่าน SSH ในฐานะผู้ใช้ "รูท"
-
สร้างไดเร็กทอรีชื่อ
/usr/local/solus/hooks/
หากไม่มีอยู่
mkdir /usr/local/solus/hooks/
- สร้างไฟล์และวางสคริปต์ที่คุณกำหนดเองลงในไฟล์ คุณสามารถตั้งชื่อไฟล์ได้ตามต้องการ เช่น "hook.sh"
touch /usr/local/solus/hooks/hook.sh
- ทำให้ไฟล์ปฏิบัติการได้
chmod +x /usr/local/solus/hooks/hook.sh
ตอนนี้เบ็ดของคุณถูกสร้างขึ้นแล้ว ไฟล์ปฏิบัติการจะถูกรันทุกครั้งที่มีเหตุการณ์ที่รองรับเกิดขึ้น คุณไม่สามารถกำหนดค่า SolusVM 2 ให้รันเฉพาะไฟล์ปฏิบัติการเฉพาะสำหรับเหตุการณ์เฉพาะได้ สคริปต์ที่กำหนดเองต้องสามารถแยกวิเคราะห์ออบเจ็กต์ JSON และดำเนินการบางอย่างโดยขึ้นอยู่กับเนื้อหา
เมื่อเหตุการณ์ที่รองรับเกิดขึ้น ฮุคการกำหนดค่าทั้งหมด (ถ้ามี) จะถูกทริกเกอร์ การดำเนินการจะหยุดชั่วคราวในฝั่ง SolusVM 2 จนกว่าสคริปต์แบบกำหนดเองทั้งหมดจะออก หรือจนกว่าจะผ่านไปหนึ่งนาที ขึ้นอยู่กับว่ากรณีใดจะเกิดขึ้นก่อน ตัวอย่างเช่น นี่คือสิ่งที่เกิดขึ้นเมื่อมีการรีสตาร์ทเซิร์ฟเวอร์เสมือน และมี hooks อย่างน้อยหนึ่งรายการที่กำหนดค่าบนโหนดการจัดการหรือทรัพยากรการคำนวณที่โฮสต์เซิร์ฟเวอร์เสมือนนั้น:
- คำสั่งเพื่อรีสตาร์ทเซิร์ฟเวอร์เสมือนนั้นได้รับผ่าน GUI, CLI หรือ API
- SolusVM 2 รันไฟล์ปฏิบัติการทั้งหมดในไดเร็กทอรี
/usr/local/solus/hooks/
โดยส่งผ่านออบเจ็กต์ JSON ที่มีข้อมูลที่เกี่ยวข้องทั้งหมดไปยังแต่ละรายการ รวมถึง ID เหตุการณ์ที่รองรับและตัวบ่งชี้ระยะ "ก่อน" - โปรแกรมปฏิบัติการทั้งหมดออกหรือผ่านไปหนึ่งนาที
- เซิร์ฟเวอร์เสมือนถูกรีสตาร์ท
- 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
หากเหตุการณ์ล้มเหลวระหว่างการดำเนินการ (เช่น ไม่สามารถสร้างเซิร์ฟเวอร์เสมือนได้) เฉพาะฮุก "ก่อน" เท่านั้นที่จะถูกทริกเกอร์ แต่ไม่ใช่ฮุก "โพสต์"
ตัวอย่างตะขอ¶
ตัวอย่างการทุบตี
-
เข้าสู่ระบบโหนดการจัดการหรือทรัพยากรการประมวลผลผ่าน SSH ในฐานะผู้ใช้ "รูท"
-
สร้างไดเร็กทอรีชื่อ
/usr/local/solus/hooks/
หากไม่มีอยู่
mkdir /usr/local/solus/hooks/
- สร้างไฟล์.
touch /usr/local/solus/hooks/hook.sh
- ทำให้มันปฏิบัติการได้
chmod +x /usr/local/solus/hooks/hook.sh
-
วางเนื้อหาต่อไปนี้ลงในไฟล์
#!/bin/bash set -xEeuo pipefail tfile=$(mktemp /tmp/hook_test_$(date "+%Y-%m-%d-%H-%M-%S-%N")_XXX) cat /dev/stdin | jq > $tfile
-
ติดตั้งโปรแกรม "jq" บนเซิร์ฟเวอร์
apt ติดตั้ง jq
หรือ dnf ติดตั้ง jq
ตัวอย่างหลาม
-
เข้าสู่ระบบโหนดการจัดการหรือทรัพยากรการประมวลผลผ่าน SSH ในฐานะผู้ใช้ "รูท"
-
สร้างไดเร็กทอรีชื่อ
/usr/local/solus/hooks/
หากไม่มีอยู่
mkdir /usr/local/solus/hooks/
- สร้างไฟล์.
touch /usr/local/solus/hooks/hook.py
- ทำให้มันปฏิบัติการได้
chmod +x /usr/local/solus/hooks/hook.py
-
วางเนื้อหาต่อไปนี้ลงในไฟล์
#!/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)
-
ติดตั้งโมดูล "json" บนเซิร์ฟเวอร์
python -c "help('modules')"
ทดสอบเบ็ดของคุณ
- เข้าสู่ระบบโหนดการจัดการหรือทรัพยากรการประมวลผลผ่าน SSH ในฐานะผู้ใช้ "รูท"
-
ส่งออบเจ็กต์ JSON ไปที่ hook ของคุณ เช่น:
echo '{ "action": "server-restart", "stage": "pre", "data": { "uuid": "c7ee19aa-2722-4139-9223-60ed4baf09e2", "virtualization_type": "kvm" } }' | /usr/local/solus/hooks/hook.sh