Zabbix - širjenje makro meja

Pri izdelavi rešitve za stranko sta se pojavili 2 nalogi, ki sem ju želel rešiti lepo in z navadno Zabbix funkcionalnostjo.

Izziv 1. Sledenje trenutni različici vdelane programske opreme na usmerjevalnikih Mikrotik.

Naloga se reši enostavno - z dodajanjem agenta v HTTP predlogo. Agent prejme aktualno verzijo s spletnega mesta Mikrotik, sprožilec pa aktualno verzijo primerja s trenutno in v primeru neskladja izda opozorilo.

Ko imate 10 usmerjevalnikov, takšen algoritem ni kritičen, kaj pa narediti s 3000 usmerjevalniki? Poslati 3000 zahtevkov na strežnik? Seveda bo takšna shema delovala, vendar mi sama ideja o 3000 zahtevah ni ustrezala, želel sem najti drugo rešitev. Poleg tega je bila v takem algoritmu še vedno pomanjkljivost: nasprotna stran lahko prešteje toliko zahtev z enega IP-ja za napad DoS, da ga lahko preprosto prepove.

Izziv 2. Uporaba avtorizacijske seje v različnih agentih HTTP.

Ko mora posrednik prejeti informacije z "zaprtih" strani prek HTTP-ja, je potreben avtorizacijski piškotek. Za to običajno obstaja standardni avtorizacijski obrazec s parom "prijava / geslo" in nastavitvijo ID-ja seje v piškotku.

Toda obstaja težava, da je nemogoče dostopati do podatkov drugega elementa iz enega elementa posrednika HTTP, da bi nadomestili to vrednost v glavi.

Obstaja tudi "Spletna skripta", ima še eno omejitev, ne omogoča pridobivanja vsebine za analizo in nadaljnje shranjevanje. Preverjate lahko samo prisotnost potrebnih spremenljivk na straneh ali posredujete predhodno prejete spremenljivke med koraki spletnega skripta.

Po kratkem premisleku o teh nalogah sem se odločil uporabiti makre, ki so popolnoma vidni v katerem koli delu nadzornega sistema: v predlogah, gostiteljih, sprožilcih ali elementih. Makre lahko posodobite prek API-ja spletnega vmesnika.

Zabbix ima dobro in podrobno dokumentacijo API-ja. Za izmenjavo podatkov preko api se uporablja format podatkov Json. Podrobnosti najdete v uradna dokumentacija.

Zaporedje dejanj za pridobivanje podatkov, ki jih potrebujemo, in njihovo snemanje v makro je prikazano na spodnjem diagramu.

Zabbix - širjenje makro meja

Korak 1

Prvi korak je lahko sestavljen iz enega ali več dejanj. Vsa glavna logika je položena v prvih korakih, zadnji 3 koraki pa so glavni.

V mojem primeru je bil prvi korak pridobivanje avtorizacijskih piškotkov na PBX za prvo nalogo. Za drugo nalogo sem dobil številko trenutne verzije firmware-a Mikrotik.

URL trenutne različice vdelane programske opreme Mikrotik

Do teh naslovov dostopa oprema Mikrotik sama, ko prejme zadnjo razpoložljivo različico vdelane programske opreme.

Prvi korak je popolnoma individualen za vsak primer in logika njegovega dela je lahko drugačna. Vse je odvisno od vaše naloge.

Ko delate s spletnimi skripti, spremljajte, katero metodo odziva potrebujete. Naslovi Odgovor HTTP ali sam тело odgovor brez glave?
Če so potrebni avtorizacijski piškotki, nastavite način odgovora Naslovi kot v primeru Asterisk.

Če potrebujete podatke, kot v primeru odziva strežnika mikrotik, postavite telo odgovor brez naslovov.

Korak 2

Pojdimo na drugi korak. Pridobivanje avtorizacijske seje:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin"
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}

