Kako takoj povezati Zabbix z Asterisk

V prejšnjem članku "Zabbix - širjenje makro meja" Povedal sem vam, kako prejeti avtorizacijsko sejo in jo nadomestiti z makrom lokalnega gostitelja. V tem članku vam bom povedal, kako povezati Zabbix z Asterisk brez zunanjih skriptov in programske opreme.

Ideja o »sprijateljevanju« teh dveh sistemov se je rodila že dolgo nazaj, brez namestitve dodatne programske opreme ali skriptov. Hitro googlanje je dalo veliko možnih rešitev, vse se je skrčilo na to, da naložiš skripte (v Pyha, Bash, Python itd.) na strežnik, pa boš srečen. Spremljanje sem želel implementirati "izven škatle" - brez zunanjih skript in namestitve dodatne programske opreme na strežnik z nadzorom in PBX.

Za to sem porabil skupno 4 delovne dni, vendar je bil rezultat vreden tega. Delo prek vmesnika AMI, zaznavanje nizkega nivoja, sprožitve in, kar je najpomembnejše, povezava PBX in vse druge nastavitve zdaj traja približno 15 minut.

Na voljo je Zabbix 4.4, približno 100 kosov Asterisk različice 13. Nekatere telefonske centrale imajo spletni vmesnik FreePBX, nekatere z golo konzolo, kupom trikov in integracijo prek dialplana.

Prejemanje podatkov iz PBX

Prva in glavna točka, ki jo je treba rešiti, je pridobivanje podatkov o vrstnikih in SIP registracijah. V ta namen ima PBX konzolne vmesnike AGI, AMI, ARI in SSH. Iz očitnih razlogov nisem upošteval dodatnih modulov.

Najprej moramo ugotoviti, kaj so ti agi, ami, ari ...

  • AGI - uporaba skriptov v dialplanu. Uporablja se predvsem za upravljanje klicev.
  • AMI - lahko zagotovi vse potrebne informacije, deluje prek vrat 5038, podobno kot Telnet. Ustreza nam!
  • ARI - moderno, modno, JSON. Obstaja veliko možnosti, oblika podatkov je razumljiva za Zabbix, vendar zame ni glavne stvari: ne morete nadzorovati registracije sip. Druga pomanjkljivost je, da sta za vrstnike samo dve stanji online/offline, čeprav je stanj več in jih je koristno upoštevati pri diagnosticiranju.
  • SSH lahko naredi vse, vendar včasih ni dovoljen zaradi "varnostnih razlogov". Premisleki so lahko različni, o njih se ne bom spuščal.

Kljub vsem svojim pomanjkljivostim pa ARI pokriva 90 % vseh potreb po spremljanju.

Zabbix in Telnet - moje razočaranje

AMI dobro poznam, nekoč sem implementiral sledenje izgub v pogovorih z delitvijo po oddaljenih pisarnah, upravljanje klicev itd. Tudi pri Telnetu je vse zelo jasno: odprite povezavo, pošljite ukaze in preberite odgovor. To sem tudi naredil, vendar me je rezultat razočaral.

Telnet v Zabbixu ni enak kot v konzoli Linux, je nekoliko preprostejši in prilagojen za standardno avtorizacijo, kot je prijava/geslo. Če je avtorizacijska logika drugačna in ni zahteve za par prijava/geslo, pride do napake. Po neuspešnih poskusih, da bi obšli zahtevo po avtorizaciji, je bilo koristno pogledati izvorno kodo modula Telnet.

Spoznal sem, da dokler ne bo tradicionalne zahteve za prijavo in geslo, ne bom napredoval. Za šalo sem iz kode odstranil vse, kar je povezano z avtorizacijo, in vse na novo sestavil. deluje! Vendar ne izpolnjuje zahtev. Kar daj…

Vrnimo se k iskanju

