Zabbix - pagpapalawak ng mga hangganan ng macro

Habang gumagawa ng solusyon para sa isang kliyente, 2 problema ang lumitaw na gusto kong lutasin nang maganda at gamit ang karaniwang pag-andar ng Zabbix.

Gawain 1 Pagsubaybay sa kasalukuyang bersyon ng firmware sa mga router ng Mikrotik.

Ang problema ay madaling malutas sa pamamagitan ng pagdaragdag ng isang ahente ng HTTP sa template. Natatanggap ng ahente ang kasalukuyang bersyon mula sa website ng Mikrotik, at inihahambing ng trigger ang kasalukuyang bersyon sa kasalukuyang bersyon at, kung may pagkakaiba, naglalabas ng alerto.

Kapag mayroon kang 10 mga router, ang gayong algorithm ay hindi kritikal, ngunit ano ang gagawin sa 3000 na mga router? Magpadala ng 3000 kahilingan sa server? Siyempre, gagana ang gayong pamamaraan, ngunit ang ideya ng 3000 na mga kahilingan ay hindi nababagay sa akin, nais kong makahanap ng isa pang solusyon. Bilang karagdagan, mayroon pa ring disbentaha sa naturang algorithm: maaaring bilangin ng kabilang panig ang ganoong bilang ng mga kahilingan mula sa isang IP bilang pag-atake ng DoS, at maaari ka lang nilang i-ban.

Gawain 2 Paggamit ng mga session ng pahintulot sa iba't ibang mga ahente ng HTTP.

Kapag kailangan mong makatanggap ng impormasyon mula sa mga "sarado" na pahina sa pamamagitan ng isang ahente ng HTTP, kailangan mo ng cookie ng pahintulot. Upang gawin ito, karaniwang mayroong isang karaniwang form ng awtorisasyon na may pares na "login/password" at itinatakda ang session ID sa isang cookie.

Ngunit may problema: hindi mo ma-access ang data ng isa pang item mula sa isang item ng ahente ng HTTP upang palitan ang halagang ito sa Header.

Mayroon ding "Web script", mayroon itong isa pang limitasyon, hindi ito nagpapahintulot sa iyo na makakuha ng nilalaman para sa pagsusuri at karagdagang pag-save. Maaari mo lamang suriin ang pagkakaroon ng mga kinakailangang variable sa mga pahina o ipasa ang mga dating nakuhang variable sa pagitan ng mga hakbang sa web script.

Pagkatapos mag-isip nang kaunti tungkol sa mga gawaing ito, nagpasya akong gumamit ng mga macro na malinaw na nakikita sa anumang bahagi ng sistema ng pagsubaybay: sa mga template, host, trigger o item. At maaari mong i-update ang mga macro sa pamamagitan ng web interface API.

Ang Zabbix ay may mahusay at detalyadong dokumentasyon ng API. Upang makipagpalitan ng data sa pamamagitan ng API, ginagamit ang format ng data ng Json. Maaari mong basahin nang detalyado sa opisyal na dokumentasyon.

Ang pagkakasunud-sunod ng mga aksyon para sa pagkuha ng data na kailangan namin at pagtatala nito sa isang macro ay ipinakita sa diagram sa ibaba.

Zabbix - pagpapalawak ng mga hangganan ng macro

Hakbang 1

Ang pinakaunang hakbang ay maaaring binubuo ng isang aksyon o maraming aksyon. Ang mga unang hakbang ay naglalaman ng lahat ng pangunahing lohika, at ang huling 3 mga hakbang ay ang mga pangunahing.

Sa aking halimbawa, ang unang hakbang ay kasangkot sa pagkuha ng cookie ng awtorisasyon sa PBX para sa unang gawain. Para sa pangalawang gawain, natanggap ko ang kasalukuyang numero ng bersyon ng firmware ng Mikrotik.

URL ng kasalukuyang mga bersyon ng firmware ng Mikrotik

Ang mga address na ito ay ina-access ng mismong kagamitan ng Mikrotik kapag natanggap nito ang pinakabagong magagamit na bersyon ng firmware.

Ang unang hakbang ay ganap na indibidwal para sa bawat kaso at ang lohika ng operasyon nito ay maaaring iba. Ang lahat ay nakasalalay sa iyong gawain.

Kapag nagtatrabaho sa mga script sa web, subaybayan kung aling paraan ang kailangan mong makatanggap ng tugon. Mga pamagat HTTP na tugon o mismo Ρ‚Π΅Π»ΠΎ tugon nang walang mga header?
Kung kailangan mo ng cookies ng pahintulot, pagkatapos ay itakda ang paraan ng pagtugon Mga pamagat tulad ng kaso sa Asterisk.

