Zabbix – plečiasi makrokomandos ribos

Darant sprendimą klientui iškilo 2 užduotys, kurias norėjau išspręsti gražiai ir su įprastu Zabbix funkcionalumu.

„1“ iššūkis. Dabartinės mikrotik maršrutizatorių programinės aparatinės įrangos versijos stebėjimas.

Užduotis išspręsta nesunkiai – į HTTP šabloną įtraukus agentą. Agentas gauna dabartinę versiją iš „Mikrotik“ svetainės, o aktyviklis lygina dabartinę versiją su dabartine ir pateikia įspėjimą, jei atsiranda neatitikimų.

Kai turite 10 maršrutizatorių, toks algoritmas nėra kritinis, bet ką daryti su 3000 maršrutizatorių? Siųsti 3000 užklausų į serverį? Žinoma, tokia schema veiks, bet pati 3000 prašymų idėja man netiko, norėjau rasti kitą sprendimą. Be to, tokiame algoritme dar buvo trūkumas: kita pusė gali suskaičiuoti tiek užklausų iš vieno IP DoS atakai, gali tiesiog uždrausti.

„2“ iššūkis. Prieigos seanso naudojimas skirtinguose HTTP agentuose.

Kai agentui reikia gauti informaciją iš „uždarytų“ puslapių per HTTP, reikalingas autorizacijos slapukas. Norėdami tai padaryti, paprastai yra standartinė autorizacijos forma su „prisijungimo / slaptažodžio“ pora ir seanso ID nustatymu slapuke.

Tačiau yra problema, neįmanoma pasiekti kito elemento duomenų iš vieno HTTP agento elemento, kad pakeistumėte šią reikšmę antraštėje.

Taip pat yra „Web script“, jis turi dar vieną apribojimą, neleidžia gauti turinio analizei ir tolesniam išsaugojimui. Galite tik patikrinti, ar puslapiuose yra būtinų kintamųjų, arba perduoti anksčiau gautus kintamuosius tarp žiniatinklio scenarijaus veiksmų.

Šiek tiek pagalvojęs apie šias užduotis, nusprendžiau naudoti makrokomandas, kurios puikiai matomos bet kurioje stebėjimo sistemos dalyje: šablonuose, hostuose, trigeriuose ar elementuose. O makrokomandas galite atnaujinti naudodami žiniatinklio sąsajos API.

„Zabbix“ turi gerą ir išsamią API dokumentaciją. Duomenims keistis per API naudojamas Json duomenų formatas. Išsamią informaciją galite rasti oficialius dokumentus.

Veiksmų seka norint gauti mums reikalingus duomenis ir įrašyti juos į makrokomandą, parodyta žemiau esančioje diagramoje.

Zabbix – plečiasi makrokomandos ribos

Žingsnis 1

Pats pirmasis veiksmas gali būti sudarytas iš vieno veiksmo arba kelių veiksmų. Visa pagrindinė logika yra išdėstyta pirmuose žingsniuose, o paskutiniai 3 žingsniai yra pagrindiniai.

Mano pavyzdyje pirmasis žingsnis buvo gauti autorizacijos slapukus PBX pirmai užduočiai atlikti. Antrajai užduočiai gavau dabartinės Mikrotik programinės įrangos versijos numerį.

Dabartinės Mikrotik programinės įrangos versijų URL

Šiuos adresus pasiekia pati Mikrotik įranga, kai gaunama naujausia turima programinės aparatinės įrangos versija.

Pirmasis žingsnis kiekvienu atveju yra visiškai individualus ir jo darbo logika gali skirtis. Viskas priklauso nuo jūsų užduoties.

Dirbdami su žiniatinklio scenarijais, stebėkite, kokio atsakymo metodo jums reikia. Pavadinimai HTTP atsakymas arba savaime тело atsakymas be antraščių?
Jei reikalingi autorizacijos slapukai, nustatykite atsakymo būdą Pavadinimai kaip ir žvaigždutės atveju.

Jei jums reikia duomenų, kaip ir mikrotik serverio atsakymo atveju, įdėkite kūnas atsakymas be antraščių.

Žingsnis 2

