Hur man integrerar Zabbix med Asterisk "out of the box"

I den föregĂ„ende artikeln «Zabbix — tĂ€nja makrogrĂ€nser» Jag har berĂ€ttat hur man fĂ„r en autentiseringssession och infogar den i en lokal vĂ€rdmakro. I denna artikel kommer jag att förklara hur man kan integrera Zabbix med Asterisk utan externa skript och programvara.

IdĂ©n att "integrera" dessa tvĂ„ system föddes för lĂ€nge sedan, utan att behöva installera ytterligare mjukvara och skript. En snabb sökning pĂ„ Google visade mĂ„nga lösningar, som alla handlade om att ladda upp skript (i PHP, Bash, Python osv.) pĂ„ servern, sĂ„ skulle allt fungera. Jag ville dock implementera övervakning "ur lĂ„dan" — utan externa skript och installation av extra programvara pĂ„ servern med övervakning och telefonsystem.

Jag kÀmpade med detta i totalt fyra arbetsdagar, men resultatet var vÀrt det. Arbetet genom AMI-grÀnssnittet, lÄgnivÄupptÀckten, triggers, och framför allt, nu tar det bara 15 minuter att koppla till telefonsystemet och göra alla andra instÀllningar.

Zabbix 4.4 finns tillgÀngligt, med cirka 100 enheter av Asterisk version 13. Vissa telefonsystem kommer med webgrÀnssnittet FreePBX, andra med en enkel konsol, en massa knep och integrering genom dialplan.

HÀmta data frÄn telefonsystemet

Det första och frÀmsta problemet som mÄste lösas Àr att fÄ information om peers och SIP-registreringar. För detta finns det grÀnssnitt i telefonsystemet: AGI, AMI, ARI och SSH-konsolen. Jag övervÀgde inte nÄgra ytterligare moduler av uppenbara skÀl.

Först mÄste vi förstÄ vad dessa AGI, AMI och ARI Àr....

  • AGI — anvĂ€ndning av skript i dialplanen. AnvĂ€nds frĂ€mst för att hantera samtal.
  • AMI — kan ge all nödvĂ€ndig information, arbetar via port 5038 pĂ„ liknande sĂ€tt som Telnet. Det passar oss!
  • ARI — modernt, trendigt, JSON-baserat. MĂ„nga möjligheter, datformatet Ă€r begripligt för Zabbix, men det saknar en viktig funktion: man kan inte kontrollera SIP-registreringen. En annan nackdel Ă€r att det bara finns tvĂ„ tillstĂ„nd för peers: online/offline, Ă€ven om det finns fler tillstĂ„nd som Ă€r nyttiga att beakta vid diagnostik.
  • SSH — kan göra allt, men ibland fĂ„r man inte access av "sĂ€kerhetsskĂ€l". SkĂ€len kan variera, jag gĂ„r inte in pĂ„ dem.

Trots sina brister tÀcker ARI 90% av alla behov för övervakning.

Zabbix och Telnet — min besvikelse

Jag kÀnner till AMI vÀl, under en tid implementerade jag övervakning av förluster i samtal med uppdelning enligt avlÀgsna kontor, samtalshantering osv. Med Telnet Àr allt Àven kristallklart: öppna anslutningen, skicka kommandon och lÀs svaret. SÄ jag gjorde, men resultatet gjorde mig besviken.

Telnet i Zabbix Àr inte samma som i Linux-konsolen, det Àr nÄgot enklare och utformat för standardautentisering som anvÀndarnamn/lösenord. Om autentiseringslogiken Àr annorlunda och det inte finns nÄgon begÀran om anvÀndarnamn/lösenord, fÄr man ett fel. Efter ihÀrdiga försök att kringgÄ kravet pÄ autentisering började jag titta pÄ kÀllkoden för Telnet-modulen.

Jag förstod att jag inte skulle komma lĂ€ngre förrĂ€n den traditionella begĂ€ran om anvĂ€ndarnamn med lösenord kom. Av ren nyfikenhet tog jag bort allt som rörde autentisering frĂ„n koden, kompilerade allting pĂ„ nytt. Det fungerar! Men det passar inte kraven. Vi gĂ„r vidare


LÄt oss ÄtervÀnda till sökandet

