Kuidas ühendada Zabbix tärniga karbist välja

Ühes varasemas artiklis "Zabbix – makropiiride laiendamine" Rääkisin teile, kuidas saada autoriseerimisseanss ja asendada see kohaliku hostimakroga. Selles artiklis räägin teile, kuidas ühendada Zabbix Asteriskiga ilma väliste skriptide ja tarkvarata.

Idee nende kahe süsteemiga “sõpru teha” sündis juba ammu, ilma täiendavat tarkvara või skripte installimata. Kiire guugeldamine andis palju võimalikke lahendusi, kõik taandus sellele, et laadige skriptid (Pyha, Bash, Python jne) serverisse üles ja olete rahul. Tahtsin rakendada jälgimist "kastist väljas" - ilma väliste skriptideta ja lisatarkvara installimise serverisse koos jälgimise ja PBX-iga.

Kokku veetsin sellega 4 tööpäeva, kuid tulemus oli seda väärt. AMI liidese, madala taseme tuvastamise, trigerite ja mis kõige tähtsam – PBX-i ja kõigi muude sätete ühendamine võtab nüüd umbes 15 minutit.

Saadaval on Zabbix 4.4, umbes 100 tükki Asteriski versiooni 13. Mõnel PBX-il on FreePBX-i veebiliides, mõnel on tühi konsool, hunnik nippe ja integreerimine sissehelistamisplaani kaudu.

Andmete vastuvõtmine PBX-ist

Esimene ja peamine punkt, mis tuleb lahendada, on andmete hankimine partnerite ja SIP-i registreerimiste kohta. Selleks on PBX-l AGI, AMI, ARI ja SSH konsooli liidesed. Arusaadavatel põhjustel ma lisamooduleid ei kaalunud.

Kõigepealt tuleb välja mõelda, mis need agi, ami, ari on...

  • AGI - skriptide kasutamine valimisplaanis. Kasutatakse peamiselt kõnede haldamiseks.
  • AMI - suudab anda kogu vajaliku teabe, töötab pordi 5038 kaudu, sarnaselt Telnetiga. Meile sobib!
  • ARI - kaasaegne, moodne, JSON. Võimalusi on palju, andmevorming on Zabbixi jaoks arusaadav, aga minu jaoks pole peamist asja: lonksu registreerimist kontrollida ei saa. Teine puudus on see, et eakaaslaste jaoks on võrgus/offline ainult kaks olekut, kuigi olekuid on rohkem ja neid on kasulik diagnoosimisel arvesse võtta.
  • SSH suudab kõike, kuid mõnikord pole see "turvalisuse põhjustel" lubatud. Kaalutlused võivad olla erinevad, ma ei hakka nendesse laskuma.

Kuid kõigi oma puudustega katab ARI 90% kõigist seirevajadustest.

Zabbix ja Telnet – minu pettumus

Tunnen AMI-d hästi, omal ajal rakendasin kadude jälgimist vestlustes kaugkontorite jaotusega, kõnede haldamine jne. Telneti puhul on samuti kõik väga selge: ava ühendus, saada käsud ja loe vastus. Seda ma ka tegin, kuid tulemus valmistas mulle pettumuse.

Telnet Zabbixis ei ole sama, mis Linuxi konsoolis, see on veidi lihtsam ja kohandatud standardse autoriseerimise jaoks, nagu sisselogimine/parool. Kui autoriseerimisloogika on erinev ja sisselogimise/parooli paari taotlust pole, ilmneb tõrge. Pärast tulutuid katseid autoriseerimisnõudest mööda minna, oli kasulik vaadata Telneti mooduli lähtekoodi.

Sain aru, et kuni pole traditsioonilist sisselogimise ja parooli küsimist, ei liigu ma edasi. Lõbu pärast eemaldasin koodist kõik autoriseerimisega seonduva ja panin kõik uuesti kokku. Töötab! Kuid see ei vasta nõuetele. Lase käia…

Tuleme tagasi otsingu juurde

Lugesin uuesti ARI dokumentatsiooni, tegin lisatestid - siin pole lonksu registreerimist. On pidusööke, on vestlusi, on põlvpüksid, aga registreerimisi pole. Mingil hetkel ma isegi mõtlesin, et kas meil on tõesti vaja raisakotka registreerimist?

