Zabbix - makro robežu paplašināšana

Izgatavojot risinājumu klientam, radās 2 uzdevumi, kurus gribēju atrisināt skaisti un ar regulāru Zabbix funkcionalitāti.

1. uzdevums. Pašreizējās programmaparatūras versijas izsekošana Mikrotik maršrutētājos.

Uzdevums tiek atrisināts vienkārši – HTTP veidnei pievienojot aģentu. Aģents saņem pašreizējo versiju no Mikrotik vietnes, un trigeris salīdzina pašreizējo versiju ar pašreizējo un izdod brīdinājumu neatbilstības gadījumā.

Ja jums ir 10 maršrutētāji, šāds algoritms nav kritisks, bet ko darīt ar 3000 maršrutētājiem? Vai nosūtīt serverim 3000 pieprasījumus? Protams, šāda shēma darbosies, bet pati ideja par 3000 pieprasījumiem man nederēja, gribēju atrast citu risinājumu. Turklāt šādam algoritmam joprojām bija trūkums: otra puse var saskaitīt tik daudz pieprasījumu no viena IP DoS uzbrukumam, viņi var to vienkārši aizliegt.

2. uzdevums. Autorizācijas sesijas izmantošana dažādos HTTP aģentos.

Ja aģentam ir jāsaņem informācija no "slēgtām" lapām, izmantojot HTTP, ir nepieciešams autorizācijas sīkfails. Lai to izdarītu, parasti ir standarta autorizācijas veidlapa ar "pieteikšanās/paroles" pāri un sesijas ID iestatīšanu sīkfailā.

Bet ir problēma, nav iespējams piekļūt cita vienuma datiem no viena HTTP aģenta vienuma, lai aizstātu šo vērtību galvenē.

Ir arī "Web skripts", tam ir vēl viens ierobežojums, tas neļauj iegūt saturu analīzei un turpmākai saglabāšanai. Varat pārbaudīt tikai nepieciešamo mainīgo klātbūtni lapās vai nodot iepriekš iegūtos mainīgos starp tīmekļa skripta darbībām.

Nedaudz pārdomājot šos uzdevumus, es nolēmu izmantot makro, kas ir lieliski redzami jebkurā uzraudzības sistēmas daļā: veidnēs, saimniekos, trigeros vai vienumos. Un jūs varat atjaunināt makro, izmantojot tīmekļa saskarnes API.

Zabbix ir laba un detalizēta API dokumentācija. Datu apmaiņai, izmantojot api, tiek izmantots Json datu formāts. Sīkāku informāciju var atrast oficiālā dokumentācija.

Darbību secība mums nepieciešamo datu iegūšanai un to ierakstīšanai makro ir parādīta zemāk esošajā diagrammā.

Zabbix - makro robežu paplašināšana

Solis 1

Pats pirmais solis var sastāvēt no vienas darbības vai vairākām darbībām. Visa galvenā loģika ir noteikta pirmajos soļos, un pēdējie 3 soļi ir galvenie.

Manā piemērā pirmais solis bija iegūt autorizācijas sīkfailus PBX pirmajam uzdevumam. Otrajam uzdevumam es saņēmu Mikrotik programmaparatūras pašreizējās versijas numuru.

Mikrotik programmaparatūras pašreizējo versiju URL

Šīm adresēm piekļūst pati Mikrotik iekārta, kad tiek saņemta jaunākā pieejamā programmaparatūras versija.

Pirmais solis ir pilnīgi individuāls katram gadījumam, un tā darba loģika var būt atšķirīga. Tas viss ir atkarīgs no jūsu uzdevuma.

Strādājot ar tīmekļa skriptēšanu, sekojiet līdzi, kura atbildes metode jums ir nepieciešama. Nosaukumi HTTP atbilde vai sevi тело atbilde bez galvenēm?
Ja ir nepieciešami autorizācijas sīkfaili, iestatiet atbildes metodi Nosaukumi tāpat kā zvaigznītes gadījumā.

Ja jums ir nepieciešami dati, tāpat kā mikrotik servera atbildes gadījumā, ielieciet Korpuss atbilde bez galvenēm.

Solis 2

