Zabbix - širenje granica makroa

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.

Zabbix - širenje granica makroa

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.

URL trenutnih verzija Mikrotik firmware-a

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:

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 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.

Zabbix - širenje granica makroa

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.

Zabbix - širenje granica makroa

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:

Zabbix - širenje granica makroa

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:

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

Zabbix - širenje granica makroa

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.

Sam zahtjev izgleda ovako:

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
}

Promjenjiva {sid} dobiven u drugom koraku i koristit će se stalno, gdje trebate raditi s API sučeljem.

Završna 4 KORAKA - ažuriranje makronaredbe

Sada znamo makro ID koji treba ažurirati, autorizacijski kolačić ili verziju firmvera rutera. Možete ažurirati samu makronaredbu.

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 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].

Gotov predložak može preuzeti na GitHubu.

Izvor: www.habr.com

Dodajte komentar