Zabbix - ehangu ffiniau macro

Wrth wneud datrysiad ar gyfer cleient, cododd 2 dasg yr oeddwn am eu datrys yn hyfryd a chyda ymarferoldeb Zabbix rheolaidd.

Tasg 1. Olrhain y fersiwn firmware cyfredol ar llwybryddion Mikrotik.

Mae'r dasg yn cael ei datrys yn hawdd - trwy ychwanegu asiant i'r templed HTTP. Mae'r asiant yn derbyn y fersiwn gyfredol o wefan Mikrotik, ac mae'r sbardun yn cymharu'r fersiwn gyfredol â'r un gyfredol ac yn cyhoeddi rhybudd rhag ofn y bydd anghysondeb.

Pan fydd gennych 10 llwybrydd, nid yw algorithm o'r fath yn hollbwysig, ond beth i'w wneud â 3000 o lwybryddion? Anfon 3000 o geisiadau i'r gweinydd? Wrth gwrs, bydd cynllun o'r fath yn gweithio, ond nid oedd yr union syniad o 3000 o geisiadau yn gweddu i mi, roeddwn i eisiau dod o hyd i ateb arall. Yn ogystal, roedd anfantais o hyd mewn algorithm o'r fath: gall yr ochr arall gyfrif cymaint o geisiadau gan un IP am ymosodiad DoS, gallant ei wahardd yn syml.

Tasg 2. Defnyddio sesiwn awdurdodi mewn gwahanol asiantau HTTP.

Pan fydd angen i asiant dderbyn gwybodaeth o dudalennau "caeedig" trwy HTTP, mae angen cwci awdurdodi. I wneud hyn, fel arfer mae ffurflen awdurdodi safonol gyda phâr "mewngofnodi / cyfrinair" a gosod ID y sesiwn yn y cwci.

Ond mae yna broblem, mae'n amhosib cyrchu data eitem arall o un eitem asiant HTTP i amnewid y gwerth hwn yn y Pennawd.

Mae yna hefyd "Sgript We", mae ganddo gyfyngiad arall, nid yw'n caniatáu ichi gael cynnwys i'w ddadansoddi ac arbed ymhellach. Dim ond ar y tudalennau y gallwch wirio am bresenoldeb y newidynnau angenrheidiol neu basio newidynnau a gafwyd yn flaenorol rhwng camau sgript gwe.

Ar ôl meddwl ychydig am y tasgau hyn, penderfynais ddefnyddio macros sy'n gwbl weladwy mewn unrhyw ran o'r system fonitro: mewn templedi, gwesteiwyr, sbardunau neu eitemau. A gallwch chi ddiweddaru macros trwy'r API rhyngwyneb gwe.

Mae gan Zabbix ddogfennaeth API dda a manwl. Ar gyfer cyfnewid data trwy api, defnyddir fformat data Json. Ceir manylion yn dogfennaeth swyddogol.

Mae dilyniant y gweithredoedd ar gyfer cael y data sydd ei angen arnom a'u cofnodi mewn macro i'w weld yn y diagram isod.

Zabbix - ehangu ffiniau macro

Cam 1

Gall y cam cyntaf gynnwys un weithred neu gamau lluosog. Gosodir yr holl brif resymeg yn y camau cyntaf, a'r 3 cham olaf yw'r prif rai.

Yn fy enghraifft i, y cam cyntaf oedd cael cwcis awdurdodi ar y PBX ar gyfer y dasg gyntaf. Ar gyfer yr ail dasg, cefais nifer y fersiwn firmware Mikrotik cyfredol.

URL y fersiynau cyfredol o firmware Mikrotik

Mae'r offer Mikrotik ei hun yn cyrchu'r cyfeiriadau hyn pan dderbynnir y fersiwn cadarnwedd diweddaraf sydd ar gael.

Mae'r cam cyntaf yn gwbl unigol ar gyfer pob achos a gall rhesymeg ei waith fod yn wahanol. Mae'r cyfan yn dibynnu ar eich tasg.

Wrth weithio gyda sgriptio gwe, cadwch olwg ar ba ddull ymateb sydd ei angen arnoch chi. Teitlau Ymateb HTTP neu hunan тело ymateb heb benawdau?
Os oes angen cwcis awdurdodi, yna gosodwch y dull ymateb Teitlau fel yn achos Asterisk.

Os oes angen data arnoch, fel yn achos ymateb gweinydd mikrotik, rhowch Y corff ymateb heb benawdau.

Cam 2