Pāriesim pie otrā posma. Autorizācijas sesijas iegūšana:

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 ir JSON-RPC protokola versija, kas tiek izmantota;
Zabbix ievieš JSON-RPC versiju 2.0;

  • metode - metode, kas tiek izsaukta;
  • parametri - parametri, kas tiek nodoti ar metodi;
  • id ir patvaļīgs pieprasījuma identifikators;
  • auth - lietotāja autentifikācijas atslēga; tā kā mums tā vēl nav, iestatīsim to uz nulli.

Lai strādātu ar API, es izveidoju atsevišķu kontu ar ierobežotām tiesībām. Pirmkārt, jums nav jāpiešķir piekļuve tur, kur jums tas nav nepieciešams. Un, otrkārt, pirms versijas 5.0 varēja nolasīt paroli, kas iestatīta, izmantojot makro. Attiecīgi, ja izmantojat Zabbix administratora paroli, administratora kontu ir viegli nozagt.

Tas jo īpaši attiecas uz darbu ar API, izmantojot trešo pušu skriptus un saglabājot akreditācijas datus sānos.

Kopš versijas 5.0 ir iespēja paslēpt makro saglabāto paroli.

Zabbix - makro robežu paplašināšana

Veidojot atsevišķu kontu datu atjaunināšanai, izmantojot API, noteikti pārbaudiet, vai nepieciešamie dati ir pieejami caur tīmekļa saskarni un vai ir iespējams tos atjaunināt. Es nepārbaudīju, un tad ilgu laiku nevarēju saprast, kāpēc man vajadzīgais makro nav redzams API.

Zabbix - makro robežu paplašināšana

Kad esam saņēmuši atļauju API, mēs turpinām iegūt makro sarakstu.

Solis 3

API neļauj atjaunināt resursdatora makro pēc nosaukuma, vispirms ir jāiegūst makro ID. Turklāt, lai iegūtu konkrēta resursdatora makro sarakstu, jums jāzina šī resursdatora ID, un tas ir papildu pieprasījums. Izmantojiet noklusējuma makro {HOST ID} pieprasījumā nav atļauts. Es nolēmu apiet ierobežojumu šādi:

Zabbix - makro robežu paplašināšana

Es izveidoju lokālo makro ar šī saimniekdatora ID. No tīmekļa saskarnes var ļoti vienkārši uzzināt saimniekdatora ID.

Atbildi ar visu konkrētā saimniekdatora makro sarakstu var filtrēt pēc modeļa:

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

Zabbix - makro robežu paplašināšana

Tādējādi mēs iegūstam vajadzīgā makro ID, kur MIKROTIK_VERSION ir tā makro nosaukums, kuru mēs meklējam. Manā gadījumā makro tiek meklēts MIKROTIK_VERSIONTas, kas tika piešķirts saimniekam.

Pats pieprasījums izskatās šādi:

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
}

Mainīgs {sid} iegūts otrajā solī un tiks pastāvīgi izmantots, kur nepieciešams strādāt ar API saskarni.

Pēdējais 4 SOLIS — makro atjaunināšana

Tagad mēs zinām makro ID, kas ir jāatjaunina, autorizācijas sīkfailu vai maršrutētāja programmaparatūras versiju. Varat atjaunināt pašu 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} ir vērtība, kas iegūta pirmajā solī. Manā piemērā pašreizējās mikrotik programmaparatūras versija
{hostmacroid} - vērtība tika iegūta trešajā darbībā - makro id, kuru mēs atjauninām.

Atzinumi

Pieeja problēmas risināšanai ar standarta funkcionalitāti ir daudz sarežģītāka un ilgāka. It īpaši, ja jūs zināt programmēšanu un varat ātri pievienot skriptam nepieciešamo loģiku.

Šīs pieejas acīmredzamā priekšrocība ir risinājuma "pārnesamība" starp dažādiem serveriem.

Man personīgi ir dīvaini, ka HTTP aģents nevar piekļūt cita vienuma datiem un aizstāt tos pieprasījuma pamattekstā vai galvenēs [ ZBXNEXT-5993].

Gatavā veidne var lejupielādēt vietnē GitHub.

Avots: www.habr.com

Pievieno komentāru