Zabbix – utvidgar makrogrĂ€nser

NÀr jag skapade en lösning för kunden, dök det upp tvÄ problem som jag ville lösa pÄ ett elegant sÀtt med den standardfunktionalitet som Zabbix erbjuder.

Problem 1. Övervakning av den aktuella firmwareversionen pĂ„ Mikrotik-routrar.

Problemet löses enkelt genom att lÀgga till en HTTP-agent i mallen. Agenten hÀmtar den aktuella versionen frÄn Mikrotik:s webbplats, och en trigger jÀmför den aktuella versionen med den installerade versionen och ger en alert om det finns en skillnad.

NÀr du har 10 routrar Àr en sÄdan algoritm inte kritisk, men vad ska man göra med 3000 routrar? Skicka 3000 förfrÄgningar till servern? SjÀlvklart skulle en sÄdan lösning fungera, men sjÀlva idén med 3000 förfrÄgningar var oacceptabel för mig; jag ville hitta en annan lösning. Dessutom finns det en nackdel med en sÄdan algoritm: den andra sidan kan se ett sÄdant antal förfrÄgningar frÄn en och samma IP som en DoS-attack och kan helt enkelt blockera det.

Problem 2. AnvÀndning av autentiseringensessioner i olika HTTP-agenter.

NÀr man genom en HTTP-agent behöver hÀmta information frÄn "stÀngda" sidor krÀvs en autentiseringscookie. För detta finns det vanligtvis en standardform för autentisering med ett "anvÀndarnamn/lösenord"-par och en session-ID som sÀtts i cookien.

Men det finns ett problem, man kan inte frÄn ett HTTP-agentobjekt direkt fÄ Ätkomst till data frÄn ett annat objekt för att infoga det vÀrdet i Headern.

Det finns ocksÄ en "Webbscenarie", som har en annan begrÀnsning; den tillÄter inte att hÀmta innehÄll för analys och vidare sparande. Man kan endast kontrollera förekomsten av nödvÀndiga variabler pÄ sidorna eller överföra tidigare erhÄllna variabler mellan stegen i webbscenariot.

Efter att ha funderat lite pÄ dessa problem bestÀmde jag mig för att anvÀnda makron, som Àr lÀtt synliga i alla delar av övervakningssystemet: i mallar, vÀrdar, triggers eller objekt. Dessutom kan makrona uppdateras via API:n i webgrÀnssnittet.

Zabbix har en bra och detaljerad dokumentation om API. För datautbyte över API anvÀnds JSON-formatet. Det kan man lÀsa mer om i den officiella dokumentationen.

Sekvensen av steg för att hÀmta de data vi behöver och skriva dem till makrot visas i diagrammet nedan.

Zabbix – utvidgar makrogrĂ€nser

Steg 1

Det första steget kan bestÄ av en enda ÄtgÀrd eller flera ÄtgÀrder. I de första stegen inlagras hela den grundlÀggande logiken, och de tre sista stegen Àr de viktigaste.

I mitt exempel utfördes i det första steget hÀmtningen av autentiserings-cookien frÄn PBX för det första problemet. För det andra problemet hÀmtade jag numret pÄ den aktuella firmwareversionen för Mikrotik.

URL för aktuella versioner av Mikrotik-firmware

Dessa adresser anvÀnds av Mikrotik-enheterna för att hÀmta den senaste tillgÀngliga firmware-versionen.

Det första steget Àr helt individuellt för varje fall och logiken bakom kan skilja sig. Allt beror pÄ din uppgift.

NÀr du arbetar med webbscheman, övervaka vilken metod för att fÄ svar som du behöver. Rubriker HTTP-svar eller sjÀlva kroppen avsvar utan rubriker?
Om autentisering cookies behövs, ange svarmetoden Rubriker som i fallet med Asterisk.

Om du behöver data, som i fallet med svaret frÄn Mikrotik-servern, sÀtt istÀllet Kropp svaret utan rubriker.

Steg 2