Pereikime prie antrojo žingsnio. Autorizacijos sesijos gavimas:

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 yra JSON-RPC protokolo versija, kuri yra naudojama;
Zabbix įdiegia JSON-RPC 2.0 versiją;

  • Metodas – metodas, kuris vadinamas;
  • params – parametrai, perduodami metodu;
  • id yra savavališkas užklausos identifikatorius;
  • auth – vartotojo autentifikavimo raktas; kadangi dar neturime, nustatykime į nulį.

Norėdamas dirbti su API, sukūriau atskirą paskyrą su ribotomis teisėmis. Pirma, jums nereikia suteikti prieigos ten, kur jums nereikia. Antra, prieš 5.0 versiją buvo galima nuskaityti slaptažodį, nustatytą naudojant makrokomandą. Atitinkamai, jei naudojate „Zabbix“ administratoriaus slaptažodį, administratoriaus paskyrą lengva pavogti.

Tai ypač aktualu dirbant su API naudojant trečiųjų šalių scenarijus ir šone saugojant kredencialus.

Nuo 5.0 versijos yra galimybė paslėpti makrokomandoje išsaugotą slaptažodį.

Zabbix – plečiasi makrokomandos ribos

Kurdami atskirą paskyrą duomenims atnaujinti per API, būtinai patikrinkite, ar jums reikalingi duomenys yra pasiekiami per žiniatinklio sąsają ir ar galima juos atnaujinti. Nepatikrinau, o paskui ilgai negalėjau suprasti, kodėl API nematoma man reikalingos makrokomandos.

Zabbix – plečiasi makrokomandos ribos

Gavus API prieigos teisę, gauname makrokomandų sąrašą.

Žingsnis 3

API neleidžia atnaujinti pagrindinio kompiuterio makrokomandos pagal pavadinimą, pirmiausia turite gauti makrokomandos ID. Be to, norėdami gauti konkretaus pagrindinio kompiuterio makrokomandų sąrašą, turite žinoti šio pagrindinio kompiuterio ID, ir tai yra papildoma užklausa. Naudoti numatytąją makrokomandą {HOST ID} prašyme neleidžiama. Nusprendžiau apeiti apribojimą taip:

Zabbix – plečiasi makrokomandos ribos

Sukūriau vietinę makrokomandą su šio pagrindinio kompiuterio ID. Sužinoti pagrindinio kompiuterio ID labai lengva naudojant žiniatinklio sąsają.

Atsakymas su visų nurodyto pagrindinio kompiuterio makrokomandų sąrašu gali būti filtruojamas pagal šabloną:

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

Zabbix – plečiasi makrokomandos ribos

Taigi, mes gauname mums reikalingos makrokomandos ID, kur MIKROTIK_VERSION yra makrokomandos, kurios ieškome, pavadinimas. Mano atveju makrokomandos ieškoma MIKROTIK_VERSIONKuris buvo priskirtas šeimininkui.

Pats prašymas atrodo taip:

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
}

Kintamas {sid} gautas antrajame žingsnyje ir bus naudojamas nuolat, kur reikia dirbti su API sąsaja.

Paskutinis 4 ŽINGSNIS – makrokomandos atnaujinimas

Dabar žinome makrokomandos ID, kurį reikia atnaujinti, prieigos slapuką arba maršrutizatoriaus programinės įrangos versiją. Galite atnaujinti pačią makrokomandą.

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} yra pirmame žingsnyje gauta vertė. Mano pavyzdyje dabartinės mikrotik programinės įrangos versija
{hostmacroid} - reikšmė gauta trečiame žingsnyje - makrokomandos, kurią atnaujiname, ID.

išvados

Problemos sprendimas naudojant standartines funkcijas yra daug sudėtingesnis ir ilgesnis. Ypač jei išmanai programavimą ir gali greitai į scenarijų įtraukti reikiamą logiką.

Akivaizdus šio požiūrio pranašumas – sprendimo „perkeliamumas“ tarp skirtingų serverių.

Man asmeniškai keista, kad HTTP agentas negali pasiekti kito elemento duomenų ir juos pakeisti užklausos turinyje ar antraštėse [ ZBXNEXT-5993].

Baigtas šablonas gali atsisiųsti iš GitHub.

Šaltinis: www.habr.com

Добавить комментарий