Nola konektatu Zabbix Asterisk kutxatik kanpo

Aurreko artikulu batean "Zabbix - makro-mugak zabaltzea" Baimen-saio bat nola jaso eta tokiko ostalari makro batean nola ordeztu esan nizuen. Artikulu honetan esango dizut nola konektatu Zabbix Asterisk-ekin kanpoko script eta softwarerik gabe.

Aspaldi sortu zen bi sistema hauen “lagunak egiteko” ideia, software edo script gehigarririk instalatu gabe. Googling azkar batek irtenbide posible asko eman zituen, scriptak (Pyha, Bash, Python, etab.) zerbitzarian kargatu eta pozik egongo zara. Monitorizazioa "kutxatik kanpo" ezarri nahi nuen - kanpoko scriptik gabe eta zerbitzarian software gehigarria instalatu monitorizazioa eta PBXarekin.

Guztira 4 lanegun eman nituen honekin, baina emaitzak merezi izan zuen. AMI interfazearen bidez lan egiteak, maila baxuko detekzioa, abiarazleak eta, batez ere, PBXa eta gainerako ezarpen guztiak konektatzeak 15 minutu inguru behar ditu orain.

Zabbix 4.4 eskuragarri dago, Asterisk 100 bertsioaren 13 pieza inguru. PBX batzuk FreePBX web interfazearekin datoz, beste batzuk kontsola hutsarekin, trikimailu mordoa eta dialplan baten bidez integratzeko.

PBXetik datuak jasotzea

Ebatzi beharreko lehen puntu eta nagusia parekideei eta SIP erregistroei buruzko datuak lortzea da. Horretarako, PBXak AGI, AMI, ARI eta SSH kontsola interfazeak ditu. Ageriko arrazoiengatik, ez nuen modulu osagarririk kontuan hartu.

Lehenik agi, ami, ari hauek... zer diren asmatu behar dugu.

  • AGI - dialplaneko gidoiak erabiliz. Batez ere deiak kudeatzeko erabiltzen da.
  • AMI - beharrezko informazio guztia eman dezake, 5038 atakaren bidez funtzionatzen du, Telnet-en antzera. Egokitzen zaigu!
  • ARI - modernoa, modan, JSON. Aukera asko daude, datuen formatua ulergarria da Zabbixentzat, baina niretzat ez dago gauza nagusirik: ezin duzu sip erregistroa kontrolatu. Beste desabantaila bat da parekideentzat sarean/offlinean bi estatu baino ez daudela, nahiz eta estatu gehiago egon eta diagnostikoa egiterakoan kontuan hartzea komeni den.
  • SSH dena egin dezake, baina batzuetan ez da onartzen "segurtasun arrazoiengatik". Gogoetak desberdinak izan daitezke, ez naiz horietan sartuko.

Hala ere, bere gabezia guztiekin, ARIk monitorizazio behar guztien % 90 estaltzen du.

Zabbix eta Telnet - nire etsipena

Ondo ezagutzen dut AMI; garai batean urruneko bulegoen banaketarekin, deien kudeaketa eta abarretako elkarrizketetan galeren jarraipena ezarri nuen. Telnet-ekin, gainera, dena oso argi dago: ireki konexioa, bidali komandoak eta irakurri erantzuna. Horixe egin nuen, baina emaitzak etsita ninduen.

Zabbix-en Telnet ez da Linux kontsolaren berdina, apur bat sinpleagoa da eta baimen estandar baterako egokituta dago, hala nola saioa hasteko/pasahitza. Baimen-logika desberdina bada, eta ez badago saio-hasiera/pasahitz bikote baten eskaerarik, errore bat gertatzen da. Baimen-eskakizuna gainditzeko alferrikako saiakerak egin ondoren, erabilgarria izan zen Telnet moduluaren iturburu-kodea aztertzea.

Konturatu nintzen ohiko login eta pasahitz eskaera egin arte ez dudala aurrera egingo. Dibertitzeko bakarrik, baimenarekin lotutako guztia kendu nuen kodeatik eta dena muntatu nuen. Lanak! Baina ez ditu baldintzak betetzen. Segi aurrera…

Itzuli gaitezen bilaketara

Berriro irakurri dut ARI dokumentazioa, proba osagarriak egin ditut - hemen ez dago sip erregistrorik. Jaiak daude, elkarrizketak, kaltzak daude, baina ez dago izen-ematerik. Noizbait pentsatu nuen, benetan behar al dugu putreen erregistroa?