LÄt oss gÄ vidare till det andra steget. FÄ autentisering-sessionen:

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 — versionen av JSON-RPC-protokollet som anvĂ€nds;
Zabbix implementerar JSON-RPC version 2.0;

  • method — metoden som anropas;
  • params — parametrarna som överförs med metoden;
  • id — valfritt identifieringsnummer för förfrĂ„gan;
  • auth — anvĂ€ndarens autentiseringstoken; eftersom vi Ă€nnu inte har en, sĂ€tter vi den till null.

För att arbeta med API:t skapade jag ett separat konto med begrÀnsade rÀttigheter. För det första Àr det inte nödvÀndigt att ge tillgÄng till omrÄden som inte behövs. För det andra, fram till version 5.0, kunde det angivna lösenordet genom makron lÀsas. DÀrför, om du anvÀnder Zabbix-administratörens lösenord, kan administratörskontot enkelt bli stöld.

Detta Àr sÀrskilt relevant nÀr du arbetar med API:t via tredjepartsskript och lagrar referensuppgifter pÄ sidan.

FrÄn version 5.0 infördes en funktion för att dölja lösenordet som sparats i makrot.

Zabbix – utvidgar makrogrĂ€nser

NÀr du skapar ett separat konto för att uppdatera data via API, kontrollera alltid att de data du behöver Àr tillgÀngliga via webbgrÀnssnittet och om de kan uppdateras. Jag kontrollerade inte, och kunde sedan lÀnge inte förstÄ varför det hade rÀtt makro inte var synligt via API.

Zabbix – utvidgar makrogrĂ€nser

Efter att ha fÄtt autentisering i API gÄr vi vidare till att hÀmta listan över makron.

Steg 3

API-grÀnssnittet tillÄter inte att uppdatera vÀrdmakron med namn, för att göra det mÄste man först fÄ makro-ID. Dessutom, för att fÄ en lista med makron för en specifik vÀrd, mÄste man veta ID för den vÀrden, och det hÀr Àr en extra förfrÄgan. AnvÀnd standardmakrot. {HOST.ID} Àr inte tillÄtet i förfrÄgan. Jag beslutade att kringgÄ begrÀnsningen pÄ följande sÀtt:

Zabbix – utvidgar makrogrĂ€nser

Jag skapade ett lokalt makro med ID för denna vÀrd. Att ta reda pÄ vÀrdens ID Àr mycket enkelt via webbgrÀnssnittet.

Svaret med listan över alla makron för denna vÀrd kan filtreras med följande mönster:

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

Zabbix – utvidgar makrogrĂ€nser

PÄ sÄ sÀtt fÄr vi ID för det makro vi behöver, dÀr MIKROTIK_VERSION Àr namnet pÄ makrot vi söker. I mitt fall letar vi efter makrot MIKROTIK_VERSION, som har tilldelats vÀrden.

SjÀlva förfrÄgan ser ut sÄ hÀr:

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
}

Variabel {sid} fick pÄ steg tvÄ och kommer stÀndigt att anvÀndas dÀr man behöver arbeta med API-grÀnssnittet.

Slutlig steg 4 — uppdatering av makrot

Nu vet vi ID för makrot som ska uppdateras, sessionscookie eller version av routerfirmware. Vi kan uppdatera sjÀlva makrot.

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} Ă€r vĂ€rdet som erhölls i första steget. I mitt exempel — den aktuella versionen av Mikrotiks firmware.
{hostmacroid} Ă€r vĂ€rdet vi fick i tredje steget — ID för makrot som vi uppdaterar.

Slutsatser

TillvÀgagÄngssÀttet för att lösa uppgiften med standardfunktionaliteten Àr betydligt mer komplicerat och tidskrÀvande. SÀrskilt om man kan programmering och snabbt kan skissa pÄ logiken i ett skript.

En uppenbar fördel med detta tillvÀgagÄngssÀtt Àr "portabiliteten" i lösningen mellan olika servrar.

Jag tycker personligen att det Àr mÀrkligt att det inte finns nÄgon möjlighet att i HTTP-agenten referera till data frÄn ett annat objekt och infoga dem i förfrÄgningskroppen eller rubrikerna [ ZBXNEXT-5993].

Den fÀrdiga mallen kan laddas ner frÄn GitHub..

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster