In un precedente articolo Ti ho spiegato come ricevere una sessione di autorizzazione e sostituirla in una macro host locale. In questo articolo ti dirò come connettere Zabbix con Asterisk senza script e software esterni.
L'idea di “fare amicizia” tra questi due sistemi è nata molto tempo fa, senza installare software o script aggiuntivi. Una rapida ricerca su Google ha prodotto molte possibili soluzioni, tutto si riduce al fatto che carica gli script (in Pyha, Bash, Python, ecc.) sul server e sarai felice. Volevo implementare il monitoraggio "out of the box", senza script esterni e installando software aggiuntivo sul server con monitoraggio e PBX.
Ho trascorso un totale di 4 giorni lavorativi con questo, ma ne è valsa la pena. Il lavoro tramite l'interfaccia AMI, il rilevamento di basso livello, i trigger e, soprattutto, la connessione del PBX e tutte le altre impostazioni richiedono ora circa 15 minuti.
È disponibile Zabbix 4.4, circa 100 pezzi di Asterisk versione 13. Alcuni PBX sono dotati dell'interfaccia web FreePBX, altri con una semplice console, un sacco di trucchi e l'integrazione tramite un dialplan.
Ricezione di dati dal PBX
Il primo e principale punto da risolvere è ottenere dati sui peer e sulle registrazioni SIP. A questo scopo il PBX dispone delle interfacce console AGI, AMI, ARI e SSH. Per ovvi motivi non ho considerato moduli aggiuntivi.
Per prima cosa dobbiamo capire cosa sono questi agi, ami, ari...
- AGI - utilizzando gli script nel dialplan. Utilizzato principalmente per la gestione delle chiamate.
- AMI - può fornire tutte le informazioni necessarie, funziona tramite la porta 5038, simile a Telnet. Ci va bene!
- ARI: moderno, alla moda, JSON. Ci sono molte possibilità, il formato dei dati è comprensibile per Zabbix, ma per me non c'è una cosa principale: non puoi controllare la registrazione del sip. Un altro svantaggio è che per i peer ci sono solo due stati online/offline, anche se ci sono più stati ed è utile tenerne conto durante la diagnosi.
- SSH può fare tutto, ma a volte non è consentito per “motivi di sicurezza”. Le considerazioni possono essere diverse, non entro in esse.
Tuttavia, nonostante tutte le sue carenze, l’ARI copre il 90% di tutte le esigenze di monitoraggio.
Zabbix e Telnet: la mia delusione
Conosco bene AMI; un tempo ho implementato il tracciamento delle perdite nelle conversazioni con divisione per uffici remoti, gestione delle chiamate, ecc. Con Telnet anche tutto è molto chiaro: aprire la connessione, inviare i comandi e leggere la risposta. Questo è quello che ho fatto, ma il risultato mi ha deluso.
La connessione Telnet di Zabbix non è la stessa di quella della console. LinuxÈ leggermente più semplice ed è progettato per l'autenticazione standard con nome utente e password. Se la logica di autenticazione è diversa e non viene richiesta alcuna coppia nome utente/password, si verifica un errore. Dopo aver tentato senza successo di aggirare il requisito di autenticazione, ho iniziato ad esaminare il codice sorgente del modulo Telnet.
Mi sono reso conto che finché non ci sarà la tradizionale richiesta di login e password, non andrò avanti. Per puro divertimento ho tolto dal codice tutto ciò che riguardava l'autorizzazione e ho rimontato il tutto. Lavori! Ma non soddisfa i requisiti. Andare avanti…
Torniamo alla ricerca
Ho riletto di nuovo la documentazione ARI, ho eseguito ulteriori test: qui non ci sono registrazioni SIP. Ci sono feste, ci sono conversazioni, ci sono calzoni, ma non ci sono registrazioni. Ad un certo punto ho pensato: abbiamo davvero bisogno della registrazione degli avvoltoi?
Per una curiosa coincidenza, in questo momento arriva un'altra richiesta da parte dell'utente, con un problema con le chiamate in uscita. Il problema era che la registrazione SIP si bloccava ed è stato risolto semplicemente riavviando il modulo.
asterisk -rx "sip reload"Sarebbe bello poter accedere all'AMI via web: questo risolverebbe tutti i problemi, ho pensato. Comincio a scavare in questa direzione e letteralmente la prima riga di ricerca porta alla documentazione ufficiale di Asterisk, che dice che esiste un'opzione per i miei compiti abilitato al web in archivio /etc/asterisk/manager.conf, che deve essere impostato su SI, nella sezione [generale]
Successivamente, attraverso una regolare richiesta web del modulo otteniamo tutte le informazioni necessarie.
Quando si utilizza l'interfaccia FreePBX, non è possibile abilitare questa opzione tramite il web; è necessario abilitarla tramite la console apportando modifiche al file manager.conf. FreePBX non lo cancella quando vengono apportate modifiche alla configurazione tramite web.
Lavoro con vari tipi di integrazioni di Asterisk da molto tempo, ma non ho mai visto questa funzionalità menzionata da nessuna parte. Sono rimasto sorpreso dal fatto che nessuno descriva questo metodo di interazione con il PBX. È stato anche particolarmente utile cercare informazioni su questo argomento: non c'è praticamente nulla o è stato utilizzato per compiti completamente diversi.
WEB AMI - che tipo di bestia?
Aggiunta di un'opzione abilitato al web archiviare manager.conf fornito pieno accesso alla gestione ATS via web. Tutti i comandi disponibili tramite una normale AMI sono ora sul web, puoi ascoltare gli eventi dal PBX tramite un socket. Il principio di funzionamento non è diverso dall'AMI della console. Dopo aver attivato questa opzione è possibile contattare il PBX ai seguenti indirizzi:
— una pagina web con un'interfaccia semplice per testare e inviare manualmente le richieste. Tutte le risposte sono formattate in HTML leggibile. Non molto adatto per il monitoraggio.
— solo output di testo, formato simile all'AMI della console
- solo output di testo, in formato XML. Ci va bene!

