Kā savienot Zabbix ar zvaigznīti no iepakojuma

IepriekŔējā rakstā "Zabbix - makro robežu paplaÅ”ināŔana" Es teicu, kā saņemt autorizācijas sesiju un aizstāt to ar vietējo saimniekdatora makro. Å ajā rakstā es jums pastāstÄ«Å”u, kā savienot Zabbix ar Asterisk bez ārējiem skriptiem un programmatÅ«ras.

Ideja ā€œsadraudzētiesā€ ar Ŕīm divām sistēmām radās jau sen, neinstalējot papildu programmatÅ«ru vai skriptus. Ātra googlÄ“Å”ana radÄ«ja daudzus iespējamos risinājumus, viss ir saistÄ«ts ar faktu, ka augÅ”upielādējiet skriptus (Pyha, Bash, Python utt.) serverÄ«, un jÅ«s bÅ«siet laimÄ«gs. Es gribēju ieviest uzraudzÄ«bu ā€œno kastesā€ - bez ārējiem skriptiem un papildu programmatÅ«ras instalÄ“Å”anas serverÄ« ar uzraudzÄ«bu un PBX.

Kopā ar Å”o pavadÄ«ju 4 darba dienas, bet rezultāts bija tā vērts. Darbs, izmantojot AMI interfeisu, zema lÄ«meņa noteikÅ”anu, trigerus un, pats galvenais, PBX un visu citu iestatÄ«jumu pievienoÅ”ana tagad aizņem apmēram 15 minÅ«tes.

Ir pieejams Zabbix 4.4, aptuveni 100 Asterisk 13. versijas gabali. Dažiem PBX ir FreePBX tÄ«mekļa saskarne, daži ar tukÅ”u konsoli, virkni triku un integrāciju, izmantojot iezvanes plānu.

Datu saņemÅ”ana no PBX

Pirmais un galvenais jautājums, kas jāatrisina, ir datu iegÅ«Å”ana par vienaudžiem un SIP reÄ£istrāciju. Å im nolÅ«kam PBX ir AGI, AMI, ARI un SSH konsoles saskarnes. AcÄ«mredzamu iemeslu dēļ es neapsvēru papildu moduļus.

Vispirms jāsaprot, kas ir Ŕie agi, ami, ari...

  • AGI - skriptu izmantoÅ”ana iezvanes plānā. Galvenokārt izmanto zvanu pārvaldÄ«bai.
  • AMI - var sniegt visu nepiecieÅ”amo informāciju, darbojas caur portu 5038, lÄ«dzÄ«gi kā Telnet. Mums der!
  • ARI - moderns, moderns, JSON. Ir daudz iespēju, datu formāts ir saprotams Zabbix, bet man nav galvenais: jÅ«s nevarat kontrolēt sip reÄ£istrāciju. Vēl viens trÅ«kums ir tas, ka vienaudžiem ir tikai divi stāvokļi tieÅ”saistē/bezsaistē, lai gan stāvokļu ir vairāk un ir lietderÄ«gi tos ņemt vērā, veicot diagnostiku.
  • SSH var darÄ«t visu, bet dažreiz tas nav atļauts "droŔības apsvērumu dēļ". Apsvērumi var bÅ«t dažādi, es tajos neiedziļināŔos.

Tomēr ar visiem saviem trūkumiem ARI sedz 90% no visām uzraudzības vajadzībām.

Zabbix un Telnet - mana vilŔanās

Labi pārzinu AMI, savulaik ieviesu zaudējumu izsekoÅ”anu sarunās ar sadalÄ«Å”anu pa attāliem birojiem, zvanu pārvaldÄ«bu u.c. Ar Telnet viss ir arÄ« ļoti skaidrs: atveriet savienojumu, nosÅ«tiet komandas un izlasiet atbildi. Tā es arÄ« izdarÄ«ju, bet rezultāts mani pievÄ«la.

Telnet Zabbix nav tas pats, kas Linux konsolē, tas ir nedaudz vienkārŔāks un pielāgots standarta autorizācijai, piemēram, pieteikÅ”anās/parolei. Ja autorizācijas loÄ£ika atŔķiras un nav pieteikÅ”anās/paroles pāra pieprasÄ«juma, rodas kļūda. Pēc veltÄ«giem mēģinājumiem apiet autorizācijas prasÄ«bu, bija lietderÄ«gi apskatÄ«t Telnet moduļa pirmkodu.

Sapratu, ka kamēr nebÅ«s tradicionālā pieteikÅ”anās un paroles pieprasÄ«Å”ana, tikmēr uz priekÅ”u nevirzÄ«Å”os. Prieka pēc izņēmu no koda visu, kas saistÄ«ts ar autorizāciju, un visu saliku no jauna. Darbojas! Bet tas neatbilst prasÄ«bām. Uz priekÅ”uā€¦

Atgriezīsimies pie meklējumiem

