Frontend scripty a sudo v Zabbixu

Co nás čeká?

V tomto článku si ukážeme, jak jednoduše aktivovat globální frontend skripty v Zabbixu a předvedeme tři efektivní a snadno použitelné příklady.

Výběr operačního systému

Návod obsahuje postup pro RHEL platformy na verzi 9, kde stačí případně jen poupravit repozitáře. Návod pro Debian je připraven pro verzi 12, která je aktuálně poslední podporovanou verzí.

Alma/CentOS/RHEL/Rocky 9
Debian 12

Povolení globálních skriptů

Od Zabbix verze 7.0 jsou globální frontend skripty standardně zakázány z bezpečnostních důvodů. Tato restrikce je součástí snahy o vyšší bezpečnost prostředí Zabbix serveru. Globální skripty však mohou výrazně usnadnit správu, proto pokud chcete využívat jejich výhody, musíte je explicitně povolit.

Defaultně je v konfiguraci Zabbix serveru nastavena hodnota EnableGlobalScripts=0, což znamená, že je tato funkce vypnutá. Pokud se pokusíte spustit skript bez povolení, objeví se chyba:

„Global script execution on Zabbix server is disabled by server configuration.“

Zda jsou globální skripty povolené, můžete také jednoduše zkontrolovat přímo v GUI v sekci Reports → System information v položce „Global scripts on Zabbix server“. Pokud je toto nastavení již povoleno, řádek s touto položkou se ve výpisu nezobrazuje. 

Pro povolení globálních skriptů postupujte následovně:

Upravte konfigurační soubor Zabbix serveru příkazem:

nano /etc/zabbix/zabbix_server.conf

V souboru vyhledejte řádek s hodnotou EnableGlobalScripts=0 a změňte ho na:

EnableGlobalScripts=1

Tato změna povoluje provádění globálních skriptů.

Restartujte službu Zabbix serveru:

systemctl restart zabbix-server

Po tomto kroku můžete v Zabbixu globální skripty využívat.

Zprovoznění předdefinovaných frontend skriptů (nmap a traceroute)

Zabbix obsahuje několik užitečných frontend skriptů již ve výchozím stavu, ovšem často nejsou ihned funkční kvůli chybějícím systémovým balíčkům nebo nedostatečným oprávněním. Ukážeme si, jak zprovoznit dva z těchto předdefinovaných skriptů – konkrétně nmap a traceroute.

Instalace potřebných balíčků

Na Zabbix serveru nebo proxy nainstalujte balíčky:

dnf install nmap traceroute
apt install nmap traceroute

Nastavení sudo pravidla

Aby Zabbix mohl spouštět příkazy s vyššími oprávněními (v tomto případě pro nástroj nmap), vytvořte speciální sudoers soubor, například /etc/sudoers.d/zabbix_scripts, a vložte do něj následující obsah:

nano /etc/sudoers.d/zabbix_scripts

A vložte následující obsah:

zabbix ALL=(ALL) NOPASSWD: /usr/bin/nmap

Toto pravidlo umožní uživateli zabbix spouštět příkaz nmap bez nutnosti zadávat heslo, což zajistí správnou funkčnost skriptu ve frontendovém rozhraní.
Pravidla v souboru sudoers definují, jaké příkazy mohou uživatelé spouštět s oprávněními root bez nutnosti autentizace. Další příkazy lze přidávat na samostatné řádky stejným způsobem.

Uložte soubor a ověřte správnou syntaxi příkazem:

visudo -cf /etc/sudoers.d/zabbix_scripts

Pokud kontrola projde bez chyb, můžete nyní používat frontend skripty nmap a traceroute přímo ze Zabbix rozhraní.

Příklad 1 – Vypsání konfiguračního souboru Zabbix agenta

Nyní si ukážeme, jak vytvořit vlastní frontend skript v Zabbix GUI, který načítá konfiguraci Zabbix agenta s rozlišením verze agenta. Nejdříve je potřeba povolit spouštění vlastních skriptů na straně Zabbix agenta.

Povolení skriptů v konfiguraci Zabbix agenta (Agent i Agent 2)

Na vzdáleném hostovi upravte konfiguraci Zabbix agenta příkazem podle typu agenta:

  • Pro klasický Zabbix agent:
nano /etc/zabbix/zabbix_agentd.conf
  • Pro Zabbix agent 2:
nano /etc/zabbix/zabbix_agent2.conf

Povolení DenyKey

Pokud ještě nemáte povolenou tuto možnost, je potřeba ji nejprve aktivovat.

V konfiguraci nejprve najděte a odkomentujte řádek s DenyKey:

DenyKey=system.run[*]

Před řádek s pravidlem DenyKey vložte pravidlo AllowKey., které povolí spuštění pouze konkrétního skriptu (nikdy nepoužívejte obecné pravidlo s *, které může být bezpečnostním rizikem):

AllowKey=system.run[pgrep -a 'zabbix_agent2' >/dev/null && { echo "==== Zabbix Agent 2 Configuration ===="; grep -Ev '^#|^$' /etc/zabbix/zabbix_agent2.conf; } ; pgrep -a 'zabbix_agentd' >/dev/null && { echo "==== Zabbix Agent (Classic) Configuration ===="; grep -Ev '^#|^$' /etc/zabbix/zabbix_agentd.conf; }]

Poté restartujte službu agenta podle typu:

  • Zabbix agent:
systemctl restart zabbix-agent
  • Zabbix agent 2:
systemctl restart zabbix-agent2

Vytvoření skriptu ve frontendu

Postupujte následovně:

  • Přejděte do sekce Alerts → Scripts.
  • Klikněte na tlačítko Create script.
  • Vyplňte pole:
    • Name: Například „Zabbix Agent Config“.
    • Scope: Vyberte „Manual host action“.
    • Type: Vyberte „Script“.
    • Execute on: Vyberte „Zabbix agent“.
    • Commands: Vložte následující příkaz:
pgrep -a 'zabbix_agent2' >/dev/null && { echo "==== Zabbix Agent 2 Configuration ===="; grep -Ev '^#|^$' /etc/zabbix/zabbix_agent2.conf; } ; pgrep -a 'zabbix_agentd' >/dev/null && { echo "==== Zabbix Agent (Classic) Configuration ===="; grep -Ev '^#|^$' /etc/zabbix/zabbix_agentd.conf; }

Dále je možné (volitelně) vyplnit následující nastavení:

  • Description – popis účelu skriptu
  • Host group – omezení použití pouze pro určité skupiny hostů
  • User group – omezení použití pouze pro určité uživatelské skupiny
  • Možnosti nastavení Required host permissions:
    • Read – Uživatelé s oprávněním „Read“ k hostovi mohou skript spustit.
    • Write – Skript lze spustit pouze s oprávněním „Write“ k hostovi.
  • Klikněte na tlačítko Add.

Příklad 2 – Zobrazení posledních 10 řádků Zabbix agent logu

Pokud chcete mít možnost zobrazit posledních 10 řádků ze Zabbix agent logu přímo přes frontend, můžete vytvořit tento skript:

Na vzdáleném hostovi upravte konfiguraci Zabbix agenta příkazem podle typu agenta:

  • Pro klasický Zabbix agent:
nano /etc/zabbix/zabbix_agentd.conf
  • Pro Zabbix agent 2:
nano /etc/zabbix/zabbix_agent2.conf

Povolení DenyKey

Pokud ještě nemáte povolenou tuto možnost, je potřeba ji nejprve aktivovat.

V konfiguraci nejprve najděte a odkomentujte řádek s DenyKey:

DenyKey=system.run[*]

Před řádek s pravidlem DenyKey vložte pravidlo AllowKey, které povolí spuštění pouze konkrétního skriptu (nikdy nepoužívejte obecné pravidlo s *, které může být bezpečnostním rizikem):

AllowKey=system.run[echo 'Last 10 lines from Zabbix agent log on server *:'; tail -n 10 /var/log/zabbix/zabbix_agent*.log]

Poté restartujte službu agenta podle typu:

  • Zabbix agent:
systemctl restart zabbix-agent
  • Zabbix agent 2:
systemctl restart zabbix-agent2

Ve frontendu vytvořte skript s nastavením:

  • Name: Například „Show agent log“.
  • Scope: Vyberte „Manual host action“.
  • Type: Vyberte „Script“.
  • Execute on: Vyberte „Zabbix agent“.
  • Commands: Vložte následující příkaz:
echo 'Last 10 lines from Zabbix agent log on server {HOST.HOST}:'; tail -n 10 /var/log/zabbix/zabbix_agent*.log

Opět volitelně nastavte popis, host group nebo user group dle potřeb.

Nakonec klikněte na tlačítko Add.

Příklad 3 – Povolení restartu aplikace pomoci Zabbix agenta

Nastavení sudo pravidla

Aby Zabbix mohl spouštět příkazy s vyššími oprávněními (v tomto případě restart aplikace  crondrsyslog), vytvořte speciální sudoers soubor, například /etc/sudoers.d/zabbix_scripts, a vložte do něj následující obsah:

nano /etc/sudoers.d/zabbix_scripts

A vložte následující obsah:

zabbix ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart rsyslog
zabbix ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart crond

Tyto pravidla umožní uživateli zabbix spouštět příkazy pro restart bez nutnosti zadávat heslo.

Uložte soubor a ověřte správnou syntaxi příkazem:

visudo -cf /etc/sudoers.d/zabbix_scripts

Na vzdáleném hostovi upravte konfiguraci Zabbix agenta příkazem podle typu agenta:

  • Pro klasický Zabbix agent:
nano /etc/zabbix/zabbix_agentd.conf
  • Pro Zabbix agent 2:
nano /etc/zabbix/zabbix_agent2.conf

Povolení DenyKey

Pokud ještě nemáte povolenou tuto možnost, je potřeba ji nejprve aktivovat.

V konfiguraci nejprve najděte a odkomentujte řádek s DenyKey:

DenyKey=system.run[*]

Před řádek s pravidlem DenyKey vložte pravidlo AllowKey, které povolí spuštění pouze konkrétního skriptu (nikdy nepoužívejte obecné pravidlo s *, které může být bezpečnostním rizikem):

AllowKey=system.run[sudo systemctl restart rsyslog && echo "Service * restarted successfully." || echo "Restart of service * failed."]
AllowKey=system.run[sudo systemctl restart crond && echo "Service * restarted successfully." || echo "Restart of service * failed."]

Poté restartujte službu agenta podle typu:

  • Zabbix agent:
systemctl restart zabbix-agent
  • Zabbix agent 2:
systemctl restart zabbix-agent2

Vytvoření skriptu pro restart služby s výběrem z menu

Nová funkcionalita v Zabbix 7.0 umožňuje použití uživatelského vstupu s dropdown menu. Tímto způsobem umožníme uživatelům vybrat, kterou službu chtějí restartovat (například rsyslog nebo crond).

  • Přejděte do sekce Alerts → Scripts.
  • Klikněte na tlačítko Create script.
  • Vyplňte pole:
    • Name: „Restart service“.
    • Scope: „Manual host action“.
    • Type: „Script“.
    • Execute on: „Zabbix agent“.
    • Commands: Vložte následující příkaz:
sudo systemctl restart {MANUALINPUT} && echo "Service {MANUALINPUT} restarted successfully." || echo "Restart of service {MANUALINPUT} failed."

Přidání dropdown menu

  • Klikněte na Advanced configuration.
  • Zaškrtněte Enable user input.
  • Do pole Input prompt zadejte: Service name.
  • Input type vyberte: Dropdown.
  • Do Dropdown options zadejte:
    • Enable user input: Zaškrtněte.
    • Input prompt: „Service name“.
    • Input type: Vyberte Dropdown.
    • Dropdown options: Zadejte rsyslog,crond.
  • Klikněte na tlačítko Add a můžete používat nový skript přímo z GUI.
rsyslog,crond
  • Uložte změny.

Příklad spuštění skriptu

Jakmile jsou skripty vytvořené (v Alerts → Scripts a nastavené jako Manual host action), zobrazí se při levém kliknutí na host v sekci Monitoring → Hosts v kontextové nabídce (viz obrázky). Tam pak stačí vybrat konkrétní skript (například Restart service nebo Show agent log). Stejné skripty lze obdobným způsobem spustit i v mapách – kliknutím na ikonu hosta se otevře nabídka s dostupnými akcemi. Tímto způsobem máš rychlý přístup k ovládání hostů přímo z přehledu nebo z mapy.