jsonrpc je različica protokola JSON-RPC, ki se uporablja;
Zabbix implementira JSON-RPC različice 2.0;

  • metoda - metoda, ki se kliče;
  • params - parametri, ki jih posreduje metoda;
  • id je poljuben identifikator zahteve;
  • auth - ključ za preverjanje pristnosti uporabnika; ker ga še nimamo, ga nastavimo na nič.

Za delo z API-jem sem ustvaril ločen račun z omejenimi pravicami. Prvič, ni vam treba omogočiti dostopa tja, kjer vam ni treba. In drugič, pred različico 5.0 je bilo mogoče prebrati geslo, nastavljeno prek makra. Skladno s tem, če uporabljate skrbniško geslo Zabbix, je skrbniški račun enostavno ukrasti.

To bo še posebej veljalo pri delu z API-jem prek skriptov tretjih oseb in shranjevanju poverilnic ob strani.

Od različice 5.0 obstaja možnost, da skrijete geslo, shranjeno v makru.

Zabbix - širjenje makro meja

Pri ustvarjanju ločenega računa za posodabljanje podatkov prek API-ja obvezno preverite, ali so podatki, ki jih potrebujete, na voljo prek spletnega vmesnika in ali jih je mogoče posodobiti. Nisem preveril in potem dolgo časa nisem mogel razumeti, zakaj makro, ki sem ga potreboval, ni bil viden v API-ju.

Zabbix - širjenje makro meja

Ko prejmemo avtorizacijo v API-ju, nadaljujemo s pridobivanjem seznama makrov.

Korak 3

API vam ne dovoljuje posodobitve makra gostitelja po imenu, najprej morate pridobiti ID makra. Poleg tega morate za pridobitev seznama makrov za določenega gostitelja poznati ID tega gostitelja, kar je dodatna zahteva. Uporabi privzeti makro {HOST ID} v zahtevku ni dovoljeno. Omejitev sem se odločil zaobiti takole:

Zabbix - širjenje makro meja

Ustvaril sem lokalni makro z ID-jem tega gostitelja. Iskanje ID-ja gostitelja je zelo preprosto prek spletnega vmesnika.

Odgovor s seznamom vseh makrov na določenem gostitelju je mogoče filtrirati z vzorcem:

regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{$MIKROTIK_VERSION}"

Zabbix - širjenje makro meja

Tako dobimo ID makra, ki ga potrebujemo, kje MIKROTIK_VERZIJA je ime makra, ki ga iščemo. V mojem primeru se išče makro MIKROTIK_VERZIJATisto, ki je bilo dodeljeno gostitelju.

Sama zahteva izgleda takole:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.get",
    "params":{
        "output":"extend",
        "hostids":"{$HOST_ID}"
    },
    "auth":"{sid}",
    "id":1
}

Spremenljivka {sid} pridobljen v drugem koraku in se bo stalno uporabljal, kjer morate delati z vmesnikom API.

Zadnji 4. KORAK - posodobitev makra

Zdaj poznamo ID makra, ki ga je treba posodobiti, avtorizacijski piškotek ali različico vdelane programske opreme usmerjevalnika. Sam makro lahko posodobite.

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.update",
    "params":{
        "hostmacroid":"{hostmacroid}",
        "value":"{mikrotik_version}"
    },
    "auth":"{sid}",
    "id":1
}

{mikrotik_version} je vrednost, pridobljena v prvem koraku. V mojem primeru je različica trenutne vdelane programske opreme mikrotik
{hostmacroid} - vrednost je bila pridobljena v tretjem koraku - id makra, ki ga posodabljamo.

Ugotovitve

Pristop k reševanju problema s standardno funkcionalnostjo je veliko bolj zapleten in daljši. Še posebej, če obvladate programiranje in znate v skript hitro dodati potrebno logiko.

Očitna prednost tega pristopa je »prenosljivost« rešitve med različnimi strežniki.

Zame osebno je čudno, da agent HTTP ne more dostopati do podatkov drugega elementa in jih nadomestiti v telesu zahteve ali glavah [ ZBXNEXT-5993].

Končana predloga lahko prenesite na GitHub.

Vir: www.habr.com

Dodaj komentar