Znova sem prebral dokumentacijo ARI, opravil dodatne teste - tukaj ni nobenih registracij sip. So pogostitve, so pogovori, so hlače, ni pa registracij. V nekem trenutku sem celo pomislil, ali res potrebujemo registracijo supov?

Po smešnem naključju v tem trenutku od uporabnika prispe še ena zahteva s težavo z odhodnimi klici. Težava je bila v tem, da je registracija sip zamrznila in se je rešila s preprostim ponovnim zagonom modula.

asterisk -rx "sip reload"

Odlično bi bilo dostopati do AMI prek spleta: to bi rešilo vse težave, sem pomislil. Začnem kopati v tej smeri in dobesedno prva vrstica iskanja pripelje do uradne dokumentacije Asterisk, kjer piše, da obstaja možnost za moje naloge spletno omogočeno v datoteki /etc/asterisk/manager.conf, ki mora biti v razdelku nastavljen na DA [splošno]

Po tem prek običajne spletne zahteve obrazca http://ats:8089/mxml?action=SIPshowregistry dobimo vse potrebne informacije.

Pri uporabi vmesnika FreePBX te možnosti ne morete omogočiti prek spleta, omogočiti jo morate prek konzole tako, da spremenite datoteko manager.conf. FreePBX ga ne izbriše, ko se konfiguracija spremeni prek spleta.

Dolgo sem delal z različnimi vrstami integracij z zvezdico, vendar še nikoli nisem zasledil nikjer omenjene te funkcije. Presenečen sem bil, da nihče ne opisuje tega načina interakcije s PBX. Posebej koristno je bilo celo iskanje informacij na to temo: praktično ni ničesar ali pa so bili uporabljeni za povsem drugačna opravila.

WEB AMI - kakšna zver?

Dodajanje možnosti spletno omogočeno vložiti manager.conf omogočil popoln dostop do upravljanja ATS preko spleta. Vsi ukazi, ki so na voljo prek običajnega AMI-ja, so zdaj na spletu, dogodke iz PBX-a lahko poslušate prek vtičnice. Načelo delovanja se ne razlikuje od konzole AMI. Po vklopu te opcije lahko PBX kontaktirate na naslednjih naslovih:

https://ats:8089/manager — spletna stran s preprostim vmesnikom za testiranje in ročno pošiljanje zahtev. Vsi odgovori so oblikovani v berljiv HTML. Ni zelo primeren za spremljanje.
https://ats:8089/rawman — samo besedilni izhod, format podoben konzolnemu AMI
https://ats:8089/mxml - samo besedilni izpis v formatu XML. Ustreza nam!

Kako takoj povezati Zabbix z Asterisk

Potem sem pomislil: »To je rešitev! Zdaj bo vse pripravljeno! Easy-peezy lemon squeezey,« vendar je bilo še prezgodaj za veselje. Za pridobitev informacij, ki jih potrebujemo, je dovolj, da uporabimo zahtevo GET s potrebnim dejanjem ukrepanje, ki v odgovor vrne xml s seznamom vseh registracij in njihovim statusom. Vse to je super, vendar potrebujete avtorizacijo, da si zapomnite sejo iz piškotka. Ko testirate v brskalniku, ne razmišljate o tem procesu.

Postopek avtorizacije

Najprej naslovimo naslov http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, kot odgovor nam strežnik pošlje piškotek z avtorizacijsko sejo. Tako izgleda zahteva HTTP:

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

Odgovor:

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>

Za delo tam potrebujete mansession_id="6f5de42c", tj sam avtorizacijski piškotek.
Vsebina, ki jo morate samo preveriti za odgovor "Preverjanje pristnosti sprejeto" Nato bomo morali za vse klice na strežnik PBX v zahtevo dodati avtorizacijski piškotek.

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

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

Tukaj preberite, kako pridobite avtorizacijski piškotek in ga uporabite v drugih zahtevah: “Zabbix - širjenje makro meja»

