Bỏ qua

Sử dụng móc

Bạn có thể sử dụng hook trong SolusVM 2 để tự động chạy các tập lệnh tùy chỉnh trước hoặc sau khi các sự kiện cụ thể diễn ra.

Tóm lại, đây là cách hoạt động của hook trong SolusVM 2:

  • Bạn có thể tạo một thư mục đặc biệt trên nút quản lý và/hoặc bất kỳ tài nguyên điện toán nào. Bạn có thể có một hook gắn với một sự kiện cụ thể hoạt động khác nhau trên tài nguyên điện toán A và B và hoàn toàn không có trong tài nguyên điện toán C.

  • Trong thư mục, bạn cần đặt một hoặc nhiều tệp thực thi có chứa tập lệnh tùy chỉnh. Các tập lệnh tùy chỉnh có thể được viết bằng Bash, PHP, Python, Golang, Java hoặc bất kỳ ngôn ngữ lập trình nào khác có thể phân tích cú pháp tệp JSON được truyền cho nó.

  • Mỗi khi một trong các sự kiện được hỗ trợ, chẳng hạn như máy chủ ảo được khởi động lại, diễn ra đối với máy chủ ảo, SolusVM 2 sẽ thực thi tất cả các tập lệnh tùy chỉnh được tìm thấy trên nút quản lý hoặc tính toán tài nguyên lưu trữ trên máy chủ ảo đó. Bạn có thể tìm thêm danh sách đầy đủ các sự kiện được hỗ trợ trong chủ đề này. Bạn không thể tạo hook cho các sự kiện không được hỗ trợ. Mỗi hook được cấu hình sẽ được kích hoạt hai lần cho mỗi sự kiện: trước và sau khi sự kiện diễn ra. Móc được kích hoạt bất kể sự kiện được hỗ trợ có được bắt đầu thông qua GUI, CLI hay API hay không.

  • Khi một hook được kích hoạt, SolusVM 2 sẽ chuyển đến nó một đối tượng JSON chứa thông tin sau: loại sự kiện, hook đó được kích hoạt trước hay sau sự kiện và cả một số dữ liệu liên quan nhất định, chẳng hạn như ID của máy chủ ảo trong câu hỏi.

Ví dụ: khi một máy chủ ảo mới được tạo, sự kiện "đã tạo máy chủ ảo" sẽ được kích hoạt. Nó chuyển, cùng với các dữ liệu khác, địa chỉ IP của máy chủ ảo mới được tạo. Bạn có thể tạo một tập lệnh tùy chỉnh để phân tích cú pháp đối tượng JSON đến, lấy dữ liệu đó và sử dụng nó để tạo các quy tắc tường lửa cần thiết trên tài nguyên điện toán lưu trữ nó.

Tạo một cái móc

Chúng tôi khuyên bạn nên sử dụng một tệp duy nhất làm điểm bắt đầu, tệp này sẽ xác định tập lệnh hoặc lệnh nào khác sẽ được thực thi.

Để tạo hook trên nút quản lý hoặc tài nguyên tính toán:

  1. Đăng nhập vào nút quản lý hoặc tính toán tài nguyên qua SSH với tư cách là người dùng "root".

  2. Tạo một thư mục có tên /usr/local/solus/hooks/ nếu nó không tồn tại.

mkdir /usr/local/solus/hooks/

  1. Tạo một tệp và dán tập lệnh tùy chỉnh của bạn vào tệp. Bạn có thể đặt cho tệp bất kỳ tên nào bạn muốn, ví dụ: "hook.sh".

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

  1. Làm cho tập tin có thể thực thi được.

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

Móc của bạn bây giờ đã được tạo. Tệp thực thi sẽ được chạy mỗi khi sự kiện được hỗ trợ diễn ra. Bạn không thể định cấu hình SolusVM 2 để chỉ chạy các tệp thực thi cụ thể cho các sự kiện cụ thể. Tập lệnh tùy chỉnh phải có khả năng phân tích cú pháp đối tượng JSON và thực hiện (các) hành động nhất định tùy thuộc vào nội dung của nó.

Khi một sự kiện được hỗ trợ diễn ra, tất cả các hook cấu hình (nếu có) sẽ được kích hoạt. Hành động này bị tạm dừng ở phía SolusVM 2 cho đến khi tất cả các tập lệnh tùy chỉnh đã thoát hoặc cho đến khi một phút trôi qua, tùy điều kiện nào đến trước. Vì vậy, ví dụ: đây là những gì xảy ra khi một máy chủ ảo được khởi động lại và có một hoặc nhiều hook được định cấu hình trên nút quản lý hoặc tính toán tài nguyên lưu trữ trên máy chủ ảo đó:

  1. Lệnh khởi động lại máy chủ ảo được đưa ra thông qua GUI, CLI hoặc API.
  2. SolusVM 2 chạy tất cả các tệp thực thi trong thư mục /usr/local/solus/hooks/, chuyển đến từng tệp đối tượng JSON chứa tất cả thông tin liên quan, bao gồm ID sự kiện được hỗ trợ và chỉ báo giai đoạn "trước".
  3. Tất cả các tệp thực thi đều thoát hoặc một phút trôi qua.
  4. Máy chủ ảo được khởi động lại.
  5. SolusVM 2 chạy tất cả các tệp thực thi trong thư mục /usr/local/solus/hooks/, chuyển đến từng đối tượng JSON chứa tất cả thông tin liên quan, bao gồm ID sự kiện được hỗ trợ và chỉ báo giai đoạn "đăng".