Frontend scripts timeout

  • Před verzí 7.0: Timeout byl řízen parametrem Timeout= v konfiguračních souborech Zabbix serveru (zabbix_server.conf) a Zabbix agenta (zabbix_agentd.conf nebo zabbix_agent2.conf) s rozsahem 1-30 sekund a vztahoval se pouze na pasivní kontroly.
  • Od verze 7.0: Timeout se nastavuje přímo ve frontendu a vztahuje se i na aktivní kontroly. Výchozí hodnota je 60 sekund, rozsah lze nastavit v rozmezí 1-300 sekund. U aktivních kontrol je potřeba brát v úvahu také nastavení refresh intervalu, který definuje, jak často agent načítá novou konfiguraci a tím i frekvenci dotazů na nové hodnoty. Výchozí hodnota tohoto intervalu je 5 sekund, což může ovlivnit chování timeoutu. Pokud je timeout kratší než refresh interval, požadavek na kontrolu se nemusí nikdy provést, proto je potřeba zvolit hodnoty v souladu s tímto nastavením.

Jak změnit timeout ve frontendu

  • Přejděte do Administration → General → Timeouts.
  • Najděte možnost Script execution.
  • Změňte hodnotu podle potřeby (rozsah 1-300 sekund).
  • Klikněte na Update.

Wait vs. Nowait u system.run v action operations

Zabbix umožňuje při použití system.run v action skriptech definovat, zda má příkaz běžet v režimu Wait (výchozí) nebo Nowait.
Rozdíl mezi Wait a Nowait

  • Wait (výchozí chování) – Skript se spustí a Zabbix čeká na jeho dokončení, než provede další kroky v rámci akce.
  • Nowait – Skript se spustí, ale Zabbix nečeká na jeho dokončení – okamžitě pokračuje dál.

Kde lze použít Nowait?

  • Nowait je možné použít pouze v action skriptech (např. v sekci Action operations v Zabbixu).
  • Nelze jej použít v běžných frontend skriptech, kde Zabbix vždy čeká na výsledek.

Jak správně nastavit AllowKey pro Nowait?
Pokud je v AllowKey povolen konkrétní příkaz, např.:

AllowKey=system.run[myscript.sh]

…pak varianta s nowait nebude fungovat (system.run[myscript.sh,nowait]).
Správné řešení:
Aby bylo možné použít nowait, je nutné povolit hvězdičkový zápis:

AllowKey=system.run[myscript.sh,*]

Pozor: Pokud v konfiguraci není povolen nowait, může Zabbix odmítnout provedení skriptu s touto volbou.
Kdy použít Wait a kdy Nowait?

  • Wait (synchronní provedení) – Hodí se pro krátké skripty, kde je nutné znát výsledek příkazu před provedením dalších operací.
  • Nowait (asynchronní provedení) – Vhodné pro dlouhotrvající úlohy, kde není potřeba čekat na výsledek (např. restart služby, spuštění skriptu na pozadí).

Krátké tipy

  • Bezpečnost a oprávnění
    Ujisti se, že máš správně nastavené uživatelské a host groupy, které mohou skripty spouštět. Příliš široké nastavení oprávnění může vést k bezpečnostním rizikům.
  • SELinux / firewall
    Pokud máš aktivní SELinux či firewall, může být nutné provést další kroky (např. povolit potřebné porty nebo upravit SELinux pravidla), aby skripty fungovaly bez omezení.
  • Záloha a logování
    Než provedeš změny v konfiguračních souborech Zabbixu, vytvoř si zálohu. Pokud se objeví chyby, zkontroluj log Zabbix serveru či agenta (typicky v /var/log/zabbix/), abys mohl rychle odhalit případné problémy.
  • Ověření funkčnosti
    Po úpravách a restartu služeb vždy proveď testovací spuštění skriptů, abys ověřil, že veškeré změny proběhly správně a skripty se dají spustit bez chyb.
  • Doba běhu skriptů (timeout)
    Pokud se skript nespustí nebo se ukončí s chybou, může být problém s nastaveným timeoutem. Ten můžeš upravit v Administration → General → Timeouts (položka „Script execution“). Pro běžné operace obvykle stačí výchozích 60 sekund, ale při rozsáhlejších skriptech může být potřeba hodnotu zvýšit.
×Košík

Your cart is empty.