Naljakal kokkusattumusel saabub sel hetkel kasutajalt teine ​​päring, millel on probleem väljaminevate kõnedega. Probleem oli selles, et sip-i registreerimine külmus ja see lahendati lihtsalt mooduli taaskäivitamise teel.

asterisk -rx "sip reload"

Tore oleks AMI-le veebi kaudu juurde pääseda: see lahendaks kõik probleemid, mõtlesin. Hakkan selles suunas kaevama ja sõna otseses mõttes viib esimene otsingurida ametliku Asteriski dokumentatsioonini, mis ütleb, et minu ülesannete jaoks on olemas valik veebis võimalik failis /etc/asterisk/manager.conf, mille jaotises tuleb määrata YES [üldine]

Pärast seda vormi tavalise veebipäringu kaudu http://ats:8089/mxml?action=SIPshowregistry saame kogu vajaliku teabe.

FreePBX-liidese kasutamisel ei saa seda võimalust veebi kaudu lubada, see tuleb lubada konsooli kaudu, tehes faili manager.conf muudatusi. FreePBX ei kustuta seda, kui veebi kaudu konfiguratsioonimuudatusi tehakse.

Olen pikka aega töötanud mitmesuguste Asteriski integratsioonidega, kuid ma pole seda funktsiooni kunagi kuskil maininud. Olin üllatunud, et keegi ei kirjelda seda PBX-iga suhtlemise meetodit. Selle teema kohta oli isegi eriti kasulik infot otsida: praktiliselt pole midagi või kasutati hoopis teistsuguste ülesannete jaoks.

WEB AMI – milline metsaline?

Valiku lisamine veebis võimalik viilima manager.conf andis täieliku juurdepääsu ATS-i haldusele veebi kaudu. Kõik tavalise AMI kaudu saadaolevad käsud on nüüd veebis, PBX-st saab sündmusi kuulata pistikupesa kaudu. Tööpõhimõte ei erine konsooli AMI-st. Pärast selle valiku aktiveerimist saate PBX-iga ühendust võtta järgmistel aadressidel:

https://ats:8089/manager — lihtsa liidesega veebileht päringute testimiseks ja käsitsi saatmiseks. Kõik vastused vormindatakse loetavasse HTML-i. Ei sobi väga jälgimiseks.
https://ats:8089/rawman — ainult tekstiväljund, konsooli AMI-ga sarnane vorming
https://ats:8089/mxml - ainult tekstiväljund XML-vormingus. Meile sobib!

Kuidas ühendada Zabbix tärniga karbist välja

Siis mõtlesin: „See on lahendus! Nüüd saab kõik valmis! Lihtne-peezy sidruni squeezey”, aga rõõmustada oli veel vara. Vajaliku teabe saamiseks piisab GET-päringu kasutamisest koos vajalike toimingutega tegevus, mis vastusena tagastab xml-i koos kõigi registreerimiste ja nende olekute loendiga. See kõik on suurepärane, kuid küpsisest seansi meeldejätmiseks vajate luba. Kui testite brauseris, ei mõtle te sellele protsessile.

Autoriseerimisprotsess

Kõigepealt käsitleme aadressi http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, saadab server meile koos autoriseerimisseansiga küpsise. HTTP-päring näeb välja selline:

https://ats:8089/mxml?action=login&username=zabbix&secret=zabbix

Host: ats:8089
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Vastus:

GET: HTTP/1.1 200 OK
Server: Asterisk/13.29.2
Date: Thu, 18 Jun 2020 17:41:19 GMT
Cache-Control: no-cache, no-store
Content-type: text/xml
Set-Cookie: mansession_id="6f5de42c"; Version=1; Max-Age=600
Pragma: SuppressEvents
Content-Length: 146

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" message="Authentication accepted"/>
</response>
</ajax-response>

Seal töötamiseks on vaja maja_id="6f5de42c", st autoriseerimisküpsis ise.
Sisu, millele peate lihtsalt vastust kontrollima"Autentimine aktsepteeritud" Järgmisena peame kõigi PBX-serveri kõnede puhul lisama päringule autoriseerimisküpsise.

https://ats:8089/mxml?action=SIPpeers

Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"

Lugege, kuidas hankida autoriseerimisküpsist ja kasutada seda muudes päringutes: "Zabbix – makropiiride laiendamine»

Zabbixis jälgimiselementide loomiseks kasutan automaatset tuvastamist.

Automaatne tuvastamine

