Zabbix - vastiganta makrolimojn

Farinte solvon por kliento, aperis 2 taskoj, kiujn mi volis solvi bele kaj kun regula Zabbix-funkcio.

Objektivo 1. Spuri la nunan firmware-version sur Mikrotik-enkursigiloj.

La tasko estas solvita facile - aldonante agenton al la HTTP-ŝablono. La agento ricevas la nunan version de la retejo de Mikrotik, kaj la ellasilo komparas la nunan version kun la nuna kaj eligas alarmon en kazo de diferenco.

Kiam vi havas 10 enkursigilojn, tia algoritmo ne estas kritika, sed kion fari kun 3000 enkursigiloj? Ĉu sendi 3000 petojn al la servilo? Kompreneble tia skemo funkcios, sed la ideo mem de 3000 petoj ne konvenis al mi, mi volis trovi alian solvon. Krome, estis ankoraŭ malavantaĝo en tia algoritmo: la alia flanko povas kalkuli tian nombron da petoj de unu IP por DoS-atako, ili povas simple malpermesi ĝin.

Objektivo 2. Uzante rajtigan sesion en malsamaj HTTP-agentoj.

Kiam agento bezonas ricevi informojn de "fermitaj" paĝoj per HTTP, necesas rajtiga kuketo. Por fari tion, kutime ekzistas norma rajtformularo kun paro "ensaluto / pasvorto" kaj fiksanta la sean ID en la kuketo.

Sed estas problemo, estas neeble aliri la datumojn de alia ero de unu HTTP-agento por anstataŭigi ĉi tiun valoron en la Kapo.

Ekzistas ankaŭ "TTT-skripto", ĝi havas alian limigon, ĝi ne permesas al vi akiri enhavon por analizo kaj plua ŝparado. Vi nur povas kontroli la ĉeeston de la necesaj variabloj sur la paĝoj aŭ pasi antaŭe ricevitajn variablojn inter retaj skriptopaŝoj.

Pensinte iomete pri ĉi tiuj taskoj, mi decidis uzi makroojn, kiuj estas perfekte videblaj en iu ajn parto de la monitora sistemo: en ŝablonoj, gastigantoj, ellasiloj aŭ eroj. Kaj vi povas ĝisdatigi makroojn per la retinterfaco API.

Zabbix havas bonan kaj detalan API-dokumentadon. Por datumŝanĝo per api, la Json-datumformato estas uzata. Detaloj troveblas en oficiala dokumentaro.

La sekvenco de agoj por akiri la datumojn, kiujn ni bezonas kaj registri ilin en makroo, estas montrita en la diagramo sube.

Zabbix - vastiganta makrolimojn

paŝi 1

La unua paŝo povas konsisti el ununura ago aŭ pluraj agoj. La tuta ĉefa logiko estas metita en la unuaj paŝoj, kaj la lastaj 3 paŝoj estas la ĉefaj.

En mia ekzemplo, la unua paŝo estis akiri rajtigajn kuketojn sur la PBX por la unua tasko. Por la dua tasko, mi ricevis la numeron de la nuna versio de la Mikrotik-firmvaro.

URL de aktualaj versioj de Mikrotik-firmvaro

Ĉi tiuj adresoj estas aliritaj de la Mikrotik-ekipaĵo mem kiam la plej nova disponebla firmware-versio estas ricevita.

La unua paŝo estas tute individua por ĉiu kazo kaj la logiko de ĝia laboro povas esti malsama. Ĉio dependas de via tasko.

Kiam vi laboras kun TTT-skripto, konservu kian respondmetodon vi bezonas. Titoloj HTTP-respondo aŭ mem la korpo respondo sen kaplinioj?
Se necesas rajtigaj kuketoj, tiam agordu la respondmetodon Titoloj kiel en la kazo de Asterisko.

Se vi bezonas datumojn, kiel en la kazo de la mikrotik-servila respondo, metu La korpo respondo sen kaplinioj.

paŝi 2