Kasualitate dibertigarri baten ondorioz, momentu honetan erabiltzailearen beste eskaera bat iristen da, irteerako deiekin arazo batekin. Arazoa izan zen sip erregistroa izoztu zela eta modulua berrabiarazi besterik ez zela konpontzen zela.

asterisk -rx "sip reload"

Oso ondo legoke AMI sarean sartzea: horrek arazo guztiak konponduko lituzke, pentsatu nuen. Norabide honetan zulatzen hasten naiz, eta literalki lehenengo bilaketa lerroak Asterisk dokumentazio ofizialera eramaten du, nire zereginetarako aukera dagoela dioena. web gaituta fitxategian /etc/asterisk/manager.conf, BAI ezarri behar dena atalean [orokorra]

Horren ostean, formularioaren ohiko web eskaera baten bidez http://ats:8089/mxml?action=SIPshowregistry beharrezko informazio guztia lortzen dugu.

FreePBX interfazea erabiltzean, ezin duzu aukera hau web bidez gaitu; kontsolaren bidez gaitu behar duzu manager.conf fitxategian aldaketak eginez. FreePBX-k ez du ezabatzen konfigurazio-aldaketak web bidez egiten direnean.

Aspalditik lan egin dut Asterisk integrazio mota ezberdinekin, baina ez dut inoiz ikusi ezaugarri hau inon aipatzen. Harritu nintzen inork ez zuela deskribatzen PBXarekin elkarreragiteko metodo hau. Are bereziki erabilgarria izan zen gai honi buruzko informazioa bilatzea: ia ez dago ezer edo guztiz bestelako zereginetarako erabiltzen zen.

WEB AMI - nolako piztia?

Aukera bat gehitzea web gaituta artxibatzeko kudeatzailea.conf ATS kudeaketarako sarbide osoa eman zuen web bidez. Ohiko AMI baten bidez eskuragarri dauden komando guztiak sarean daude orain, PBXetik gertaerak entzun ditzakezu socket baten bidez. Funtzionamenduaren printzipioa ez da kontsolaren AMIaren desberdina. Aukera hau aktibatu ondoren, PBXarekin harremanetan jar zaitezke helbide hauetan:

https://ats:8089/manager — eskaerak eskuz probatzeko eta eskuz bidaltzeko interfaze sinplea duen web orria. Erantzun guztiak HTML irakurgarri batean formateatzen dira. Ez da oso egokia monitorizaziorako.
https://ats:8089/rawman — Testuaren irteera soilik, kontsolaren AMIaren antzeko formatua
https://ats:8089/mxml - testuaren irteera soilik, XML formatuan. Egokitzen zaigu!

Nola konektatu Zabbix Asterisk kutxatik kanpo

Orduan pentsatu nuen: “Hau da irtenbidea! Orain dena prest egongo da! Erraza-peezy limoi squeezey», baina goizegi zen pozteko. Behar dugun informazioa lortzeko, nahikoa da GET eskaera erabiltzea beharrezko ekintzarekin ekintza, eta erantzun gisa xml itzultzen du erregistro guztien zerrenda eta haien egoerarekin. Hau guztia bikaina da, baina baimena behar duzu cookiearen saioa gogoratzeko. Arakatzailean probatzen duzunean, ez duzu prozesu honetan pentsatzen.

Baimen-prozesua

Lehenik eta behin helbidea zuzentzen dugu http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, erantzunez, zerbitzariak cookie bat bidaltzen digu baimen-saioarekin. Hau da HTTP eskaera baten itxura:

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

Erantzuna:

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>

Bertan lan egiteko behar duzu jauregi_id="6f5de42c", hau da, baimen-cookiea bera.
Erantzuna egiaztatu besterik ez duzu behar duzun edukia "Autentifikazioa onartu da" Ondoren, PBX zerbitzarirako dei guztietarako, baimen-cookie bat gehitu beharko diogu eskaerari.

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

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

Irakurri nola lortu baimen-cookie bat eta nola erabili beste eskaera batzuetan hemen: "Zabbix - makro mugak zabaltzea»

Zabbix-en jarraipen-elementuak sortzeko detekzio automatikoa erabiliko dut.

Detekzio automatikoa

