So verbinden Sie Zabbix sofort mit Asterisk

In einem früheren Artikel „Zabbix – Erweiterung der Makrogrenzen“ Ich habe Ihnen erklärt, wie Sie eine Autorisierungssitzung empfangen und in ein lokales Host-Makro ersetzen. In diesem Artikel verrate ich Ihnen, wie Sie Zabbix ohne externe Skripte und Software mit Asterisk verbinden.

Die Idee, sich mit diesen beiden Systemen anzufreunden, entstand schon vor langer Zeit, ohne dass zusätzliche Software oder Skripte installiert werden mussten. Ein kurzes Googeln ergab viele mögliche Lösungen, alles lief darauf hinaus, die Skripte (in Pyha, Bash, Python usw.) auf den Server hochzuladen, und Sie werden zufrieden sein. Ich wollte das Monitoring „out of the box“ umsetzen – ohne externe Skripte und die Installation zusätzlicher Software auf dem Server mit Monitoring und PBX.

Ich habe insgesamt 4 Arbeitstage damit verbracht, aber das Ergebnis hat sich gelohnt. Das Durcharbeiten der AMI-Schnittstelle, der Low-Level-Erkennung, der Auslöser und vor allem des Anschließens der TK-Anlage und aller anderen Einstellungen dauert jetzt etwa 15 Minuten.

Zabbix 4.4 ist verfügbar, etwa 100 Stück Asterisk Version 13. Einige Telefonanlagen verfügen über die FreePBX-Weboberfläche, andere über eine reine Konsole, eine Reihe von Tricks und die Integration über einen Wählplan.

Empfangen von Daten von der TK-Anlage

Der erste und wichtigste Punkt, der gelöst werden muss, ist die Beschaffung von Daten über Peers und SIP-Registrierungen. Zu diesem Zweck verfügt die TK-Anlage über AGI-, AMI-, ARI- und SSH-Konsolenschnittstellen. Aus offensichtlichen Gründen habe ich keine zusätzlichen Module in Betracht gezogen.

Zuerst müssen wir herausfinden, was diese Agi, Ami, Ari sind ...

  • AGI – Verwendung von Skripten im Wählplan. Wird hauptsächlich für die Anrufverwaltung verwendet.
  • AMI – kann alle notwendigen Informationen bereitstellen, funktioniert über Port 5038, ähnlich wie Telnet. Passt uns!
  • ARI – modern, modisch, JSON. Es gibt viele Möglichkeiten, das Datenformat ist für Zabbix verständlich, aber für mich gibt es keine Hauptsache: Man kann die SIP-Registrierung nicht steuern. Ein weiterer Nachteil besteht darin, dass es für Peers nur zwei Zustände online/offline gibt, obwohl es mehr Zustände gibt und es sinnvoll ist, diese bei der Diagnose zu berücksichtigen.
  • SSH kann alles, aber manchmal ist es aus „Sicherheitsgründen“ nicht erlaubt. Die Überlegungen können unterschiedlich sein, ich werde nicht näher darauf eingehen.

Trotz aller Mängel deckt ARI jedoch 90 % des gesamten Überwachungsbedarfs ab.

Zabbix und Telnet – meine Enttäuschung

Ich kenne AMI gut; einmal habe ich die Nachverfolgung von Verlusten in Gesprächen mit Abteilungen nach Außenstellen, Anrufverwaltung usw. implementiert. Auch bei Telnet ist alles ganz klar: Verbindung öffnen, Befehle senden und Antwort lesen. Das habe ich getan, aber das Ergebnis hat mich enttäuscht.

Telnet in Zabbix ist nicht dasselbe wie in der Linux-Konsole, es ist etwas einfacher und auf Standardautorisierungen wie Login/Passwort zugeschnitten. Wenn die Autorisierungslogik unterschiedlich ist und kein Login/Passwort-Paar angefordert wird, tritt ein Fehler auf. Nach vergeblichen Versuchen, die Autorisierungspflicht zu umgehen, war es sinnvoll, einen Blick auf den Quellcode des Telnet-Moduls zu werfen.

Mir wurde klar, dass ich nicht weitermachen werde, solange es keine herkömmliche Anmelde- und Passwortabfrage gibt. Aus Spaß habe ich alles, was mit der Autorisierung zu tun hat, aus dem Code entfernt und alles neu zusammengesetzt. Funktioniert! Aber es entspricht nicht den Anforderungen. Fortfahren…

Kehren wir zur Suche zurück

