Ana içeriğe geç

Kancaları Kullanma

Belirli olayların gerçekleşmesinden önce veya sonra özel komut dosyalarını otomatik olarak çalıştırmak için SolusVM 2'deki kancaları kullanabilirsiniz.

Özetle SolusVM 2'deki kancalar şu şekilde çalışır:

  • Yönetim düğümünde ve/veya herhangi bir bilgi işlem kaynağında özel bir dizin oluşturabilirsiniz. Belirli bir olaya bağlı bir kancanın A ve B bilgi işlem kaynaklarında farklı davranmasını ve C bilgi işlem kaynağında tamamen bulunmamasını sağlayabilirsiniz.

  • Dizine, özel bir komut dosyası içeren bir veya daha fazla yürütülebilir dosya yerleştirmeniz gerekir. Özel komut dosyaları Bash, PHP, Python, Golang, Java veya kendisine iletilen bir JSON dosyasını ayrıştırabilen başka herhangi bir programlama dilinde yazılabilir.

  • Bir sanal sunucu için desteklenen olaylardan biri (bir sanal sunucunun yeniden başlatılması gibi) her gerçekleştiğinde, SolusVM 2, yönetim düğümünde veya söz konusu sanal sunucuyu barındıran bilgi işlem kaynağında bulunan tüm özel komut dosyalarını yürütür. Desteklenen etkinliklerin tam listesini bu konunun devamında bulabilirsiniz. Desteklenmeyen olaylar için kanca oluşturamazsınız. Yapılandırılan her kanca, olay başına iki kez tetiklenir: olayın gerçekleşmesinden önce ve sonra. Kancalar, 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 kanca tetiklendiğinde, SolusVM 2 ona şu bilgileri içeren bir JSON nesnesi iletir: olayın türü, kancanın olaydan önce mi yoksa sonra mı tetiklendiği ve ayrıca sanal sunucunun kimliği gibi belirli ilgili veriler söz konusu.

Örneğin yeni bir sanal sunucu oluşturulurken "sanal sunucu oluşturuldu" olayı tetiklenir. Diğer verilerin yanı sıra yeni oluşturulan sanal sunucunun IP adresini de iletir. Gelen JSON nesnesini ayrıştıracak, bu verileri alacak ve onu barındıran işlem kaynağında gerekli güvenlik duvarı kurallarını oluşturmak için kullanabilecek özel bir komut dosyası oluşturabilirsiniz.

Kanca Oluşturma

Başka hangi komut dosyalarının veya komutların yürütüleceğini belirleyecek başlangıç noktası olarak tek bir dosya kullanmanızı öneririz.

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

  1. Yönetim düğümünde veya bilgi işlem kaynağında SSH aracılığıyla "kök" kullanıcı olarak oturum açın.

  2. Eğer mevcut değilse /usr/local/solus/hooks/ adında bir dizin oluşturun.

mkdir /usr/local/solus/hooks/

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

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

  1. Dosyayı yürütülebilir hale getirin.

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

Artık kancanız oluşturuldu. Yürütülebilir dosya, desteklenen bir etkinlik her gerçekleştiğinde çalıştırılacaktır. SolusVM 2'yi yalnızca belirli olaylar için belirli yürütülebilir dosyaları çalıştıracak şekilde yapılandıramazsınız. Özel komut dosyasının JSON nesnesini ayrıştırabilmesi ve içeriğine bağlı olarak belirli eylemleri gerçekleştirebilmesi gerekir.

Desteklenen bir olay gerçekleştiğinde, tüm yapılandırma kancaları (varsa) tetiklenir. Eylem, tüm özel komut dosyaları çıkıncaya kadar veya bir dakika geçene kadar (hangisi önce gelirse) SolusVM 2 tarafında duraklatılır. Örneğin, bir sanal sunucu yeniden başlatıldığında ve yönetim düğümünde veya bu sanal sunucuyu barındıran bilgi işlem kaynağında yapılandırılmış bir veya daha fazla kanca olduğunda şunlar olur:

  1. Sanal sunucuyu yeniden başlatma komutu GUI, CLI veya API aracılığıyla verilir.
  2. SolusVM 2, /usr/local/solus/hooks/ dizinindeki tüm yürütülebilir dosyaları çalıştırır ve her birine, desteklenen olay kimliği ve "ön" aşama göstergesi de dahil olmak üzere ilgili tüm bilgileri içeren JSON nesnesini iletir.
  3. Tüm yürütülebilir dosyalar çıkar veya bir dakika geçer.
  4. Sanal sunucu yeniden başlatılır.
  5. SolusVM 2, /usr/local/solus/hooks/ dizinindeki tüm yürütülebilir dosyaları çalıştırır ve her birine, desteklenen olay kimliği ve "post" aşama göstergesi de dahil olmak üzere ilgili tüm bilgileri içeren JSON nesnesini iletir.