Vēlreiz pārlasÄ«ju ARI dokumentāciju, veicu papildu pārbaudes - Å”eit nav sip reÄ£istrācijas. Ir dzÄ«res, ir sarunas, ir bridžas, bet nav reÄ£istrācijas. Kādā brÄ«dÄ« es pat domāju, vai mums tieŔām ir vajadzÄ«ga grifu reÄ£istrācija?

SmieklÄ«gas sakritÄ«bas dēļ Å”ajā brÄ«dÄ« no lietotāja pienāk vēl viens pieprasÄ«jums ar problēmu ar izejoÅ”ajiem zvaniem. Problēma bija tāda, ka sip reÄ£istrācija sastinga un tika atrisināta, vienkārÅ”i pārstartējot moduli.

asterisk -rx "sip reload"

BÅ«tu lieliski piekļūt AMI, izmantojot tÄ«mekli: tas atrisinātu visas problēmas, es domāju. Es sāku rakt Å”ajā virzienā, un burtiski pirmā meklÄ“Å”anas rindiņa ved uz oficiālo Asterisk dokumentāciju, kurā teikts, ka maniem uzdevumiem ir iespēja Webabled failā /etc/asterisk/manager.conf, kas sadaļā jāiestata uz JĀ [vispārÄ«gi]

Pēc tam, izmantojot parasto veidlapas tÄ«mekļa pieprasÄ«jumu http://ats:8089/mxml?action=SIPshowregistry mēs saņemam visu nepiecieÅ”amo informāciju.

Izmantojot FreePBX saskarni, Å”o opciju nevar iespējot, izmantojot tÄ«mekli; tā ir jāiespējo, izmantojot konsoli, veicot izmaiņas failā manager.conf. FreePBX to neizdzÄ“Å”, ja konfigurācijas izmaiņas tiek veiktas, izmantojot tÄ«mekli.

Es ilgu laiku esmu strādājis ar dažāda veida Asterisk integrācijām, taču es nekad neesmu redzējis Å”o funkciju nekur pieminētu. Es biju pārsteigts, ka neviens neapraksta Å”o mijiedarbÄ«bas metodi ar PBX. Pat Ä«paÅ”i noderÄ«gi bija meklēt informāciju par Å”o tēmu: praktiski nekā nav vai arÄ« tā tika izmantota pavisam citiem uzdevumiem.

WEB AMI - kāds zvērs?

Opcijas pievienoÅ”ana Webabled uz failu vadÄ«tājs.conf nodroÅ”ināja pilnÄ«gu piekļuvi ATS pārvaldÄ«bai, izmantojot tÄ«mekli. Visas komandas, kas pieejamas, izmantojot parasto AMI, tagad ir tÄ«meklÄ«, jÅ«s varat klausÄ«ties notikumus no PBX, izmantojot ligzdu. DarbÄ«bas princips neatŔķiras no konsoles AMI. Pēc Ŕīs opcijas aktivizÄ“Å”anas varat sazināties ar PBX Ŕādās adresēs:

https://ats:8089/manager ā€” tÄ«mekļa lapa ar vienkārÅ”u interfeisu pieprasÄ«jumu pārbaudei un manuālai nosÅ«tÄ«Å”anai. Visas atbildes ir formatētas lasāmā HTML formātā. Nav Ä«paÅ”i piemērots monitoringam.
https://ats:8089/rawman ā€” tikai teksta izvade, formāts lÄ«dzÄ«gs konsoles AMI formātam
https://ats:8089/mxml - tikai teksta izvade XML formātā. Mums der!

Kā savienot Zabbix ar zvaigznīti no iepakojuma

Tad es domāju: ā€œTas ir risinājums! Tagad viss bÅ«s gatavs! Easy-peezy citrona squeezeyā€, bet bija pāragri priecāties. Lai iegÅ«tu mums nepiecieÅ”amo informāciju, pietiek izmantot GET pieprasÄ«jumu ar nepiecieÅ”amo darbÄ«bu rÄ«cÄ«ba, kas atbildē atgriež xml ar visu reÄ£istrāciju sarakstu un to statusu. Tas viss ir lieliski, taču jums ir nepiecieÅ”ama atļauja, lai atcerētos sesiju no sÄ«kfaila. Pārbaudot pārlÅ«kprogrammā, jÅ«s nedomājat par Å”o procesu.

Autorizācijas process

Vispirms mēs uzrunājam adresi http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, atbildot uz to, serveris nosūta mums sīkfailu ar autorizācijas sesiju. Lūk, kā izskatās HTTP pieprasījums:

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

Atbilde:

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>

Lai tur strādātu, vajag savrupmājas_id="6f5de42c", t.i., pats autorizācijas sīkfails.
Saturs, kas jums vienkārÅ”i jāpārbauda, ā€‹ā€‹ā€‹ā€‹vai ir atbilde "Autentifikācija pieņemta" Pēc tam visiem zvaniem uz PBX serveri mums pieprasÄ«jumam bÅ«s jāpievieno autorizācijas sÄ«kfails.

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

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