Za ustvarjanje sledilnih elementov v Zabbixu bom uporabil samodejno zaznavanje.

Samodejno zaznavanje

Za samodejno zaznavanje registracij in spremljanje enakovrednih stanj se morate obrniti na naslednji naslov: https://ats:8089/mxml?action=SIPshowregistry ali https://ats:8089/mxml?action=SIPpeers

V odgovor nam PBX vrne odgovor XML:

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

V odgovoru je veliko smeti, zato ga v predobdelavi filtriramo po predlogi XPath: //odziv/generično[@gostitelj]
Potem se začne zabava. Za delo z zaznavanjem in dinamično ustvarjanje elementov mora biti odgovor v formatu JSON. XML ni podprt za samodejno zaznavanje.

Za pretvorbo XML v JSON sem se moral malo poigrati s samodejno zamenjavo, za kar sem naredil skripto v JS

Kako takoj povezati Zabbix z Asterisk

Zanimiva točka: v odgovoru ATS so vsi parametri obdani z enojnimi narekovaji in po uporabi predloge //odziv/generično[@gostitelj] zamenjajo jih dvojne.

Za ustvarjanje elementov uporabljamo spremenljivke iz odgovora XML (zdaj JSON).

Kako takoj povezati Zabbix z Asterisk

SIP register

Za registracije sip uporabljamo tri spremenljivke: uporabniško ime, gostitelj, pristanišče. Zadovoljen sem bil z imenom elementa [e-pošta zaščitena]: 5060, nisem našel nobene situacije, ko bi morali uporabiti vseh pet spremenljivk.

Glavni element, ki prejema informacije o vseh registracijah, Zvezdica - AMI SIPshowregistry. Enkrat na minuto pošlje zahtevo GET https://ats:8089/mxml?action=SIPshowregistry, po katerem se odzivni podatki XML posredujejo vsem odvisnim elementom za razčlenjevanje. Za vsako registracijo ustvarim od nje odvisen element. To je priročno, ker prejemamo ažurne podatke v eni zahtevi in ​​ne za vsako zahtevo posebej. Ta izvedba ima pomembno pomanjkljivost - obremenitev procesorja.

Pri testiranju do 100 odvisnih elementov nisem opazil obremenitve, pri 1700 elementih pa je to povzročilo opazno 15 sekundno obremenitev procesorja. Upoštevajte to, če imate veliko število odvisnih elementov.

Kot možnost za "razporeditev" obremenitve ali nastavitev različnih frekvenc anketiranja za element lahko premaknete logiko obdelave na vsak element posebej.

Prejetih informacij ne shranjujem v glavni element. Prvič, ne vidim potrebe po tem, in drugič, če je odziv večji od 64K, ga Zabbix prekine.

Ker za odvisni element uporabljamo celoten odgovor XML, moramo pridobiti vrednost tega elementa v predprocesiranju. Skozi XPath naredi se takole:
niz(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ država)
Za statuse registracije nisem uporabil besedilnih statusov, ampak sem jih pretvoril v številsko obliko s pomočjo JavaScripta:

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

Vrstniki SIP

Po analogiji z registracijami SIP obstaja glavni element Asterisk - AMI SIPshowregistry, ki se mu dodajo odvisni.

To ustvari dva odvisna elementa:

  • Status vrstnika v besedilni obliki
  • Odzivni čas naprave - če je stanje v redu, je zapisan odzivni čas naprave, sicer pa “-1”

Sama pot do elementa je nekoliko preprostejša XPath:

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

Za drugi element sem za ločevanje uporabil JavaScript odzivni čas iz enakovrednega statusa, ker so shranjeni skupaj:

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

Zaključek

Že pripravljena rešitev je lahko zapletena in ni takoj jasna. Poveča prilagodljivost in prenosljivost med različnimi sistemi

Srečno in enostavno integracijo vsem! Predloga in navodila za postavitev GitHub.

Vir: www.habr.com

Dodaj komentar