Prilikom izrade rješenja za klijenta pojavila su se 2 zadatka koja sam htio riješiti lijepo i uz regularnu Zabbix funkcionalnost.
Cilj 1. Praćenje trenutne verzije firmvera na Mikrotik routerima.
Zadatak se rješava jednostavno - dodavanjem agenta u HTTP predložak. Agent dobiva trenutnu verziju s Mikrotik web stranice, a trigger uspoređuje trenutnu verziju s trenutnom i izdaje upozorenje u slučaju nepodudarnosti.
Kada imate 10 routera, takav algoritam nije kritičan, ali što učiniti s 3000 routera? Poslati 3000 zahtjeva poslužitelju? Naravno da će takva shema funkcionirati, ali sama ideja o 3000 zahtjeva mi nije odgovarala, htio sam pronaći drugo rješenje. Osim toga, još uvijek je postojao nedostatak u takvom algoritmu: druga strana može prebrojati toliki broj zahtjeva s jedne IP adrese za DoS napad, može ga jednostavno zabraniti.
Cilj 2. Korištenje sesije autorizacije u različitim HTTP agentima.
Kada agent treba primiti informacije sa "zatvorenih" stranica putem HTTP-a, potreban je autorizacijski kolačić. Da biste to učinili, obično postoji standardni obrazac za autorizaciju s parom "prijava / lozinka" i postavljanjem ID-a sesije u kolačić.
Ali postoji problem, nemoguće je pristupiti podacima druge stavke iz jedne stavke HTTP agenta kako bi se zamijenila ova vrijednost u zaglavlju.
Postoji i "Web skripta", ima još jedno ograničenje, ne dopušta vam da dobijete sadržaj za analizu i daljnje spremanje. Možete samo provjeriti prisutnost potrebnih varijabli na stranicama ili proslijediti prethodno primljene varijable između koraka web skripte.
Nakon što sam malo razmislio o ovim zadacima, odlučio sam koristiti makronaredbe koje su savršeno vidljive u bilo kojem dijelu sustava za nadzor: u predlošcima, hostovima, okidačima ili stavkama. I možete ažurirati makronaredbe putem API-ja web sučelja.
Zabbix ima dobru i detaljnu API dokumentaciju. Za razmjenu podataka putem api-ja koristi se Json format podataka. Detalji se mogu pronaći u službena dokumentacija.
Redoslijed radnji za dobivanje podataka koji su nam potrebni i njihovo snimanje u makronaredbi prikazan je na donjem dijagramu.
Korak 1
Prvi korak može se sastojati od jedne ili više radnji. Sva glavna logika je položena u prvim koracima, a posljednja 3 koraka su glavna.
U mom primjeru, prvi korak je bio dobivanje autorizacijskih kolačića na PBX-u za prvi zadatak. Za drugi zadatak dobio sam broj trenutne verzije Mikrotik firmwarea.
Ovim adresama pristupa sama Mikrotik oprema kada primi najnoviju dostupnu verziju firmvera.
Prvi korak je potpuno individualan za svaki slučaj i logika njegovog rada može biti drugačija. Sve ovisi o vašem zadatku.
Kada radite s web skriptiranjem, pratite koja vam je metoda odgovora potrebna. Naslovi HTTP odgovor ili sam тело odgovor bez zaglavlja?
Ako su potrebni autorizacijski kolačići, postavite način odgovora Naslovi kao u slučaju Asteriska.
Ako su vam potrebni podaci, kao u slučaju odgovora servera mikrotik, stavite tijelo odgovor bez zaglavlja.
Korak 2
Prijeđimo na drugi korak. Dobijanje sesije autorizacije:
jsonrpc je verzija JSON-RPC protokola koja se koristi;
Zabbix implementira JSON-RPC verziju 2.0;
metoda - metoda koja se poziva;
params - parametri koje prosljeđuje metoda;
id je proizvoljni identifikator zahtjeva;
auth - ključ provjere autentičnosti korisnika; budući da ga još nemamo, postavimo ga na nulu.
Za rad s API-jem stvorio sam zaseban račun s ograničenim pravima. Prvo, ne morate dati pristup tamo gdje ne trebate. I drugo, prije verzije 5.0, lozinka postavljena kroz makro se mogla pročitati. Sukladno tome, ako koristite Zabbix administratorsku lozinku, administratorski račun je lako ukrasti.
To će biti osobito istinito pri radu s API-jem putem skripti treće strane i pohranjivanju vjerodajnica sa strane.
Od verzije 5.0 postoji opcija za skrivanje lozinke spremljene u makronaredbi.
Prilikom kreiranja zasebnog računa za ažuriranje podataka putem API-ja, svakako provjerite jesu li podaci koji su vam potrebni dostupni putem web sučelja i je li ih moguće ažurirati. Nisam provjerio, a zatim dugo nisam mogao razumjeti zašto makro koji sam trebao nije vidljiv u API-ju.
Nakon što smo dobili autorizaciju u API-ju, nastavljamo s dobivanjem popisa makronaredbi.
Korak 3
API vam ne dopušta ažuriranje makronaredbe hosta po imenu, prvo morate dobiti ID makronaredbe. Štoviše, da biste dobili popis makronaredbi za određeni host, morate znati ID ovog hosta, a to je dodatni zahtjev. Koristi zadanu makronaredbu {HOST ID} u zahtjevu nije dopušteno. Odlučio sam zaobići ograničenje ovako:
Stvorio sam lokalnu makronaredbu s ovim ID-om hosta. Pronalaženje ID-a hosta vrlo je jednostavno putem web sučelja.
Odgovor s popisom svih makronaredbi na određenom hostu može se filtrirati prema uzorku:
Tako dobivamo ID makronaredbe koja nam je potrebna, gdje MIKROTIK_VERZIJA je naziv makronaredbe koju tražimo. U mom slučaju se pretražuje makronaredba MIKROTIK_VERZIJAOno što je dodijeljeno domaćinu.
{mikrotik_version} je vrijednost dobivena u prvom koraku. U mom primjeru, verzija trenutnog mikrotik firmware-a {hostmacroid} - vrijednost je dobivena u trećem koraku - id makronaredbe koju ažuriramo.
Zaključci
Pristup rješavanju problema sa standardnom funkcionalnošću mnogo je kompliciraniji i dulji. Pogotovo ako znate programirati i možete brzo dodati potrebnu logiku u skriptu.
Očita prednost ovog pristupa je "prenosivost" rješenja između različitih poslužitelja.
Meni osobno je čudno da HTTP agent ne može pristupiti podacima druge stavke i zamijeniti ih u tijelu zahtjeva ili zaglavljima [ ZBXNEXT-5993].