Note

/usr/local/solus/hooks/ dizinine kancalardan başka dosya yerleştirmeyin.

JSON Nesne Anatomisi

Kancanız, geçerli JSON formatında stdin (standart giriş) ile ilgili verileri beklemelidir. Tetikleyici bir olay her gerçekleştiğinde, ilgili tüm verileri içeren bir JSON nesnesi /usr/local/solus/hooks/ dizinindeki her ikili dosyaya aktarılır. Bu nesne şu şekilde görünebilir:

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

Burada "eylem", kancayı ne tür bir olayın tetiklediğini belirtir (bu durumda, bir sanal sunucunun yeniden başlatılması), "aşama" olayın gerçekleşmek üzere mi yoksa yeni mi gerçekleştiğini (bu durumda ilki) belirtir ve "veri" olayla ilgili bilgileri belirtir (bu durumda sanal sunucu kimliği ve sanallaştırma türü). Dolayısıyla, söz konusu nesne bize "c7ee19aa-2722-4139-9223-60ed4baf09e2" kimliğine sahip KVM tabanlı sanal sunucunun yeniden başlatılmak üzere olduğunu ve kanca tarafından çağrılan özel komut dosyasının örneğin kullanılabileceğini söylüyor. sanal sunucunun sahibine bildirin.

"Aksiyon", "aşama" ve "veri" tuşları her zaman mevcuttur.

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

  • "İşlem" 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"

  • "Veri" nesnesi, farklı değerlere sahip olabilen bir dizi anahtar içerir. Bir veya daha fazla özel tuş, her bir spesifik "eylem" tuşuna karşılık gelir. Örneğin, yeniden başlatılan bir sanal sunucuya karşılık gelen bir JSON nesnesi ("sunucuyu yeniden başlatma" eylemi), her zaman "data" nesnesi içindeki "uuid" ve "virtualization_type" anahtarlarını içerecektir, başkalarını asla içermeyecektir.

Note

Tek bir olay birden fazla kancayı tetikleyebilir. Örneğin, yeni bir sanal sunucu oluşturmak hem "sunucu oluşturma" hem de "sunucu-ağ oluşturma" kancalarını tetikler.

Note

Yürütme sırasında bir olay başarısız olursa (örneğin, sanal sunucu oluşturulamıyorsa), yalnızca "ön" kancalar tetiklenir, ancak "post" kancalar tetiklenmez.

Kanca Örnekleri

Bash örneği

  1. Yönetim düğümünde veya bilgi işlem kaynağında SSH aracılığıyla "kök" kullanıcı olarak oturum açın.

  2. Eğer mevcut değilse /usr/local/solus/hooks/ adında bir dizin oluşturun.

mkdir /usr/local/solus/hooks/

  1. Bir dosya oluşturun.

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

  1. Çalıştırılabilir hale getirin.

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

  1. 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
    
  2. Sunucuya "jq" programını yükleyin.

apt install jq veya dnf install jq

Python örneği

  1. Yönetim düğümünde veya bilgi işlem kaynağında SSH aracılığıyla "kök" kullanıcı olarak oturum açın.

  2. Eğer mevcut değilse /usr/local/solus/hooks/ adında bir dizin oluşturun.

mkdir /usr/local/solus/hooks/

  1. Bir dosya oluşturun.

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

  1. Çalıştırılabilir hale getirin.

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

  1. 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)
    
  2. Sunucuya "json" modülünü kurun.

python -c "help('modules')"

Kancanızı test ediyoruz

  1. Yönetim düğümünde veya bilgi işlem kaynağında SSH aracılığıyla "kök" kullanıcı olarak oturum açın.
  2. Kancanıza bir JSON nesnesi iletin, örneğin:

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