Jag lĂ€ste igenom dokumentationen för ARI, genomförde ytterligare tester — det finns inga SIP-registreringar hĂ€r. Det finns peers, det finns samtal, det finns bridges, men inga registreringar. Vid ett tillfĂ€lle funderade jag pĂ„ om vi verkligen behöver SIP-registreringar?

Av en rolig slump kommer det vid denna tidpunkt ytterligare en förfrÄgan frÄn en anvÀndare med problem med utgÄende samtal. Problemet var att SIP-registreringen hÀngde, och det löstes med en vanlig omstart av modulen.

asterisk -rx "sip reload"

Det skulle vara fantastiskt att kunna fÄ tillgÄng till AMI via webben: det skulle lösa alla problem, tÀnkte jag. Jag börjar grÀva i den riktningen, och den första raden jag hittar leder till den officiella dokumentationen för Asterisk, dÀr det stÄr att det finns ett alternativ för mina uppgifter. webenabled i filen /etc/asterisk/manager.conf, som mÄste sÀttas till vÀrdet YES, i sektionen [general]

Efter detta, genom en vanlig webbförfrÄgan som ser ut som http://ats:8089/mxml?action=SIPshowregistry fÄr vi all nödvÀndig information.

Vid anvÀndning av FreePBX-grÀnssnittet kan detta alternativ inte aktiveras via webben; det mÄste aktiveras via konsolen genom att göra Àndringar i filen manager.conf. FreePBX tar inte bort det vid Àndringar i konfigurationen via webben.

SĂ„ mycket som jag har arbetat med olika typer av Asterisk-integrationer har jag aldrig sett nĂ„gonstans nĂ€mnas denna funktion. Jag blev förvĂ„nad över att ingen beskriver denna metod för interaktion med telefonsystemet. Även nĂ€r jag specifikt sökte information om detta Ă€mne: det finns nĂ€stan ingenting, eller sĂ„ anvĂ€ndes det för helt andra uppgifter.

WEB AMI — vad Ă€r det för nĂ„got?

TillĂ€gg av alternativet webenabled till filen manager.conf Öppnade fullstĂ€ndig Ă„tkomst till att hantera telefonvĂ€xeln via webben. Alla kommandon som finns tillgĂ€ngliga via vanlig AMI finns nu i webben, och man kan lyssna pĂ„ hĂ€ndelser frĂ„n telefonvĂ€xeln via en socket. Funktionsprincipen skiljer sig inte frĂ„n den konsolbaserade AMI. Efter att denna funktion har aktiverats kan telefonvĂ€xeln nĂ„s via följande adresser:

https://ats:8089/manager — webbsida med ett enkelt grĂ€nssnitt för tester och manuell begĂ€ran av förfrĂ„gningar. Alla svar formateras i lĂ€sligt HTML-format. Inte sĂ€rskilt lĂ€mplig för övervakning.
https://ats:8089/rawman — endast textutmatning, formatet Ă€r liknande det som anvĂ€nds för konsolbaserad AMI
https://ats:8089/mxml — endast textutmatning, i XML-format. Det funkar för oss!

Hur man integrerar Zabbix med Asterisk "out of the box"

HÀr tÀnkte jag: "Det hÀr Àr lösningen! Nu blir allt klart! LÀtt som en plÀtt", men det var för tidigt att fira. För att fÄ den information vi behöver rÀcker det att anvÀnda en GET-förfrÄgan med rÀtt ÄtgÀrd ÄtgÀrd, som returnerar XML med en lista över alla registreringar och deras status. Det Àr jÀttebra, men autentisering behövs med kvarhÄllande av session genom cookies. NÀr man testar i webblÀsaren tÀnker man inte pÄ denna process.

Autentiseringsprocessen

I början kontaktar vi adressen http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, varpÄ servern skickar en cookie med autentiseringssessionen. SÄ hÀr ser HTTP-förfrÄgan ut:

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: sv-SE,sv;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

Svar:

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

För att arbeta dÀr behöver man mansession_id="6f5de42c", dvs. sjÀlva autentiseringscookien.
InnehÄllet behöver bara kontrollera om svaret innehÄller "Authentication accepted". DÀrefter, vid alla förfrÄgningar till telefonvÀxeln, mÄste vi lÀgga till autentiseringscookien i förfrÄgan.

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

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

Hur man fĂ„r autentiseringscookien och anvĂ€nder den i andra förfrĂ„gningar kan lĂ€sas hĂ€r: "Zabbix – utvidgar makrogrĂ€nser»

För att skapa spÄrningselement i Zabbix kommer jag anvÀnda automatisk upptÀckning.

Automatisk upptÀckning

För automatisk upptÀckning av registreringar och spÄrning av peer-statusar mÄste man kontakta adressen: https://ats:8089/mxml?action=SIPshowregistry eller https://ats:8089/mxml?action=SIPpeers

I svaret returnerar telefonvÀxeln ett XML-svar:

...









...

Det finns mycket skrÀp i svaret, sÄ vi filtrerar det med en mall i preprocessing. XPath: //response/generic[@host]
Nu börjar det mest intressanta. För att arbeta med upptÀckten och dynamiskt skapa element behöver svaret vara i JSON-format. XML stöds inte vid automatisk upptÀckning.

För att konvertera XML till JSON var jag tvungen att leka lite med automatisk ersÀttning, sÄ jag gjorde ett skript i JS.

Hur man integrerar Zabbix med Asterisk "out of the box"

Ett intressant moment Àr att i svaret frÄn PBX Àr alla parametrar inramade med enkel citat, men efter tillÀmpning av mallen //response/generic[@host] ersÀtts de med dubbla.

För att skapa element anvÀnder vi variablerna frÄn XML-svaret (nu JSON).

Hur man integrerar Zabbix med Asterisk "out of the box"

SIP Registry

För SIP-registreringar anvÀnder vi tre variabler: username, host, port. Jag var nöjd med namnet pÄ elementet 111111@login.mtt.ru:5060, jag hittade inte situationer dÀr jag behövde anvÀnda alla fem variabler.

Huvudelementet som fĂ„r information om alla registreringar, Asterisk — AMI SIPshowregistry. En gĂ„ng per minut gör den en GET-förfrĂ„gan till https://ats:8089/mxml?action=SIPshowregistry, och efter det överförs XML-svarsdatan till alla beroende element för analys. Jag skapar elementet för varje registrering beroende av det. Det Ă€r bekvĂ€mt eftersom vi fĂ„r aktuell information med en förfrĂ„gan, inte för varje separat. Denna implementation har en betydande nackdel — belastning pĂ„ processorn.

Vid testning med upp till 100 beroende element sÄg jag ingen belastning, men med 1700 element gav det en mÀrkbar 15 sekunders belastning pÄ processorn. TÀnk pÄ detta om du har ett stort antal beroende element.

Ett alternativ för att "sprida" belastningen eller stÀlla in olika intervall för varje element kan vara att flytta bearbetningslogiken till varje element separat.

Jag lagrar inte den mottagna informationen i huvudobjektet. För det första ser jag ingen anledning till det, och för det andra, om svaret Àr mer Àn 64K, sÄ beskÀr Zabbix det.

Eftersom vi anvÀnder det fullstÀndiga XML-svaret för den beroende elementet, behöver vi i förbehandlingen fÄ vÀrdet för detta element. Via XPath detta görs sÄ hÀr:
string(//response/generic[@event='RegistryEntry'][@username='{#SIP_REGISTRY_USERNAME}'][@host='{#SIP_REGISTRY_HOST}'][@port='{#SIP_REGISTRY_PORT}']/@state)
För registreringsstatusar anvÀnde jag inte textstatusar, utan översatte dem till numeriskt format med hjÀlp av JavaScript:

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

SIP Peers

PĂ„ samma sĂ€tt som SIP-registreringar, finns det ett huvudobjekt Asterisk — AMI SIPshowregistry, till vilket beroende element lĂ€ggs till.

HÀr skapas tvÄ beroende element:

  • Peer-status i textformat
  • Svarstiden för enheten — om statusen Ă€r OK, sĂ„ anges svarstiden för enheten, annars '-1'

SjÀlva vÀgen till elementet Àr redan lite enklare XPath:

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

För det andra elementet anvÀnde jag JavaScript för att separera svarstiden frÄn peer-statusen, eftersom de lagras tillsammans:

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

Slutsats

Lösningen "out-of-the-box" kan vara komplex och inte omedelbart förstÄelig. Flexibiliteten och portabiliteten mellan olika system ökar.

Jag önskar alla en trevlig och enkel integration! Mall och instruktioner för instÀllning finns pÄ 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