Erregistroak automatikoki detektatzeko eta parekoen egoerak jarraitzeko, helbide honekin jarri behar duzu harremanetan: https://ats:8089/mxml?action=SIPshowregistry edo https://ats:8089/mxml?action=SIPpeers

Horren aurrean, PBXak XML erantzun bat itzultzen digu:

<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>

Erantzunetan zabor asko dago, beraz, aurreprozesazioan txantiloiaren arabera iragazten dugu XPath: //erantzuna/generikoa[@host]
Orduan dibertsioa hasten da. Detekzioarekin lan egiteko eta elementuak dinamikoki sortzeko, erantzunak JSON formatuan egon behar du. XML ez da onartzen automatikoki detektatzeko.

XML JSON bihurtzeko, ordezkapen automatikoarekin pixka bat jokatu behar izan nuen, eta horretarako script bat egin nuen JS-n

Nola konektatu Zabbix Asterisk kutxatik kanpo

Puntu interesgarri bat: ATS erantzunean, parametro guztiak komatxo bakarrez inguratuta daude eta txantiloia aplikatu ondoren. //erantzuna/generikoa[@host] bikoitzekin ordezkatzen dira.

Elementuak sortzeko, XML erantzunaren (orain JSON) aldagaiak erabiltzen ditugu.

Nola konektatu Zabbix Asterisk kutxatik kanpo

SIP Erregistroa

Sip erregistroetarako hiru aldagai erabiltzen ditugu: erabiltzailea, ostalari, portu. Pozik nengoen elementuaren izenarekin [posta elektroniko bidez babestua]: 5060, ez dut aurkitu bost aldagaiak erabili behar dituzun egoerarik.

Inskripzio guztiei buruzko informazioa jasotzen duen elementu nagusia, Asterisk - AMI SIPshowregistry. Minutu batean GET eskaera bat egiten dio https://ats:8089/mxml?action=SIPshowregistry, ondoren erantzunaren XML datuak menpeko elementu guztiei pasatzen zaizkie analizatzeko. Erregistro bakoitzeko elementu bat sortzen dut haren menpe. Hau komenigarria da eskaera bakarrean informazio eguneratua jasotzen dugulako, eta ez eskaera bakoitzeko bereizita. Inplementazio honek eragozpen esanguratsu bat du: prozesadorearen karga.

100 elementu menpeko proban, ez nuen karga nabaritu, baina 1700 elementurekin, horrek 15 segundoko karga nabaria eman zion prozesadoreari. Kontuan izan hau menpeko elementu kopuru handia baduzu.

Elementu baterako karga "zabaltzeko" edo galdeketa-maiztasun desberdinak ezartzeko aukera gisa, prozesatzeko logika elementu bakoitzari bereizita eraman dezakezu.

Jasotako informazioa ez dut elementu nagusian gordetzen. Lehenik eta behin, ez dut horren beharrik ikusten, eta, bigarrenik, erantzuna 64K baino gehiago bada, orduan Zabbixek mozten du.

Menpeko elementurako XML erantzun osoa erabiltzen dugunez, elementu honen balioa lortu behar dugu aurreprozesatzeko. bidez XPath horrela egiten da:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ Estatu)
Erregistro-egoeretarako, ez ditut testu-egoerak erabili, baina zenbakizko forma bihurtu ditut JavaScript erabiliz:

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

SIP Peers

SIP erregistroekin analogia eginez, Asterisk-en elementu nagusi bat dago - AMI SIPshowregistry, eta horri menpekoak gehitzen zaizkio.

Horrek menpeko bi elementu sortzen ditu:

  • Parekideen egoera testu moduan
  • Gailuaren erantzun-denbora - egoera ondo badago, gailuaren erantzun-denbora idatziko da, bestela "-1"

Elementurako bidea apur bat sinpleagoa da XPath:

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

Bigarren elementurako JavaScript erabili nuen bereizteko erantzun-denbora parekideen egoeratik, elkarrekin gordetzen direnez:

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

Ondorioa

Kutxaz kanpoko irtenbide bat konplexua izan daiteke eta ez da berehala argia. Sistema ezberdinen arteko malgutasuna eta eramangarritasuna areagotzen du

Zoriontsu eta erraza den integrazioa! Txantiloia eta konfiguratzeko argibideak GitHub.

Iturria: www.habr.com

Gehitu iruzkin berria