Zabbix - útwreidzjen fan makrogrinzen

By it meitsjen fan in oplossing foar in klant kamen 2 problemen op dy't ik moai en mei de standert Zabbix-funksjonaliteit oplosse woe.

Opdracht 1. Monitoring fan de hjoeddeiske firmware ferzje op Mikrotik routers.

It probleem kin maklik wurde oplost troch it tafoegjen fan in HTTP-agint oan it sjabloan. De agint ûntfangt de aktuele ferzje fan 'e Mikrotik-webside, en de trigger fergeliket de aktuele ferzje mei de aktuele en, as d'r in diskrepânsje is, jout in warskôging.

As jo ​​10 routers hawwe, is sa'n algoritme net kritysk, mar wat te dwaan mei 3000 routers? Stjoer 3000 fersiken nei de tsjinner? Fansels soe sa'n skema wurkje, mar it idee fan 3000 oanfragen paste my net, ik woe in oare oplossing fine. Dêrnjonken siet der noch in neidiel yn sa'n algoritme: de oare kant koe sa'n oantal oanfragen fan ien IP as in DoS-oanfal telle, en se koene jo gewoan ferbiede.

Opdracht 2. Mei help fan autorisaasje sesjes yn ferskate HTTP-aginten.

As jo ​​​​ynformaasje moatte ûntfange fan "sletten" siden fia in HTTP-agint, hawwe jo in autorisaasjekoekje nedich. Om dit te dwaan, is d'r normaal in standert autorisaasjeformulier mei in pear "oanmelde / wachtwurd" en it ynstellen fan de sesje-ID yn in koekje.

Mar d'r is in probleem: jo kinne gjin tagong krije ta de gegevens fan in oar item fan ien HTTP-agent-item om dizze wearde te ferfangen yn 'e koptekst.

D'r is ek in "Webskript", it hat in oare beheining; it lit jo net ynhâld ûntfange foar analyse en fierdere besparring. Jo kinne allinich de oanwêzigens fan 'e nedige fariabelen op' e siden kontrolearje of earder krigen fariabelen trochjaan tusken de stappen fan it webskript.

Nei it tinken fan in bytsje oer dizze taken, besleat ik makro's te brûken dy't dúdlik sichtber binne yn elk diel fan it tafersjochsysteem: yn sjabloanen, hosts, triggers of items. En jo kinne makro's bywurkje fia de webynterface API.

Zabbix hat goede en detaillearre API dokumintaasje. Om gegevens út te wikseljen fia API, wurdt it Json-gegevensformaat brûkt. Jo kinne yn detail lêze yn offisjele dokumintaasje.

De folchoarder fan aksjes foar it krijen fan de gegevens dy't wy nedich binne en it opnimmen yn in makro wurdt presintearre yn it diagram hjirûnder.

Zabbix - útwreidzjen fan makrogrinzen

stap 1

De earste stap kin bestean út ien aksje of in protte aksjes. De earste stappen befetsje alle basis logika, en de lêste 3 stappen binne de wichtichste.

Yn myn foarbyld wie de earste stap it krijen fan in autorisaasjekoekje op 'e PBX foar de earste taak. Foar de twadde taak krige ik it hjoeddeistige Mikrotik-firmwareferzjenûmer.

URL fan aktuele Mikrotik firmware ferzjes

Dizze adressen binne tagonklik troch de Mikrotik-apparatuer sels as it de lêste beskikbere firmwareferzje ûntfangt.

De earste stap is folslein yndividueel foar elk gefal en de logika fan syn operaasje kin oars wêze. It hinget allegear ôf fan jo taak.

By it wurkjen mei webskripts, hâld dan by hokker metoade jo moatte ûntfange in antwurd. Headings HTTP-antwurd of sels тело antwurd sûnder kopteksten?
As jo ​​autorisaasjecookies nedich binne, set dan de antwurdmetoade yn Headings lykas it gefal is mei Asterisk.

As jo ​​​​gegevens nedich binne, lykas it gefal is mei it antwurd fan 'e mikrotik-tsjinner, set It lichem antwurd sûnder kopteksten.

stap 2

