Co je bhyve?
V nedávném článku jsme podrobně rozebrali virtualizační technologii bhyve, zdůraznili její výhody a ukázali, jak snadno ji lze implementovat pomocí aplikace vm z balíčku vm-bhyve. Přestože má tato technologie řadu přínosů, v širším kontextu IT průmyslu zůstává relativně málo známá a její praktické využití je zatím omezené. V důsledku toho pro ni existuje jen omezené množství specializovaných monitorovacích nástrojů.
Na fóru FreeBSD se objevilo několik diskuzí na toto téma, kde uživatelé sdíleli zkušenosti s různými monitorovacími nástroji. Nebyla tam ale nabídnuta žádná přímá řešení nebo nástroje, které by se daly jednoduše implementovat pro monitorování bhyve.
Vzhledem k mé dlouhodobé preferenci Zabbixu jsem se rozhodl hledat způsoby, jak integrovat monitorování bhyve s tímto robustním systémem. Tento proces zahrnoval hledání metod pro získávání informací o objektech bhyve a přenos těchto dat do Zabbixu. Tento článek se zaměřuje na popis celého průzkumu a nabízí průvodce pro ty, kteří chtějí Zabbix využít pro efektivní monitorování bhyve.
Jak monitorovat?
V předchozím článku jsme se věnovali aplikaci vm, klíčové součásti balíčku vm-bhyve, která je nezbytná pro efektivní sběr dat, například o virtuálních hostech. Zatímco Zabbix nabízí široké spektrum možností pro zpracování dat, včetně výstupu z aplikace vm, optimalizace tohoto procesu je klíčová. Namísto složitého parsování tradičních textových výstupů, často vyžadujících použití regulárních výrazů, je přístup založený na strukturovaném formátu dat výrazně efektivnější.
V tomto kontextu jsem prozkoumal možnosti využití JSON (JavaScript Object Notation) pro získávání seznamu hostů. JSON je lehký formát pro výměnu dat, který je snadno čitelný pro lidi a zároveň jednoduše zpracovatelný pro počítače. Jeho syntaxe je odvozena z objektů JavaScriptu, ale jeho použití je univerzální a není omezeno jen na JavaScript. Tento jazykově nezávislý formát se stává stále populárnějším v různých programovacích jazycích.
Zabbix využívá JSONPath pro zpracování dat ve formátu JSON, což zjednodušuje integraci a zvyšuje efektivitu monitorovacích operací. Díky JSONu můžeme přistupovat k datům strukturovaně, což nám umožňuje lépe automatizovat a optimalizovat proces sběru a analýzy dat v rámci Zabbixu.
Aplikace vm z balíčku vm-bhyve
V současné době aktuální verze ještě nepodporuje JSON, nicméně již byl podán pull request, který má za cíl tuto funkcionalitu implementovat. Vzhledem k tomuto vývoji jsem se rozhodl využít tuto nadcházející vlastnost vm pro rozšíření monitorovacích schopností v Zabbixu.
# pkg info vm-bhyve-1.5.0 vm-bhyve-1.5.0 Name : vm-bhyve Version : 1.5.0 Installed on : Wed Jul 26 22:41:27 2023 CEST Origin : sysutils/vm-bhyve Architecture : FreeBSD:13:* Prefix : /usr/local Categories : sysutils Licenses : BSD2CLAUSE Maintainer : churchers@gmail.com WWW : https://github.com/churchers/vm-bhyve Comment : Management system for bhyve virtual machines Options : BHYVE_FIRMWARE : off EXAMPLES : on GRUB2_BHYVE : off TMUX : off Annotations : repo_type : binary repository : FreeBSD Flat size : 243KiB Description : A frontend for bhyve which provides the 'vm' command Create/start/stop virtual machines easily Bridged/NAT networking BSD/Linux/Windows guest support WWW: https://github.com/churchers/vm-bhyve
Jak získat podporu
Podpora JSONu je realizována přidáním nového parametru -j. Abychom tento parametr efektivně využili, je potřeba provést několik kroků. Například, můžeme postupovat takto:
# cd /opt # git clone -b json-lists https://github.com/runhyve/vm-bhyve # cd /opt/vm-bhyve # /opt/vm-bhyve/vm list -j
Zavolání utility s volbami vm list -j produkuje výstup se seznamem všech virtuálních strojů a jejich parametry.
{
"machines": [
{
"name": "debian12",
"datastore": "default",
"loader": "grub",
"cpu": "1",
"memory": "512M",
"vnc": "-",
"auto": "No",
"state": "Stopped"
},{
"name": "fbsd14",
"datastore": "default",
"loader": "bhyveload",
"cpu": "1",
"memory": "512M",
"vnc": "-",
"auto": "No",
"state": "Stopped"
}
]
}
Pro přenos JSON dat do Zabbixu je nezbytné nastavit uživatelské parametry v Zabbix agentovi. Tento krok umožní agentovi rozpoznat a použít nové klíče, které jsou klíčové pro získávání JSON dat pro následné zpracování v Zabbixu. Tímto způsobem efektivně rozšíříme funkcionalitu agenta a zpřístupníme mu nové možnosti pro monitorování a sběr dat.
# cat /usr/local/etc/zabbix6/zabbix_agentd.conf.d/zbx.bhyve.conf UserParameter=zbx.bhyve.vm.list,/usr/local/bin/sudo /usr/local/bin/zabbix-bhyve-list UserParameter=zbx.bhyve.vm.switch.list,/usr/local/bin/sudo /usr/local/bin/zabbix-bhyve-switch-list UserParameter=zbx.bhyve.vm.datastore.list,/usr/local/bin/sudo /usr/local/bin/zabbix-bhyve-datastore-listcat /usr/local/bin/zabbix-bhyve-list
# example cmd
cat /usr/local/bin/zabbix-bhyve-list
#!/bin/sh cd /opt/vm-bhyve /opt/vm-bhyve/vm list -j
Každý z nově vytvořených klíčů v Zabbixu slouží k sběru dat o různých prvcích, jako jsou hosté, switche a datová úložiště. Pro každou položku (item) je nastaven procesing pomocí JSONPath, s jednoduchými definicemi: $.machines pro hosty, $.switches pro switche a $.datastores pro datová úložiště. Tento přístup umožňuje efektivní extrakci a zpracování specifických dat z JSON struktury pro každou sledovanou kategorii.
LLD – Low Level Discovery
Pro automatické objevování jednotlivých virtuálních hostů na základě sbíraných dat je klíčové definovat pravidla Low-Level Discovery (LLD) v Zabbixu. Tato objevení se realizují pomocí typu položky (item) „Dependent item“ a definují LLD makro – {#BHYVE_NAME}, opět s jednoduchou JSONPath definicí $.name. Dále se pro jednotlivá discovery musí nadefinovat item prototypy a jejich processing již vypadá poněkud složitěji.
Kromě definice pravidel LLD je také důležité nastavit item prototypy pro každé objevení. Procesing těchto item prototypů je obvykle složitější, jelikož vyžaduje specifičtější konfiguraci a definici pro správné zachycení a zpracování relevantních dat z virtuálních hostů.V tabulce je přehled prototypů pro objevení hostů.
| Item name | Item key | Processing JSONPath |
|---|---|---|
| VM Host {#BHYVE_NAME} auto | zbx.bhyve.vm.auto[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].auto.first() |
| VM Host {#BHYVE_NAME} cpu | zbx.bhyve.vm.cpu[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].cpu.first() |
| VM Host {#BHYVE_NAME} datastore | zbx.bhyve.vm.datastore[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].datastore.first() |
| VM Host {#BHYVE_NAME} loader | zbx.bhyve.vm.loader[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].loader.first() |
| VM Host {#BHYVE_NAME} memory | zbx.bhyve.vm.memory[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].memory.first() |
| VM Host {#BHYVE_NAME} name | zbx.bhyve.vm.name[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].name.first() |
| VM Host {#BHYVE_NAME} state | zbx.bhyve.vm.state[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].state.first() |
| VM Host {#BHYVE_NAME} vnc | zbx.bhyve.vm.vnc[{#BHYVE_NAME}] | $.[?(@.name==‚{#BHYVE_NAME}‘)].vnc.first() |
V rámci nastavení Low-Level Discovery (LLD) v Zabbixu je také možné definovat filtry. Ty mohou být použity k omezení objevování určitých entit, například k vyloučení konkrétních hostů z procesu monitorování. Tímto způsobem můžete zefektivnit monitorování tím, že se zaměříte pouze na ty hosty, které jsou pro vaše potřeby relevantní, a zároveň eliminujete zbytečnou zátěž systému sledováním nežádoucích nebo nepotřebných hostů.
Výsledek monitoringu hostů
Šablona se vyvíjí
Šablona FreeBSD bhyve by Zabbix agent aktuálně existuje, ale ještě je ve fázi vývoje. Tuto šablonu můžete najít na GitHubu, kde jsou k dispozici verze pro Zabbix 6.0 i 7.0. Jakmile bude do balíčku vm-bhyve integrována podpora pro JSON, uvažuji o tom, že tuto šablonu přidám do komunitního repozitáře, aby byla snadno dostupná pro širší komunitu uživatelů Zabbixu a bhyve.
V další fázi bych se rád věnoval libvirt, konkrétně jeho integraci s bhyve. Příjemně mě překvapilo zjištění, že pro bhyve existuje specifický driver pro bhyve. Toto odhalení otevírá nové možnosti pro správu a monitorování virtualizovaných prostředí pomocí libvirt v kombinaci s bhyve technologií.