Allora ho pensato: “Questa è la soluzione! Adesso sarà tutto pronto! Facile da spremere al limone", ma era troppo presto per rallegrarsi. Per ottenere le informazioni di cui abbiamo bisogno è sufficiente utilizzare una richiesta GET con l'azione necessaria azione, che in risposta restituisce xml con l'elenco di tutte le registrazioni e il loro stato. Tutto questo è fantastico, ma è necessaria l'autorizzazione per ricordare la sessione dal cookie. Quando esegui il test nel browser, non pensi a questo processo.
Processo di autorizzazione
Per prima cosa affrontiamo l'indirizzo , in risposta, il server ci invia un cookie con l'autorizzazione della sessione. Ecco come appare una richiesta 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: 1Risposta:
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> Per lavorare lì hai bisogno mansession_id="6f5de42c", ovvero il cookie di autorizzazione stesso.
Contenuto devi solo verificare la risposta "Autenticazione accettata" Successivamente, per tutte le chiamate al server PBX, dovremo aggiungere un cookie di autorizzazione alla richiesta.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"Leggi come ottenere un cookie di autorizzazione e utilizzarlo in altre richieste qui: “»
Per creare elementi di tracciamento in Zabbix utilizzerò il rilevamento automatico.
Rilevamento automatico
Per rilevare automaticamente le registrazioni e tenere traccia degli stati dei peer, è necessario contattare il seguente indirizzo: o
In risposta, il PBX ci restituisce una risposta 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> C'è molta spazzatura nella risposta, quindi durante la preelaborazione la filtriamo per modello XPath: //risposta/generico[@host]
Poi inizia il divertimento. Per utilizzare il rilevamento e creare dinamicamente elementi, la risposta deve essere in formato JSON. XML non è supportato per i rilevamenti automatici.
Per convertire XML in JSON ho dovuto giocare un po' con la sostituzione automatica, per la quale ho realizzato uno script in JS

Un punto interessante: nella risposta ATS, tutti i parametri sono racchiusi tra virgolette singole e dopo aver applicato il modello //risposta/generico[@host] sono sostituiti da doppi.
Per creare elementi, utilizziamo variabili dalla risposta XML (ora JSON).

Registro SIP
Per le registrazioni SIP utilizziamo tre variabili: nome utente, host, porto. Ero soddisfatto del nome dell'elemento 111111@login.mtt.ru:5060, non ho trovato situazioni in cui sia necessario utilizzare tutte e cinque le variabili.
L'elemento principale che riceve informazioni su tutte le registrazioni, Asterisco - AMI SIPshowregistry. Una volta al minuto effettua una richiesta GET , dopodiché i dati XML della risposta vengono passati a tutti gli elementi dipendenti per l'analisi. Per ogni registrazione creo un elemento dipendente da essa. Ciò è utile perché riceviamo informazioni aggiornate in un'unica richiesta e non per ciascuna richiesta separatamente. Questa implementazione presenta uno svantaggio significativo: il carico sul processore.
Durante il test fino a 100 elementi dipendenti, non ho notato il carico, ma con 1700 elementi, questo ha dato un notevole carico di 15 secondi sul processore. Tienilo a mente se hai un numero elevato di elementi dipendenti.
Come opzione per “distribuire” il carico o impostare frequenze di polling diverse per un elemento, è possibile spostare la logica di elaborazione su ciascun elemento separatamente.
Non memorizzo le informazioni ricevute nell'elemento principale. In primo luogo, non ne vedo la necessità e, in secondo luogo, se la risposta è superiore a 64K, Zabbix la interrompe.
Poiché utilizziamo una risposta XML completa per l'elemento dipendente, dobbiamo ottenere il valore di questo elemento durante la preelaborazione. Attraverso XPath è fatto così:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ stato)
Per gli stati di registrazione, non ho utilizzato stati di testo, ma li ho convertiti in forma numerica utilizzando JavaScript:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
Coetanei SIP
Per analogia con le registrazioni SIP, esiste un elemento principale di Asterisk - AMI SIPshowregistry, a cui vengono aggiunti quelli dipendenti.
Questo crea due elementi dipendenti:
- Stato pari in forma di testo
- Tempo di risposta del dispositivo - se lo stato è OK viene scritto il tempo di risposta del dispositivo, altrimenti “-1”
Il percorso verso l'elemento stesso è un po' più semplice XPath:
string(//risposta/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
Per il secondo elemento ho utilizzato JavaScript per separarlo tempo di risposta dallo stato peer, poiché sono memorizzati insieme:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}conclusione
Una soluzione pronta all’uso può essere complessa e non immediatamente chiara. Aumenta la flessibilità e la portabilità tra diversi sistemi
Buona e facile integrazione a tutti! Modello e istruzioni per la configurazione .
Fonte: habr.com
