Zabbix - širenje makro granica

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.

Zabbix - širenje makro granica

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.

URL trenutnih verzija Mikrotik firmvera

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:

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

Zabbix - širenje makro granica

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.

Zabbix - širenje makro granica

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:

Zabbix - širenje makro granica

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:

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

Zabbix - širenje makro granica

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.

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
}

Promjenjivo {sid} dobijena u drugom koraku i koristiće se stalno, gde treba da radite sa API interfejsom.

Finalni 4 KORAK - ažuriranje makroa

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

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

Gotovi šablon može preuzmite na GitHub-u.

izvor: www.habr.com

Dodajte komentar