Litte wy nei de twadde stap gean. In autorisaasjesesje ûntfange:

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 - ferzje fan it JSON-RPC protokol dat wurdt brûkt;
Zabbix ymplementearret JSON-RPC ferzje 2.0;

  • metoade - de metoade dy't neamd wurdt;
  • params - parameters dy't troch de metoade trochjûn wurde;
  • id - willekeurige oanfraachidentifikaasje;
  • auth - brûker autentikaasje kaai; Om't wy it noch net hawwe, sette wy it gelyk oan nul.

Om te wurkjen mei de API, haw ik in apart akkount makke mei beheinde rjochten. Foarste plak is it net nedich om tagong te jaan ta plakken dêr't it net nedich is. En twad, foar ferzje 5.0, koe it wachtwurd oantsjutte fia in makro lêzen wurde. Dêrom, as jo it Zabbix-behearderwachtwurd brûke, kin it admin-akkount maklik stellen wurde.

Dit sil foaral wier wêze as jo wurkje mei de API fia skripts fan tredden en opslaan credentials oan 'e kant.

Sûnt ferzje 5.0 is de opsje ferburgen om it wachtwurd te ferbergjen dat is bewarre yn in makro.

Zabbix - útwreidzjen fan makrogrinzen

As jo ​​in apart akkount meitsje om gegevens te aktualisearjen fia de API, wês dan wis dat jo kontrolearje oft de gegevens dy't jo nedich binne beskikber binne fia de webynterface en oft se bywurke wurde kinne. Ik haw net kontrolearre, en doe foar in lange tiid koe ik net begripe wêrom't de makro ik nedich wie net sichtber fia de API.

Zabbix - útwreidzjen fan makrogrinzen

Nei't wy autorisaasje krigen hawwe yn 'e API, geane wy ​​troch mei it krijen fan in list mei makro's.

stap 3

De API-ynterface lit it bywurkjen fan in hostmakro mei namme net ta; om dit te dwaan moatte jo earst de makro-ID krije. Boppedat, om in list mei makro's foar in spesifike host te krijen, moatte jo de ID fan dizze host fine, en dit is in ekstra fersyk. Brûk standert makro {HOST.ID} it is net mooglik yn in fersyk. Ik besleat om de beheining sa om te gean:

Zabbix - útwreidzjen fan makrogrinzen

Ik makke in lokale makro mei de ID fan dizze host. It is heul maklik om de host-ID út te finen fan 'e webynterface.

It antwurd mei in list fan alle makro's foar in opjûne host kin wurde filtere troch it sjabloan:

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

Zabbix - útwreidzjen fan makrogrinzen

Sa krije wy de ID fan 'e makro dy't wy nedich binne, wêr MIKROTIK_VERSJON - de namme fan 'e makro wêr't wy nei sykje. Yn myn gefal wurdt de makro socht MIKROTIK_VERSJON, dat waard tawiisd oan de host.

It fersyk sels sjocht der sa út:

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} krigen yn 'e twadde stap en sil konstant brûkt wurde wêr't jo moatte wurkje mei de API-ynterface.

Finale 4 STEP - it bywurkjen fan de makro

No witte wy de makro-ID dy't bywurke wurde moat, it autorisaasjekoekje of de routerfirmwareferzje. Jo kinne de makro sels bywurkje.

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} - de wearde krigen yn 'e earste stap. Yn myn foarbyld, de ferzje fan de hjoeddeiske mikrotik firmware
{hostmacroid} - de wearde waard krigen yn 'e tredde stap - de id fan 'e makro dy't wy bywurkje.

befinings

De oanpak foar it oplossen fan in probleem mei standertfunksjonaliteit is in protte kearen dreger en duorret langer. Benammen as jo kenne programmearring en kin fluch sette de nedige logika yn in skript.

It fanselssprekkende foardiel fan dizze oanpak is de "portabiliteit" fan 'e oplossing tusken ferskate servers.

Foar my persoanlik is it frjemd dat de HTTP-agint net de mooglikheid hat om tagong te krijen ta gegevens fan in oar item en it te ferfangen yn it fersyklichem of kopteksten [ ZBXNEXT-5993].

In klearmakke sjabloan kin wêze download op GitHub.

Boarne: www.habr.com

Add a comment