Ana içeriğe geç

Hooks Kullanımı#


SolusVM 2'de olaylar gerçekleşmeden önce veya sonra özel komut dosyalarını otomatik olarak çalıştırmak için hookları kullanabilirsiniz.

Kısacası, SolusVM 2'deki hooklar nasıl çalışır:

  • Yönetim düğümünde ve/veya işlem kaynaklarında özel bir dizin oluşturabilirsiniz. Bir olaya bağlı olarak belirli bir etkişime sahip bir hooka, işlem kaynakları A ve B üzerinde farklı davranabilir ve işlem kaynağı C üzerinde hiç bulunmayabilir.

  • Dizinde, özel bir komut dosyasını içeren bir veya daha fazla yürütülebilir dosya yerleştirmeniz gerekmektedir. Özel komut dosyaları, Bash, PHP, Python, Golang, Java veya ona geçirilen bir JSON dosyasını ayrıştırabilen herhangi bir programlama dilinde yazılabilir.

  • Desteklenen olaylardan biri, örneğin bir sanal sunucunun yeniden başlatılması gibi bir olay gerçekleştiğinde, SolusVM 2, ilgili sanal sunucuyu barındıran yönetim düğümü veya işlem kaynağı üzerinde bulunan tüm özel komut dosyalarını yürütür. Desteklenen olayların tam listesini bu konunun devamında bulabilirsiniz. Desteklenmeyen olaylar için hookslar oluşturamazsınız. Her yapılandırılmış hooka olay başına iki kez tetiklenir: olaydan önce ve sonra. hooklar, desteklenen bir olayın GUI, CLI veya API aracılığıyla başlatılıp başlatılmadığına bakılmaksızın tetiklenir.

  • Bir hooka tetiklendiğinde, SolusVM 2, olayın türünü, hookun olaydan önce veya sonra tetiklendiğini ve ayrıca sanal sunucunun kimliği gibi belirli ilgili verileri içeren bir JSON nesnesini ona geçirir.

Örneğin, yeni bir sanal sunucu oluşturulduğunda "sanal sunucu oluşturuldu" olayı tetiklenir. Bu, diğer veriler arasında, yeni oluşturulan sanal sunucunun IP adresini geçer. Gelen JSON nesnesini ayrıştıran, bu verileri alan ve onu barındıran işlem kaynağı üzerinde gerekli güvenlik duvarı kurallarını oluşturmak için kullanılan özel bir komut dosyası oluşturabilirsiniz.

Hookun Oluşturulması#

Başlangıç ​​noktası olarak tek bir dosya kullanmanızı öneririz, bu dosya hangi diğer komut dosyalarını veya komutları yürüteceğini belirleyecektir.

Yönetim düğümünde veya işlem kaynağında bir hooku oluşturmak için:

  1. "root" kullanıcısı olarak SSH üzerinden yönetim düğümüne veya işlem kaynağına giriş yapın.
  2. Var olmayan bir dizin olan /usr/local/solus/hooks/ dizinini oluşturun.

    mkdir /usr/local/solus/hooks/

  3. Bir dosya oluşturun ve özel komut dosyanızı dosyaya yapıştırın. Dosyaya istediğiniz herhangi bir ad verebilirsiniz, örneğin "hook.sh".

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

  4. Dosyayı çalıştırılabilir yapın.

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

Hook şimdi oluşturuldu. Yürütülebilir, desteklenen bir olay gerçekleştiğinde her seferinde çalıştırılacaktır. SolusVM 2'yi yalnızca belirli olaylar için belirli yürütülebilirler çalıştırmak üzere yapılandıramazsınız. Özel komut dosyası, gelen JSON nesnesini ayrıştırabilen ve içeriğine bağlı olarak belirli bir işlemi gerçekleştirebilen olmalıdır.

Desteklenen bir olay gerçekleştiğinde, tüm yapılandırılmış hooklar (varsa) tetiklenir. SolusVM 2 tarafında eylem, tüm özel komut dosyaları çıkana kadar veya bir dakika geçene kadar durur. Örneğin, bir sanal sunucu yeniden başlatıldığında ve yönetim düğümü veya işlem kaynağında bir veya daha fazla hookun yapılandırıldığı durumlarda aşağıdaki gibi bir şey olur:

  1. Sanal sunucunun yeniden başlatılması komutu, GUI, CLI veya API aracılığıyla verilir.
  2. SolusVM 2, tüm yürütülebilirleri /usr/local/solus/hooks/ dizininde çalıştırır ve desteklenen olayın kimliğini ve "pre" aşaması göstergesini içeren tüm ilgili bilgileri içeren JSON nesnesini her birine geçirir.
  3. Tüm yürütülebilirler çıkar veya bir dakika geçer.
  4. Sanal sunucu yeniden başlatılır.
  5. SolusVM 2, tüm yürütülebilirleri /usr/local/solus/hooks/ dizininde çalıştırır ve desteklenen olayın kimliğini ve "post" aşaması göstergesini içeren tüm ilgili bilgileri içeren JSON nesnesini her birine geçirir.