Registreerumiste automaatseks tuvastamiseks ja kaaslaste olekute jälgimiseks peate võtma ühendust järgmisel aadressil: https://ats:8089/mxml?action=SIPshowregistry või https://ats:8089/mxml?action=SIPpeers

Vastuseks saadab PBX meile XML-vastuse:

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" eventlist="start" message="Registrations will follow"/>
</response>
...
<response type="object" id="unknown">
<generic event="RegistryEntry" host="login.mtt.ru" port="5060" username="111111" domain="login.mtt.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="222222" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="333333" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
...
</ajax-response>

Vastuses on palju prügi, nii et eeltöötluses filtreerime selle malli järgi XPath: //response/generic[@host]
Siis algab lõbu. Tuvastamisega töötamiseks ja elementide dünaamiliseks loomiseks peab vastus olema JSON-vormingus. XML-i automaatsete tuvastamiste jaoks ei toetata.

XML-i JSON-iks teisendamiseks pidin natuke mängima automaatse asendamisega, mille jaoks tegin JS-is skripti

Kuidas ühendada Zabbix tärniga karbist välja

Huvitav punkt: ATS-i vastuses on kõik parameetrid ümbritsetud üksikute jutumärkidega ja pärast malli rakendamist //response/generic[@host] need asendatakse kahekordsetega.

Elementide loomiseks kasutame muutujaid XML-vastusest (nüüd JSON).

Kuidas ühendada Zabbix tärniga karbist välja

SIP register

Sip registreerimisel kasutame kolme muutujat: kasutajanimi, võõrustaja, port. Olin elemendi nimetusega rahul [meiliga kaitstud]: 5060, Ma ei ole leidnud ühtegi olukorda, kus oleks vaja kasutada kõiki viit muutujat.

Peamine element, mis saab teavet kõigi registreerimiste kohta, Tärn – AMI SIPshowregistry. Kord minutis teeb see GET-päringu https://ats:8089/mxml?action=SIPshowregistry, mille järel edastatakse vastuse XML-andmed sõelumiseks kõigile sõltuvatele elementidele. Iga registreeringu jaoks loon sellest sõltuva elemendi. See on mugav, kuna saame ajakohase teabe ühe päringu, mitte iga päringu kohta eraldi. Sellel teostusel on märkimisväärne puudus - protsessori koormus.

Kuni 100 sõltuva elemendi testimisel ma koormust ei märganud, kuid 1700 elemendiga andis see protsessorile tuntava 15 sekundilise koormuse. Pidage seda meeles, kui teil on palju sõltuvaid elemente.

Koormuse laiali hajutamise või elemendi jaoks erinevate küsitlussageduste seadmise võimalusena saate töötlusloogika igale elemendile eraldi liigutada.

Ma ei salvesta saadud teavet põhielemendis. Esiteks, ma ei näe selleks vajadust ja teiseks, kui vastus on üle 64K, siis Zabbix katkestab selle.

Kuna me kasutame sõltuva elemendi jaoks täielikku XML-vastust, peame eeltöötluses saama selle elemendi väärtuse. Läbi XPath seda tehakse nii:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ osariik)
Registreerimisolekute jaoks ei kasutanud ma tekstiolekuid, vaid teisendasin need JavaScripti abil numbriliseks:

switch(value) {
  case 'Registered':
    return 1;
  case 'Unregistered':
    return 0;
  default:
    return -1;
}

SIP Peers

Analoogiliselt SIP registreeringutega on Asteriski põhielement - AMI SIPshowregistry, millele lisatakse sõltuvad.

See loob kaks sõltuvat elementi:

  • Peer staatus teksti kujul
  • Seadme reaktsiooniaeg – kui olek on OK, siis kirjutatakse seadme reaktsiooniaeg, vastasel juhul “-1”

Tee elemendi enda juurde on veidi lihtsam XPath:

string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)

Teise elemendi jaoks kasutasin eraldamiseks JavaScripti reaktsiooniaeg kaaslase olekust, kuna need salvestatakse koos:

if(value.substring(0,2) == 'OK'){
	return value.match(/(d+)/gm);
}
else {
	return -1;
}

Järeldus

Valmis lahendus võib olla keeruline ega ole kohe selge. Suurendab paindlikkust ja kaasaskantavust erinevate süsteemide vahel

Head ja kerget integratsiooni kõigile! Mall ja juhised seadistamiseks GitHub.

Allikas: www.habr.com

Lisa kommentaar