Note

Không đặt bất kỳ tệp nào ngoài hook trong thư mục /usr/local/solus/hooks/.

Giải phẫu đối tượng JSON

Móc của bạn phải có dữ liệu trên stdin (đầu vào tiêu chuẩn) ở định dạng JSON hợp lệ. Mỗi khi một sự kiện kích hoạt diễn ra, một đối tượng JSON chứa tất cả dữ liệu liên quan sẽ được chuyển đến mọi tệp nhị phân trong thư mục /usr/local/solus/hooks/. Đây là đối tượng này có thể trông như thế nào:

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

Ở đây, "hành động" chỉ định loại sự kiện nào đã kích hoạt hook (trong trường hợp này là máy chủ ảo đang được khởi động lại), "giai đoạn" chỉ định xem sự kiện sắp xảy ra hay vừa mới xảy ra (trong trường hợp này là sự kiện trước đó) và "dữ liệu" chỉ định thông tin liên quan đến sự kiện (trong trường hợp này là ID máy chủ ảo và loại ảo hóa của nó). Vì vậy, đối tượng được đề cập cho chúng ta biết rằng máy chủ ảo dựa trên KVM có ID "c7ee19aa-2722-4139-9223-60ed4baf09e2" sắp được khởi động lại và tập lệnh tùy chỉnh được gọi bởi hook có thể được sử dụng chẳng hạn để thông báo cho chủ sở hữu máy chủ ảo.

Các phím "hành động", "giai đoạn" và "dữ liệu" luôn hiện diện.

  • Khóa "giai đoạn" chỉ có thể có giá trị "trước" và "sau".

  • Khóa "hành động" có thể có một số giá trị tương ứng với các sự kiện được hỗ trợ.

  • "server-create"

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

  • Đối tượng "dữ liệu" bao gồm một số khóa có thể có các giá trị khác nhau. Một hoặc nhiều phím cụ thể tương ứng với từng phím "hành động" cụ thể. Ví dụ: một đối tượng JSON tương ứng với một máy chủ ảo đang được khởi động lại (hành động "khởi động lại máy chủ") sẽ luôn bao gồm các khóa "uuid" và "virtualization_type" trong đối tượng "data" và không bao giờ có bất kỳ khóa nào khác.

Note

Một sự kiện có thể kích hoạt nhiều hook. Ví dụ: việc tạo một máy chủ ảo mới sẽ kích hoạt cả hook "tạo máy chủ" và "tạo mạng máy chủ".

Note

Nếu một sự kiện không thành công trong quá trình thực thi (ví dụ: không thể tạo máy chủ ảo), thì chỉ các hook "pre" mới được kích hoạt, chứ không phải các hook "post".

Ví dụ móc

Ví dụ về Bash

  1. Đăng nhập vào nút quản lý hoặc tính toán tài nguyên qua SSH với tư cách là người dùng "root".

  2. Tạo một thư mục có tên /usr/local/solus/hooks/ nếu nó không tồn tại.

mkdir /usr/local/solus/hooks/

  1. Tạo một tập tin.

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

  1. Làm cho nó có thể thực thi được.

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

  1. Dán nội dung sau vào tập tin.

    #!/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. Cài đặt chương trình "jq" trên máy chủ.

apt cài đặt jq hoặc dnf cài đặt jq

Ví dụ về Python

  1. Đăng nhập vào nút quản lý hoặc tính toán tài nguyên qua SSH với tư cách là người dùng "root".

  2. Tạo một thư mục có tên /usr/local/solus/hooks/ nếu nó không tồn tại.

mkdir /usr/local/solus/hooks/

  1. Tạo một tập tin.

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

  1. Làm cho nó có thể thực thi được.

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

  1. Dán nội dung sau vào tập tin.

    #!/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. Cài đặt mô-đun "json" trên máy chủ.

python -c "help('modules')"

Kiểm tra móc của bạn

  1. Đăng nhập vào nút quản lý hoặc tính toán tài nguyên qua SSH với tư cách là người dùng "root".
  2. Truyền một đối tượng JSON vào hook của bạn, ví dụ:

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