Gadewch i ni symud ymlaen at yr ail gam. Cael sesiwn awdurdodi:

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 yw'r fersiwn o'r protocol JSON-RPC sy'n cael ei ddefnyddio;
Mae Zabbix yn gweithredu fersiwn JSON-RPC 2.0;

  • method - y dull a elwir;
  • params - paramedrau sy'n cael eu pasio gan y dull;
  • id yn ddynodwr cais mympwyol;
  • auth - allwedd dilysu defnyddiwr; gan nad yw gennym eto, gadewch i ni ei osod i null.

I weithio gyda'r API, creais gyfrif ar wahân gyda hawliau cyfyngedig. Yn gyntaf, nid oes angen i chi roi mynediad i le nad oes angen i chi wneud hynny. Ac yn ail, cyn fersiwn 5.0, gellid darllen y cyfrinair a osodwyd trwy'r macro. Yn unol â hynny, os ydych chi'n defnyddio cyfrinair gweinyddwr Zabbix, mae'n hawdd dwyn y cyfrif gweinyddol.

Bydd hyn yn arbennig o wir wrth weithio gydag API trwy sgriptiau trydydd parti a storio tystlythyrau ar yr ochr.

Ers fersiwn 5.0 mae opsiwn i guddio'r cyfrinair a arbedwyd yn y macro.

Zabbix - ehangu ffiniau macro

Wrth greu cyfrif ar wahân ar gyfer diweddaru data trwy'r API, gwnewch yn siŵr eich bod yn gwirio a yw'r data sydd ei angen arnoch ar gael trwy'r rhyngwyneb gwe ac a yw'n bosibl ei ddiweddaru. Wnes i ddim gwirio, ac yna am amser hir ni allwn ddeall pam nad oedd y macro oedd ei angen arnaf yn weladwy yn yr API.

Zabbix - ehangu ffiniau macro

Ar ôl i ni dderbyn awdurdodiad yn yr API, rydym yn symud ymlaen i gael rhestr o macros.

Cam 3

Nid yw'r API yn caniatáu ichi ddiweddaru macro gwesteiwr yn ôl enw, rhaid i chi gael yr ID macro yn gyntaf. Ar ben hynny, i gael rhestr o macros ar gyfer gwesteiwr penodol, mae angen i chi wybod ID y gwesteiwr hwn, ac mae hwn yn gais ychwanegol. Defnyddiwch macro rhagosodedig {HOST ID} yn y cais ni chaniateir. Penderfynais osgoi'r cyfyngiad fel hyn:

Zabbix - ehangu ffiniau macro

Fe wnes i greu macro lleol gydag ID y gwesteiwr hwn. Mae darganfod ID y gwesteiwr yn hawdd iawn o'r rhyngwyneb gwe.

Gellir hidlo ymateb gyda rhestr o'r holl macros ar westeiwr penodol trwy batrwm:

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

Zabbix - ehangu ffiniau macro

Felly, rydym yn cael ID y macro sydd ei angen arnom, ble MIKROTIK_VERSION yw enw'r macro yr ydym yn chwilio amdano. Yn fy achos i, mae'r macro yn cael ei chwilio MIKROTIK_VERSIONYr hwn a neilltuwyd i'r gwesteiwr.

Mae'r cais ei hun yn edrych fel hyn:

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
}

Amrywiol {sid} a gafwyd yn yr ail gam a bydd yn cael ei ddefnyddio'n gyson, lle mae angen i chi weithio gyda'r rhyngwyneb API.

Terfynol 4 CAM - diweddaru'r macro

Nawr rydyn ni'n gwybod yr ID macro y mae angen ei ddiweddaru, y cwci awdurdodi neu fersiwn firmware y llwybrydd. Gallwch chi ddiweddaru'r macro ei hun.

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
}

{microtik_version} yw'r gwerth a gafwyd yn y cam cyntaf. Yn fy enghraifft, y fersiwn o'r firmware mikrotik cyfredol
{hostmacroid} - cafwyd y gwerth yn y trydydd cam - id y macro yr ydym yn ei ddiweddaru.

Canfyddiadau

Mae'r dull o ddatrys y broblem gydag ymarferoldeb safonol yn llawer mwy cymhleth a hirach. Yn enwedig os ydych chi'n gwybod rhaglennu ac yn gallu ychwanegu'r rhesymeg angenrheidiol yn y sgript yn gyflym.

Mantais amlwg y dull hwn yw "cludadwyedd" yr ateb rhwng gwahanol weinyddion.

I mi yn bersonol, mae'n rhyfedd na all yr asiant HTTP gael mynediad at ddata eitem arall a'u hamnewid yn y corff cais neu'r penawdau [ ZBXNEXT-5993].

Gall y templed gorffenedig lawrlwythwch ar GitHub.

Ffynhonnell: hab.com

Ychwanegu sylw