Not

/usr/local/solus/hooks/ dizinine hooklar dışında herhangi bir dosya yerleştirmeyin.

JSON Nesnesi Yapısı#

Hokkunuz geçerli JSON biçiminde stdin (standart giriş) üzerinden veri beklemesi gerekmektedir. Tetikleyici bir olay gerçekleştiğinde, tüm ilgili verileri içeren bir JSON nesnesi, /usr/local/solus/hooks/ dizinindeki her ikiliye geçirilir. İşte bu nesne nasıl görünebilir:

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

Burada "action" hookun hangi tür olay tarafından tetiklendiğini belirtir (bu durumda bir sanal sunucunun yeniden başlatılması), "stage" olayın gerçekleşmek üzere olduğunu veya henüz gerçekleştiğini belirtir (bu durumda ilk önceki), ve "data" olayla ilgili bilgileri belirtir (bu durumda sanal sunucu kimliği ve sanallaştırma türü). Bu nesne, söz konusu KVM tabanlı sanal sunucunun "c7ee19aa-2722-4139-9223-60ed4baf09e2" kimliğine sahip olduğunu ve hooku çağıran özel komut dosyasının, örneğin, sanal sunucunun sahibini bildirmek için kullanılabileceğini söyler.

"action", "stage" ve "data" anahtarları her zaman mevcuttur.

  • "stage" anahtarı yalnızca "pre" ve "post" değerlerine sahip olabilir.

  • "action" anahtarı, desteklenen olaylara karşılık gelen bir dizi değere sahip olabilir.

    • "server-create"
    • "server-delete"
    • "server-migrate"
    • "server-reinstall"
    • "server-restart"
    • "server-start"
    • "server-stop"
    • "server-network-create"
    • "server-network-delete"
    • "server-network-update"
  • "data" nesnesi, farklı değerlere sahip bir dizi anahtar içerir. Her bir belirli "action" anahtarına bir veya daha fazla belirli anahtar karşılık gelir. Örneğin, bir sanal sunucunun yeniden başlatılmasına karşılık gelen bir JSON nesnesi ("server-restart" eylem), her zaman "uuid" ve "virtualization_type" anahtarlarını "data" nesnesi içinde içerecek ve başka hiçbir anahtarı içermeyecektir.

Not

Tek bir olay birden çok hooku tetikleyebilir. Örneğin, yeni bir sanal sunucu oluşturmak, hem "server-create" hem de "server-network-create" hooklarını tetikler.

Not

Bir olay yürütme sırasında başarısız olursa (örneğin, bir sanal sunucu oluşturulamazsa), yalnızca "pre" kancalar tetiklenir, ancak "post" hookları tetiklenmez.

Hooka Örnekler#

Bash örneği

  1. "root" kullanıcısı olarak SSH üzerinden yönetim düğümüne veya işlem kaynağına giriş yapın.
  2. Var olmayan bir dizin olan /usr/local/solus/hooks/ dizinini oluşturun.

    mkdir /usr/local/solus/hooks/

  3. Bir dosya oluşturun.

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

  4. Dosyayı çalıştırılabilir yapın.

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

  5. Aşağıdaki içeriği dosyaya yapıştırın.

    #!/bin/bash
    set -xEeuo pipefail
    
    tfile=$(mktemp /tmp/hook_test_$(date "+%Y-%m-%d-%H-%M-%S-%N")_XXX)
    
    cat /dev/stdin | jq > $tfile
    
  6. Sunucuda "jq" programını yükleyin.

    apt install jq veya dnf install jq

Python örneği

  1. "root" kullanıcısı olarak SSH üzerinden yönetim düğümüne veya işlem kaynağına giriş yapın.
  2. Var olmayan bir dizin olan /usr/local/solus/hooks/ dizinini oluşturun.

    mkdir /usr/local/solus/hooks/

  3. Bir dosya oluşturun.

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

  4. Dosyayı çalıştırılabilir yapın.

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

  5. Aşağıdaki içeriği dosyaya yapıştırın.

    #!/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)
    
  6. Sunucuda "json" modülünü yükleyin.

    python -c "help('modules')"

Hookunuzu test etme

  1. "root" kullanıcısı olarak SSH üzerinden yönetim düğümüne veya işlem kaynağına giriş yapın.
  2. Hooka bir JSON nesnesi geçirin, örneğin:

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