Prilikom izrade rješenja za klijenta pojavila su se 2 zadatka koje sam želio riješiti lijepo i uz redovnu Zabbix funkcionalnost.
Zadatak 1 Praćenje trenutne verzije firmvera na Mikrotik ruterima.
Zadatak se rješava jednostavno - dodavanjem agenta u HTTP šablon. Agent prima trenutnu verziju sa Mikrotik web stranice, a okidač uspoređuje trenutnu verziju s trenutnom i izdaje upozorenje u slučaju neslaganja.
Kada imate 10 rutera, takav algoritam nije kritičan, ali šta učiniti sa 3000 rutera? Poslati 3000 zahtjeva na server? Naravno, takva šema će raditi, ali sama ideja od 3000 zahtjeva mi nije odgovarala, htio sam pronaći drugo rješenje. Osim toga, još uvijek je postojao nedostatak takvog algoritma: druga strana može računati toliki broj zahtjeva s jedne IP adrese za DoS napad, može ga jednostavno zabraniti.
Zadatak 2 Korištenje sesije autorizacije u različitim HTTP agentima.
Kada agent treba da primi informacije sa "zatvorenih" stranica putem HTTP-a, potreban je autorizacijski kolačić. Da biste to učinili, obično postoji standardni formular za autorizaciju sa parom "prijava/lozinka" i postavljanjem ID-a sesije u kolačiću.
Ali postoji problem, nemoguće je pristupiti podacima druge stavke iz jedne stavke HTTP agenta da bi se ova vrijednost zamijenila u zaglavlju.
Postoji i "Web skripta", ima još jedno ograničenje, ne dozvoljava vam da dobijete sadržaj za analizu i dalje spremanje. Možete samo provjeriti prisutnost potrebnih varijabli na stranicama ili proslijediti prethodno dobijene varijable između koraka web skripte.
Nakon što sam malo razmislio o ovim zadacima, odlučio sam da koristim makroe koji su savršeno vidljivi u bilo kojem dijelu sistema za praćenje: u šablonima, hostovima, okidačima ili stavkama. I možete ažurirati makroe preko API-ja web sučelja.
Zabbix ima dobru i detaljnu API dokumentaciju. Za razmjenu podataka putem API-ja koristi se Json format podataka. Detalje možete pronaći u službena dokumentacija.
Redoslijed radnji za dobivanje podataka koji su nam potrebni i njihovo snimanje u makro prikazan je na dijagramu ispod.
korak 1
Prvi korak može se sastojati od jedne ili više radnji. Sva glavna logika je položena u prvim koracima, a zadnja 3 koraka su glavna.
U mom primjeru, prvi korak je bio da dobijete autorizacijske kolačiće na PBX-u za prvi zadatak. Za drugi zadatak dobio sam broj trenutne verzije Mikrotik firmware-a.
Ovim adresama pristupa sama Mikrotik oprema kada se primi najnovija dostupna verzija firmvera.
Prvi korak je potpuno individualan za svaki slučaj i logika njegovog rada može biti drugačija. Sve zavisi od vašeg zadatka.
Kada radite s web skriptiranjem, vodite računa o tome koji način odgovora vam je potreban. Naslovi HTTP odgovor ili self тело odgovor bez zaglavlja?
Ako su potrebni autorizacijski kolačići, tada postavite način odgovora Naslovi kao u slučaju Asterisk.
Ako su vam potrebni podaci, kao u slučaju odgovora mikrotik servera, stavite Telo odgovor bez zaglavlja.
korak 2
Pređ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 koji se prosleđuju metodom;
id je proizvoljni identifikator zahtjeva;
auth - ključ za autentifikaciju korisnika; pošto ga još nemamo, postavimo ga na null.
Za rad sa API-jem, kreirao sam poseban nalog sa ograničenim pravima. Prvo, ne morate da dajete pristup tamo gde ne trebate. I drugo, prije verzije 5.0, lozinka postavljena putem makroa mogla se pročitati. Shodno tome, ako koristite Zabbix administratorsku lozinku, administratorski nalog je lako ukrasti.
Ovo će biti posebno istinito kada radite s API-jem putem skripti trećih strana i pohranjujete vjerodajnice sa strane.
Od verzije 5.0 postoji opcija za skrivanje lozinke sačuvane u makrou.
Prilikom kreiranja posebnog naloga za ažuriranje podataka putem API-ja, obavezno provjerite da li su vam potrebni podaci dostupni putem web sučelja i da li ih je moguće ažurirati. Nisam provjerio, a onda dugo nisam mogao razumjeti zašto makro koji mi je trebao nije vidljiv u API-ju.
Nakon što smo dobili autorizaciju u API-ju, nastavljamo da dobijemo listu makroa.
korak 3
API vam ne dozvoljava da ažurirate makro host po imenu, prvo morate dobiti ID makroa. Štaviše, da biste dobili listu makroa za određeni host, morate znati ID ovog hosta, a to je dodatni zahtjev. Koristi zadani makro {HOST ID} u zahtjevu nije dozvoljeno. Odlučio sam zaobići ograničenje na ovaj način:
Napravio sam lokalni makro sa ID-om ovog hosta. Pronalaženje ID-a hosta je vrlo jednostavno preko web sučelja.
Odgovor sa listom svih makroa na datom hostu može se filtrirati po obrascu:
Tako dobijamo ID makroa koji nam je potreban, gdje MIKROTIK_VERSION je naziv makroa koji tražimo. U mom slučaju se traži makro MIKROTIK_VERSIONOno što je dodijeljeno domaćinu.
{mikrotik_version} je vrijednost dobivena u prvom koraku. U mom primeru, verzija trenutnog firmvera mikrotik {hostmacroid} - vrijednost je dobivena u trećem koraku - id makroa koji ažuriramo.
nalazi
Pristup rješavanju problema sa standardnom funkcionalnošću mnogo je složeniji i duži. Pogotovo ako znate programiranje i možete brzo dodati potrebnu logiku u skriptu.
Očigledna prednost ovog pristupa je "prenosivost" rješenja između različitih servera.
Za mene lično je čudno da HTTP agent ne može pristupiti podacima druge stavke i zamijeniti ih u tijelu ili zaglavlju zahtjeva [ ZBXNEXT-5993].