Ni transiru al la dua paŝo. Akiri rajtigan sesion:

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 estas la versio de la protokolo JSON-RPC, kiu estas uzata;
Zabbix efektivigas JSON-RPC-version 2.0;

  • method - la metodo, kiun oni nomas;
  • params - parametroj kiuj estas preterpasitaj per la metodo;
  • id estas arbitra peto-identigilo;
  • auth - uzanta aŭtentikigŝlosilo; ĉar ni ankoraŭ ne havas ĝin, ni agordu ĝin al nulo.

Por labori kun la API, mi kreis apartan konton kun limigitaj rajtoj. Unue, vi ne bezonas doni aliron al kie vi ne bezonas. Kaj due, antaŭ la versio 5.0, la pasvorto fiksita per la makroo povus esti legita. Sekve, se vi uzas la pasvorton de administranto de Zabbix, la administra konto estas facile ŝtelebla.

Ĉi tio estos precipe vera kiam vi laboras kun API per triaj skriptoj kaj konservas akreditaĵojn flanke.

Ekde versio 5.0 ekzistas eblo por kaŝi la pasvorton konservitan en la makroo.

Zabbix - vastiganta makrolimojn

Kiam vi kreas apartan konton por ĝisdatigi datumojn per la API, nepre kontrolu ĉu la datumoj, kiujn vi bezonas, disponeblas per la retinterfaco kaj ĉu eblas ĝisdatigi ĝin. Mi ne kontrolis, kaj tiam dum longa tempo mi ne povis kompreni kial la makroo, kiun mi bezonis, ne estis videbla en la API.

Zabbix - vastiganta makrolimojn

Post kiam ni ricevis rajtigon en la API, ni daŭrigas ricevi liston de makrooj.

paŝi 3

La API ne permesas al vi ĝisdatigi gastigan makroon laŭnome, vi unue devas ricevi la makroan ID. Krome, por akiri liston de makrooj por specifa gastiganto, vi devas scii la ID de ĉi tiu gastiganto, kaj ĉi tio estas ekstra peto. Uzu defaŭltan makroon {GASTO ID} en la peto ne estas permesita. Mi decidis preteriri la limigon jene:

Zabbix - vastiganta makrolimojn

Mi kreis lokan makroon kun la ID de ĉi tiu gastiganto. Eltrovi la gastigantan ID estas tre facila de la retinterfaco.

Respondo kun listo de ĉiuj makrooj sur antaŭfiksita gastiganto povas esti filtrita per ŝablono:

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

Zabbix - vastiganta makrolimojn

Tiel, ni ricevas la ID de la makroo, kiun ni bezonas, kie MIKROTIK_VERSION estas la nomo de la makroo, kiun ni serĉas. En mia kazo, la makroo estas serĉata MIKROTIK_VERSIONLa tio estis asignita al la gastiganto.

La peto mem aspektas jene:

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
}

Variablo {sid} akirita en la dua paŝo kaj estos uzata konstante, kie vi devas labori kun la API-interfaco.

Fina 4 PAŜO - ĝisdatigi la makroon

Nun ni scias la makroan ID, kiu devas esti ĝisdatigita, la rajtigan kuketon aŭ la firmvarversion de la enkursigilo. Vi povas ĝisdatigi la makroon mem.

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_versio} estas la valoro akirita en la unua paŝo. En mia ekzemplo, la versio de la nuna mikrotik-firmvaro
{gastmacroido} - la valoro estis akirita en la tria paŝo - la id de la makroo, kiun ni ĝisdatigas.

trovoj

La aliro al solvi problemon uzante norman funkciecon estas multajn fojojn pli malfacila kaj daŭras pli longe. Precipe se vi scias programadon kaj povas rapide meti la necesan logikon en skripton.

La evidenta avantaĝo de ĉi tiu aliro estas la "porteblo" de la solvo inter malsamaj serviloj.

Por mi persone, estas strange, ke la HTTP-agento ne povas aliri la datumojn de alia ero kaj anstataŭigi ilin en la petokorpo aŭ kaplinioj [ ZBXNEXT-5993].

La finita ŝablono povas elŝutu sur GitHub.

fonto: www.habr.com

Aldoni komenton