Ich habe die ARI-Dokumentation noch einmal gelesen und zusätzliche Tests durchgeführt – hier gibt es keine SIP-Registrierungen. Es gibt Feste, es gibt Gespräche, es gibt Reithosen, aber es gibt keine Anmeldungen. Irgendwann dachte ich sogar, brauchen wir wirklich eine SIP-Registrierung?

Durch einen lustigen Zufall kommt in diesem Moment eine weitere Anfrage des Benutzers mit einem Problem mit ausgehenden Anrufen. Das Problem bestand darin, dass die SIP-Registrierung einfror und durch einen einfachen Neustart des Moduls behoben werden konnte.

asterisk -rx "sip reload"

Es wäre toll, über das Internet auf AMI zuzugreifen: Das würde alle Probleme lösen, dachte ich. Ich fange an, in diese Richtung zu graben, und buchstäblich führt die erste Suchzeile zur offiziellen Asterisk-Dokumentation, in der steht, dass es eine Option für meine Aufgaben gibt Webfähig im Ordner /etc/asterisk/manager.conf, das im Abschnitt auf JA gesetzt werden muss [allgemein]

Danach durch eine reguläre Webanfrage des Formulars http://ats:8089/mxml?action=SIPshowregistry wir bekommen alle nötigen Informationen.

Wenn Sie die FreePBX-Schnittstelle verwenden, können Sie diese Option nicht über das Web aktivieren; Sie müssen sie über die Konsole aktivieren, indem Sie Änderungen an der Datei manager.conf vornehmen. FreePBX löscht es nicht, wenn Konfigurationsänderungen über das Web vorgenommen werden.

Ich habe lange Zeit mit verschiedenen Arten von Asterisk-Integrationen gearbeitet, aber diese Funktion wurde nirgendwo erwähnt. Ich war überrascht, dass niemand diese Art der Interaktion mit der TK-Anlage beschreibt. Es war sogar besonders nützlich, nach Informationen zu diesem Thema zu suchen: Es gibt praktisch nichts oder es wurde für ganz andere Aufgaben verwendet.

WEB AMI – was für ein Biest?

Hinzufügen einer Option Webfähig einordnen manager.conf Bietet vollen Zugriff auf die ATS-Verwaltung über das Internet. Alle über ein reguläres AMI verfügbaren Befehle sind jetzt im Web verfügbar. Sie können Ereignisse von der PBX über einen Socket abhören. Das Funktionsprinzip unterscheidet sich nicht vom Konsolen-AMI. Nach Aktivierung dieser Option können Sie die TK-Anlage unter folgenden Adressen erreichen:

https://ats:8089/manager – eine Webseite mit einer einfachen Schnittstelle zum Testen und manuellen Senden von Anfragen. Alle Antworten werden in lesbarem HTML formatiert. Zur Überwachung wenig geeignet.
https://ats:8089/rawman – Nur Textausgabe, Format ähnlich dem Konsolen-AMI
https://ats:8089/mxml - Nur Textausgabe im XML-Format. Passt uns!

So verbinden Sie Zabbix sofort mit Asterisk

Dann dachte ich: „Das ist die Lösung!“ Jetzt ist alles fertig! „Easy-peezy Lemon Squeezey“, aber es war zu früh, um sich zu freuen. Um die von uns benötigten Informationen zu erhalten, reicht es aus, eine GET-Anfrage mit der erforderlichen Aktion zu verwenden Aktion, das als Antwort XML mit einer Liste aller Registrierungen und deren Status zurückgibt. Das ist alles großartig, aber Sie benötigen eine Autorisierung, um sich die Sitzung aus dem Cookie zu merken. Wenn Sie im Browser testen, denken Sie nicht an diesen Vorgang.

Autorisierungsprozess

Zuerst gehen wir auf die Adresse ein http://ats:8089/mxml?action=login&username=zabbix&secret=zabbixAls Antwort sendet uns der Server ein Cookie mit der Autorisierungssitzung. So sieht eine HTTP-Anfrage aus:

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

Antwort:

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>

Um dort zu arbeiten, brauchen Sie mansession_id="6f5de42c", also das Autorisierungs-Cookie selbst.
Inhalt, den Sie nur nach der Antwort durchsuchen müssen.Authentifizierung akzeptiert" Als nächstes müssen wir für alle Anrufe an den PBX-Server der Anfrage ein Autorisierungscookie hinzufügen.

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

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

Lesen Sie hier, wie Sie ein Autorisierungs-Cookie erhalten und es in anderen Anfragen verwenden: „Zabbix – Erweiterung der Makrogrenzen»