Kā iegÅ«t autorizācijas sÄ«kfailu un izmantot to citos pieprasÄ«jumos, lasiet Å”eit: "Zabbix - makro robežu paplaÅ”ināŔanaĀ»

Lai izveidotu izsekoŔanas elementus programmā Zabbix, es izmantoŔu automātisko noteikŔanu.

Automātiskā noteikŔana

Lai automātiski noteiktu reģistrācijas un izsekotu vienādranga stāvokļus, jums jāsazinās ar Ŕo adresi: https://ats:8089/mxml?action=SIPshowregistry vai https://ats:8089/mxml?action=SIPpeers

Atbildot uz to, PBX atgriež mums XML atbildi:

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

Atbildē ir daudz atkritumu, tāpēc priekÅ”apstrādē mēs to filtrējam pēc veidnes XPath: //response/generic[@host]
Tad sākas jautrība. Lai strādātu ar noteikŔanu un dinamiski izveidotu elementus, atbildei ir jābūt JSON formātā. XML netiek atbalstīts automātiskai noteikŔanai.

Lai pārveidotu XML uz JSON, man bija nedaudz jāpaspēlējas ar automātisko nomaiņu, kam es izveidoju skriptu JS valodā

Kā savienot Zabbix ar zvaigznīti no iepakojuma

Interesants punkts: ATS atbildē visus parametrus ieskauj atseviŔķas pēdiņas, un pēc veidnes lietoÅ”anas //response/generic[@host] tos aizstāj ar dubultiem.

Lai izveidotu elementus, mēs izmantojam mainīgos no XML atbildes (tagad JSON).

Kā savienot Zabbix ar zvaigznīti no iepakojuma

SIP reģistrs

Sip reģistrācijai mēs izmantojam trīs mainīgos: lietotājvārds, saimnieks, osta. Es biju apmierināts ar elementa nosaukumu [e-pasts aizsargāts]: 5060, Es neesmu atradis nevienu situāciju, kurā būtu jāizmanto visi pieci mainīgie.

Galvenais elements, kas saņem informāciju par visām reÄ£istrācijām, ZvaigznÄ«te ā€” AMI SIPshowregistry. Reizi minÅ«tē tas veic GET pieprasÄ«jumu https://ats:8089/mxml?action=SIPshowregistry, pēc kura atbildes XML dati tiek nodoti visiem atkarÄ«gajiem elementiem parsÄ“Å”anai. Katrai reÄ£istrācijai es izveidoju no tā atkarÄ«gu elementu. Tas ir ērti, jo mēs saņemam aktuālo informāciju vienā pieprasÄ«jumā, nevis par katru pieprasÄ«jumu atseviŔķi. Å ai ievieÅ”anai ir ievērojams trÅ«kums - procesora slodze.

Pārbaudot līdz 100 atkarīgiem elementiem, noslodzi nemanīju, bet ar 1700 elementiem tas deva manāmu 15 sekunžu slodzi procesoram. Paturiet to prātā, ja jums ir liels skaits atkarīgo elementu.

Kā iespēju ā€œizkliedētā€ slodzi vai iestatÄ«t elementam dažādas aptaujas frekvences, varat pārvietot apstrādes loÄ£iku katram elementam atseviŔķi.

Es neglabāju saņemto informāciju galvenajā elementā. Pirmkārt, es neredzu tam vajadzÄ«bu, un, otrkārt, ja atbilde ir lielāka par 64 K, tad Zabbix to pārtrauc.

Tā kā atkarÄ«gajam elementam mēs izmantojam pilnu XML atbildi, mums ir jāiegÅ«st Ŕī elementa vērtÄ«ba priekÅ”apstrādē. Caur XPath tas tiek darÄ«ts Ŕādi:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ Valsts)
Reģistrācijas statusiem es neizmantoju teksta statusus, bet konvertēju tos ciparu formā, izmantojot JavaScript:

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

SIP Peers

Pēc analoģijas ar SIP reģistrāciju ir galvenais Asterisk elements - AMI SIPshowregistry, kuram tiek pievienoti atkarīgie.

Tādējādi tiek izveidoti divi atkarīgi elementi:

  • Vienaudžu statuss teksta formā
  • IerÄ«ces reakcijas laiks - ja statuss ir OK, tiek rakstÄ«ts ierÄ«ces reakcijas laiks, pretējā gadÄ«jumā ā€œ-1ā€

CeļŔ uz paŔu elementu ir nedaudz vienkārŔāks XPath:

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

Otrajam elementam atdalīŔanai izmantoju JavaScript reakcijas laiks no vienādranga statusa, jo tie tiek glabāti kopā:

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

Secinājums

Izgatavots risinājums var būt sarežģīts un ne uzreiz skaidrs. Palielina elastību un pārnesamību starp dažādām sistēmām

Laimīgu un vieglu integrāciju visiem! Veidne un instrukcijas iestatīŔanai GitHub.

Avots: www.habr.com

Pievieno komentāru