Kung kailangan mo ng data, tulad ng kaso sa tugon mula sa mikrotik server, ilagay katawan tugon nang walang mga header.

Hakbang 2

Lumipat tayo sa pangalawang hakbang. Pagtanggap ng session ng pahintulot:

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
}

Ang jsonrpc ay ang bersyon ng JSON-RPC protocol na ginagamit;
Ipinapatupad ng Zabbix ang JSON-RPC na bersyon 2.0;

  • paraan - ang paraan na tinatawag;
  • params - mga parameter na ipinasa ng pamamaraan;
  • id β€” arbitrary request identifier;
  • auth β€” susi sa pagpapatunay ng gumagamit; Dahil wala pa kami nito, itatakda namin itong katumbas ng null.

Para gumana sa API, gumawa ako ng hiwalay na account na may limitadong karapatan. Una, hindi mo kailangang magbigay ng access sa mga lugar na hindi mo kailangan. At pangalawa, bago ang bersyon 5.0, ang password na tinukoy sa pamamagitan ng isang macro ay maaaring basahin. Alinsunod dito, kung gagamitin mo ang Zabbix administrator password, ang admin account ay madaling manakaw.

Magiging totoo ito lalo na kapag nagtatrabaho sa API sa pamamagitan ng mga third-party na script at nag-iimbak ng mga kredensyal sa gilid.

Dahil ang bersyon 5.0 ay may opsyon na itago ang password na naka-save sa macro.

Zabbix - pagpapalawak ng mga hangganan ng macro

Kapag gumagawa ng hiwalay na account para sa pag-update ng data sa pamamagitan ng API, tiyaking suriin kung available ang data na kailangan mo sa pamamagitan ng web interface at kung posible itong i-update. Hindi ko nasuri, at pagkatapos ay sa loob ng mahabang panahon ay hindi ko maintindihan kung bakit ang macro na kailangan ko ay hindi nakikita sa API.

Zabbix - pagpapalawak ng mga hangganan ng macro

Pagkatapos naming matanggap ang pahintulot sa API, magpapatuloy kami sa pagkuha ng listahan ng mga macro.

Hakbang 3

Hindi pinapayagan ng interface ng API ang pag-update ng host macro ayon sa pangalan; para magawa ito, kailangan mo munang makuha ang macro ID. Bukod dito, upang makakuha ng listahan ng mga macro para sa isang partikular na host, kailangan mong malaman ang ID ng host na ito, at ito ay isang karagdagang kahilingan. Gumamit ng karaniwang macro {HOST ID} hindi pwede sa request. Nagpasya akong laktawan ang paghihigpit tulad nito:

Zabbix - pagpapalawak ng mga hangganan ng macro

Gumawa ako ng lokal na macro na may ID ng host na ito. Napakadaling malaman ang host ID mula sa web interface.

Ang tugon na may listahan ng lahat ng macro para sa isang naibigay na host ay maaaring i-filter ng template:

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

Zabbix - pagpapalawak ng mga hangganan ng macro

Kaya, nakukuha namin ang ID ng macro na kailangan namin, kung saan MIKROTIK_VERSION β€” ang pangalan ng macro na aming hinahanap. Sa aking kaso ang macro ay hinahanap MIKROTIK_VERSION, na itinalaga sa host.

Ang kahilingan mismo ay ganito ang hitsura:

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} nakuha sa pangalawang hakbang at patuloy na gagamitin, kung saan kailangan mong magtrabaho kasama ang interface ng API.

Final 4 STEP - pag-update ng macro

Ngayon alam na namin ang macro ID na kailangang i-update, ang authorization cookie o ang bersyon ng firmware ng router. Maaari mong i-update ang macro mismo.

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} β€” ang halaga na nakuha sa unang hakbang. Sa aking halimbawa, ang bersyon ng kasalukuyang mikrotik firmware
{hostmacroid} - ang halaga ay nakuha sa ikatlong hakbang - ang id ng macro na aming ina-update.

Natuklasan

Ang diskarte sa paglutas ng problema gamit ang karaniwang functionality ay maraming beses na mas mahirap at mas tumatagal. Lalo na kung alam mo ang programming at mabilis mong mailalagay ang kinakailangang logic sa isang script.

Ang halatang bentahe ng diskarteng ito ay ang "portability" ng solusyon sa pagitan ng iba't ibang mga server.

Para sa akin nang personal, kakaiba na ang ahente ng HTTP ay walang kakayahang mag-access ng data mula sa isa pang item at palitan ito sa katawan ng kahilingan o mga header [ ZBXNEXT-5993].

Ang isang handa na template ay maaaring i-download sa GitHub.

Pinagmulan: www.habr.com

Magdagdag ng komento