Um Tracking-Elemente in Zabbix zu erstellen, verwende ich die automatische Erkennung.

Automatische Erkennung

Um Registrierungen automatisch zu erkennen und Peer-Status zu verfolgen, müssen Sie sich an die folgende Adresse wenden: https://ats:8089/mxml?action=SIPshowregistry oder https://ats:8089/mxml?action=SIPpeers

Als Antwort sendet uns die PBX eine XML-Antwort zurück:

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

Die Antwort enthält viel Müll, daher filtern wir sie in der Vorverarbeitung nach Vorlage XPath: //response/generic[@host]
Dann beginnt der Spaß. Um mit der Erkennung zu arbeiten und Elemente dynamisch zu erstellen, muss die Antwort im JSON-Format vorliegen. XML wird für automatische Erkennungen nicht unterstützt.

Um XML in JSON zu konvertieren, musste ich ein wenig mit der automatischen Ersetzung experimentieren, wofür ich ein Skript in JS erstellt habe

So verbinden Sie Zabbix sofort mit Asterisk

Ein interessanter Punkt: In der ATS-Antwort sind alle Parameter in einfache Anführungszeichen gesetzt und nach dem Anwenden der Vorlage //response/generic[@host] sie werden durch doppelte ersetzt.

Zum Erstellen von Elementen verwenden wir Variablen aus der XML-Antwort (jetzt JSON).

So verbinden Sie Zabbix sofort mit Asterisk

SIP-Registrierung

Für SIP-Registrierungen verwenden wir drei Variablen: Benutzername, Gastgeber, port . Ich war mit dem Namen des Elements zufrieden [E-Mail geschützt] : 5060, habe ich keine Situationen gefunden, in denen Sie alle fünf Variablen verwenden müssen.

Das Hauptelement, das Informationen über alle Registrierungen erhält, Asterisk - AMI SIPshowregistry. Einmal pro Minute stellt es eine GET-Anfrage an https://ats:8089/mxml?action=SIPshowregistryAnschließend werden die XML-Antwortdaten zur Analyse an alle abhängigen Elemente übergeben. Für jede Registrierung erstelle ich ein davon abhängiges Element. Dies ist praktisch, da wir aktuelle Informationen in einer Anfrage erhalten und nicht für jede Anfrage einzeln. Diese Implementierung hat einen erheblichen Nachteil – die Belastung des Prozessors.

Beim Testen von bis zu 100 abhängigen Elementen habe ich die Belastung nicht bemerkt, aber bei 1700 Elementen führte dies zu einer spürbaren Belastung des Prozessors von 15 Sekunden. Beachten Sie dies, wenn Sie über eine große Anzahl abhängiger Elemente verfügen.

Als Option zum „Verteilen“ der Last oder zum Festlegen unterschiedlicher Abfragefrequenzen für ein Element können Sie die Verarbeitungslogik auf jedes Element separat verschieben.

Ich speichere die empfangenen Informationen nicht im Hauptelement. Erstens sehe ich dafür keine Notwendigkeit, und zweitens schneidet Zabbix ab, wenn die Antwort mehr als 64 KB beträgt.

Da wir eine vollständige XML-Antwort für das abhängige Element verwenden, müssen wir den Wert dieses Elements in der Vorverarbeitung ermitteln. Durch XPath es wird so gemacht:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ Zustand)
Für Registrierungsstatus habe ich keine Textstatus verwendet, sondern diese mithilfe von JavaScript in eine numerische Form umgewandelt:

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

SIP-Peers

Analog zu SIP-Registrierungen gibt es ein Hauptelement von Asterisk – AMI SIPshowregistry, zu dem abhängige hinzugefügt werden.

Dadurch entstehen zwei abhängige Elemente:

  • Peer-Status in Textform
  • Antwortzeit des Geräts – wenn der Status OK ist, wird die Antwortzeit des Geräts geschrieben, andernfalls „-1“

Der Weg zum Element selbst ist etwas einfacher XPath:

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

Für das zweite Element habe ich JavaScript zum Trennen verwendet Reaktionszeit vom Peer-Status, da sie zusammen gespeichert sind:

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

Abschluss

Eine sofort einsatzbereite Lösung kann komplex und nicht sofort klar sein. Erhöht die Flexibilität und Portabilität zwischen verschiedenen Systemen

Viel Spaß und einfache Integration euch allen! Vorlage und Anleitung zum Aufbau GitHub.

Source: habr.com

Kommentar hinzufügen