Zabbix - expanding macro frontieres

Quandu facia una suluzione per un cliente, 2 cumpitenzi sò ghjunti chì vulia risolve bè è cù funziunalità Zabbix regulare.

Sfida 1 Traccia a versione di firmware attuale nantu à i router Mikrotik.

U compitu hè risoltu facilmente - aghjunghjendu un agentu à u mudellu HTTP. L'agente riceve a versione attuale da u situ web Mikrotik, è u trigger compara a versione attuale cù l'attuale è emette una alerta in casu di discrepanza.

Quandu avete 10 routers, un tali algoritmu ùn hè micca criticu, ma chì fà cù 3000 routers? Mandate 3000 dumande à u servitore? Di sicuru, un tali schema hà da travaglià, ma l'idea stessa di 3000 richieste ùn mi cunvene micca, vulia truvà una altra suluzione. Inoltre, ci era ancu un svantaghju in un tale algoritmu: l'altra parte pò cuntà una quantità di richieste da una IP per un attaccu DoS, ponu solu pruibisce.

Sfida 2 Utilizà una sessione d'autorizazione in diversi agenti HTTP.

Quandu un agente hà bisognu di riceve infurmazioni da e pagine "chiuse" via HTTP, hè necessariu una cookie d'autorizazione. Per fà questu, ci hè di solitu una forma d'autorizazione standard cù una coppia "login / password" è stabilisce l'ID di sessione in a cookie.

Ma ci hè un prublema, hè impussibile di accede à e dati di un altru articulu da un articulu di l'agente HTTP per rimpiazzà stu valore in Header.

Ci hè ancu un "script Web", hà una altra limitazione, ùn vi permette micca di ottene u cuntenutu per l'analisi è più salvezza. Pudete cuntrollà solu a presenza di e variàbili necessarii in e pagine o passà variabili ricivuti prima trà i passi di script web.

Dopu avè pensatu un pocu nantu à sti travaglii, aghju decisu di utilizà macros chì sò perfettamente visibili in ogni parte di u sistema di surviglianza: in mudelli, ospiti, triggers o elementi. È pudete aghjurnà macros attraversu l'API di l'interfaccia web.

Zabbix hà una documentazione API bona è dettagliata. Per u scambiu di dati via api, u formatu di dati Json hè utilizatu. I dettagli ponu esse truvati in documentazione ufficiale.

A sequenza di l'azzioni per ottene e dati chì avemu bisognu è registrà in una macro hè mostrata in u diagramma sottu.

Zabbix - expanding macro frontieres

mossa 1

U primu passu pò esse cumpostu da una sola azzione o parechje azzioni. Tutta a logica principale hè pusata in i primi passi, è l'ultimi 3 passi sò i principali.

In u mo esempiu, u primu passu era di ottene cookies d'autorizazione in u PBX per u primu travagliu. Per u sicondu compitu, aghju avutu u numeru di a versione attuale di u firmware Mikrotik.

URL di e versioni attuali di u firmware Mikrotik

Questi indirizzi sò accessu da l'equipaggiu Mikrotik stessu quandu l'ultima versione di firmware dispunibule hè ricevutu.

U primu passu hè cumplettamente individuale per ogni casu è a logica di u so travagliu pò esse differente. Tuttu dipende di u vostru compitu.

Quandu travagliate cù scripting web, seguite u metudu di risposta chì avete bisognu. Tituli Risposta HTTP o sè stessu u corpu risposta senza intestazioni?
Se i cookies d'autorizazione sò necessarii, allora stabilisce u metudu di risposta Tituli cum'è in u casu di Asterisk.

Sè avete bisognu di dati, cum'è in u casu di a risposta di u servore mikrotik, mette U corpu risposta senza intestazioni.

mossa 2

