Hookscript (lub snippety) w systemie Proxmox są skryptami wykonywanymi automatycznie w pewnych cyklach życia maszyny wirtualnej. Wykonują one określone czynności przed lub po wystąpieniu zdarzenia. Takim zdarzeniem może być np. uruchomienie lub wyłączenie maszyny wirtualnej. Skrypty mają szerokie zastosowanie i możemy ich używać, m.in. do:
- wysyłania powiadomień o określonych zdarzeniach,
- automatycznego ustawianiu konfiguracji sieciowej dla wirtualnych maszyn lub kontenerów po wystąpieniu zdarzenia,
- automatyzacji kopii zapasowych,
- wykonywanie akcji po wykryciu nadmiernego obciążenia, np. uruchomienie kolejnych zasobów lub migracja na inny serwer,
- wysyłanie informacji o zdarzeniach od systemów monitoringu
Cała funkcjonalność nie jest dobrze udokumentowana i najlepiej rozwiązań szukać na oficjalnym forum Proxmoxa.
Promocja na kursy z Cyberbezpieczeństwa!
Zapisy przyjmujemy do 13 listopada do 23:59! . Skorzystaj z promocji: https://asdevops.pl/nis2-promocja/
Konfiguracja środowiska Hookscript
Aby skorzystać z hookscriptów należy w pierwszym kroku utworzyć miejsce dla naszych skryptów. Zaleca się, aby przechowywać je w lokalizacji snippest na zasobie lokalnym. Jak przygotować taki zasób? Sprawa jest banalnie prosta. W drzewku, gdzie mamy nasze hosty przechodzimy na jego szczyt, czyli Datacenter. Następnie z dostępnych opcji wybieramy Storage i z niego wybieramy lokalny zasób local i jako kontent dodajemy Snippets.
W tym momencie zostanie utworzony katalog w lokalizacji /var/lib/vz/snippets, do którego należy zapisywać wszystkie hookscripty.
Po tej operacji, konfiguracja lokalnego zasobu powinna wyglądać następująco
Katalog Snippets służy do przechowywania skryptów konfiguracji. Znacznie ułatwia to dostęp, a także zarządzanie skryptami. Należy pamiętać o regularnej kopii zapasowej katalogu ze skryptami, by nie stracić efektów naszej pracy.
Używanie Hookscript
Obsługa skryptów odbywa się tylko i wyłącznie przez CLI. Na tą chwilę nie ma możliwości obsługi przez przeglądarkę internetową.
Przykładowy skrypt do obsługi zdarzeń można znaleźć w lokalizacji /usr/share/pve-docs/examples. Plik o nazwie quest-example-hookscript.pl jest napisany w języku perl, a także można go modyfikować pod swoje potrzeby. Można go użyć zarówno do maszyn wirtualnych jak i kontenerów LXC.
Najpierw skrypt wypisuje informacje o hooku. Przekazuje na standardowe wyjście argumenty, które zostały przekazane do skryptu.
Zmienna $vimid zwraca id maszyny wirtualnej, na której został uruchomiony skrypt.
Zmienna $phase zawiera wartość drugiego argumentu, który wykorzystamy później do określenia zdarzenia jakie zaszło.
Dalsza część skryptu to instrukcja warunkowa IF, która sprawdza jakie zdarzenie zaszło w kontekście maszyny wirtualnej. Skrypt obsługuje cztery typy zdarzeń:
- Pre-start: Wykonywane przed rozpoczęciem uruchamiania maszyny wirtualnej.
- Post-start: Wykonywane po pomyślnym uruchomieniu maszyny wirtualnej.
- Pre-stop: Wykonywane przed zatrzymaniem maszyny wirtualnej.
- Post-stop: Wykonywane po zatrzymaniu maszyny wirtualnej.
Przykład użycia
Na sam początek spróbujemy zrobić przykład, który nie wykonuje żadnych czynności, ale demonstruje jak działają skrypty przechwytujące. Zakładam, że przygotowałeś środowisko i masz już katalog /var/lib/vz/snippets do przechowywania skryptów.
Wykorzystajmy jako szablon powyższy skrypt.
1. Kopiujemy plik z przykładową składnią do katalogu snippets
copy /usr/share/pve-docs/examples/guest-exmaple-hookscript.pl /var/lib/vz/snippets/przyklad1.pl
2. Następnie plik przyklad1.pl, który skopiowaliśmy do lokalizacji snippets przypisujemy wybranej maszynie wirtualnej. Ja na potrzeby laba użyję maszyny o numerze ID 104.
Są dwa sposoby by przypisać skrypt do maszyny wirtualnej:
- edycja pliku konfiguracyjnego maszyny wirtualnej
nano /etc/pve/qemu-server/104.conf
i dodanie następującego wpisu na koniec pliku:
hookscript: local:snippets/przyklad1.pl
- wykonanie polecenia qm
qm set 104 -hookscript local:snippets/przyklad1.pl
3. Jakiego sposobu byśmy nie wybrali, to informacja o naszym hookscripcie będzie dostępna w Options naszej maszyny wirtualnej.
Wszystko jest już skonfigurowane, teraz przetestujmy czy nasze zmiany będą działać tak, jak zakładaliśmy, Po wykonaniu polecenia qm start 104, maszyna zostanie uruchomiona i możemy zauważyć, że zdarzenia na start zadziałały prawidłowo. Skrypt zareagował na zdarzenie przed, a także po starcie wirtualnej maszyny.
Praktyczne przykłady
Dość tej teorii, czas na praktyczne przykłady. Jak hookscripty ułatwiły mi pracę z maszynami wirtualnymi?
Przykład 1: Uruchamianie zestawu maszyn wirtualnych
W moim labie mam wiele maszyn, a że zasoby są ograniczone, to nie wszystkie są uruchomione. Mój scenariusz zakłada, że mamy potrzebę uruchomienia kilku maszyn do naszego projektu. Wystarczy, że uruchomimy maszynę o ID 104, a automatycznie uruchomi się po starcie maszyna o ID 103. Oto przykład:
1. Wyedytujmy plik przyklad1.pl
2. Następnie dodajemy jedną linijkę, która wykona polecenie qm start 103
w języku perl wykorzystujemy do tego funkcję system();
3. Kolejna modyfikacja, to dodanie linii w instrukcji warunkowej dla zdarzenia pre-stop, które spowoduje zatrzymanie maszyny o ID 103 w przypadku wyłączenia maszyny o ID 104
4. Następnie po zapisaniu zmian można przetestować skrypt uruchamiając maszynę o ID 104 poleceniem qm start 104 lub z interfejsu webowego.
5. Jeśli chcielibyśmy sterować zachowaniem kontenerów, zamiast polecenia qm używamy komendy pct, np, pct start 102 uruchomi kontener o ID 102.
Przykład 2: Stałe hasło dla klienta VNC
Aby dodać możliwość łączenia się klientem VNC do maszyny wirtualnej należy użyć polecenia agrs w pliku konfiguracyjnym maszyny wirtualnej, ale nie o tym tu będziemy pisać. Będziemy tu pisać o tym, jak obejść funkcjonalność Proxmoxa, która po każdym restarcie maszyny kasuje hasło do VNC.
Skrypt jest stworzony na potrzeby laba i nie zalecam używać go na środowiskach produkcyjnych, gdyż hasło VNC jest bardzo przewidywalne i może być łatwo złamane.
Oto przykładowy kod:
system('pvesh create /nodes/localhost/qemu/' . $vmid . '/monitor -command "set_password vnc haslo.$vmid.' -d vnc2"');
Po zapisaniu skryptu i dodaniu go do pliku konfiguracyjnego każdej maszyny wirtualnej, gdzie mamy skonfigurowane połączenie VNC przy pomocy args, hasło będzie zmieniać się za każdym razem gdy tylko się uruchomi. Skrypt wprowadza hasło, które jest inne dla każdej maszyny, a także brzmi ono „haslo104”, „haslo103’„ gdzie liczba po słowie hasło to ID VM.
Hookscript – Podsumowanie
Jak widać hookscript może mieć szerokie zastosowanie. Przykłady jakie powyżej przedstawiłem są napisane w języku Perl, ale nic nie stoi na przeszkodzie by zastosować tradycyjny Bash. Mam nadzieję, że udało mi się zainteresować Was tematem hookscript. Moim zdaniem ma słabą dokumentację, ale sporo wiedzy można znaleźć na forum Proxmoxa.
Autor: Rafał Lesiński
Chcesz poszerzyć swoją wiedzę na temat Proxmoxa i Wirtualizacji Serwerów? Zobacz nasz kurs!