Andemu à u sicondu passu. Ottene una sessione d'autorizazione:

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 hè a versione di u protocolu JSON-RPC chì hè stata utilizata;
Zabbix implementa a versione JSON-RPC 2.0;

  • metudu - u metudu chjamatu;
  • params - paràmetri chì sò passati da u metudu;
  • id hè un identificatore di dumanda arbitraria;
  • auth - chjave di autentificazione di l'utilizatori; postu chì ùn l'avemu ancu, mettemu à null.

Per travaglià cù l'API, aghju creatu un contu separatu cù diritti limitati. Prima, ùn avete micca bisognu di dà accessu à induve ùn avete micca bisognu. E in segundu, prima di a versione 5.0, a password stabilita attraversu a macro puderia esse leghje. In cunsiquenza, se utilizate a password di l'amministratore Zabbix, u contu amministratore hè faciule da arrubbari.

Questu serà soprattuttu veru quandu u travagliu cù l'API per mezu di script di terzu è almacenà credenziali à u latu.

Dapoi a versione 5.0 ci hè una opzione per ammuccià a password salvata in a macro.

Zabbix - expanding macro frontieres

Quandu crea un contu separatu per aghjurnà e dati via l'API, assicuratevi di verificà se e dati chì avete bisognu sò dispunibuli attraversu l'interfaccia web è s'ellu hè pussibule aghjurnà. Ùn aghju micca verificatu, è dopu per un bellu pezzu ùn pudia capisce perchè a macro chì avia bisognu ùn era micca visibile in l'API.

Zabbix - expanding macro frontieres

Dopu avè ricivutu l'autorizazione in l'API, procedemu à ottene una lista di macros.

mossa 3

L'API ùn vi permette micca di aghjurnà una macro d'ospiti per nome, avete prima avè l'ID macro. Inoltre, per uttene una lista di macros per un òspite specificu, avete bisognu di cunnosce l'ID di questu òspite, è questu hè una dumanda extra. Utilizà a macro predeterminata {HOST ID} in a dumanda ùn hè micca permessa. Aghju decisu di scaccià a restrizione cusì:

Zabbix - expanding macro frontieres

Aghju creatu una macro locale cù l'ID di stu host. Truvà fora l 'ospiti ID hè assai faciule da l'interfaccia web.

Una risposta cù una lista di tutte e macros nantu à un host datu pò esse filtrata da un mudellu:

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

Zabbix - expanding macro frontieres

Cusì, avemu l'ID di a macro chì avemu bisognu, induve MIKROTIK_VERSION hè u nome di a macro chì cercamu. In u mo casu, a macro hè cercata MIKROTIK_VERSIONChì hè stata attribuita à l'ospite.

A dumanda stessu pare cusì:

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
}

Variable {sid} ottinutu in u sicondu passu è serà utilizatu constantemente, induve avete bisognu di travaglià cù l'interfaccia API.

Final 4 STEP - aghjurnà a macro

Avà sapemu l'ID macro chì deve esse aghjurnatu, a cookie d'autorizazione o a versione di firmware di u router. Pudete aghjurnà a macro stessa.

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
}

{versione_mikrotik} hè u valore ottenutu in u primu passu. In u mo esempiu, a versione di u firmware mikrotik attuale
{hostmacroid} - u valore hè statu ottenutu in u terzu passu - l'id di a macro chì avemu aghjurnatu.

scuperti

L'approcciu di risolve u prublema cù funziunalità standard hè assai più cumplicatu è più longu. Soprattuttu s'ellu sapete prugrammazione è pudete aghjunghje rapidamente a logica necessaria in u script.

U vantaghju evidenti di questu approcciu hè a "portabilità" di a suluzione trà i diversi servitori.

Per mè personalmente, hè stranu chì l'agente HTTP ùn pò micca accede à e dati di un altru articulu è rimpiazzà in u corpu di dumanda o intestazioni [ ZBXNEXT-5993].

U mudellu finitu pò scaricate nantu à GitHub.

Source: www.habr.com

Add a comment