Πώς να συνδέσετε το Zabbix με το Asterisk out of the box

Σε ένα προηγούμενο άρθρο "Zabbix - επέκταση των μακροοικονομικών ορίων" Σας είπα πώς να λάβετε μια περίοδο λειτουργίας εξουσιοδότησης και να την αντικαταστήσετε σε μια τοπική μακροεντολή κεντρικού υπολογιστή. Σε αυτό το άρθρο θα σας πω πώς να συνδέσετε το Zabbix με το Asterisk χωρίς εξωτερικά σενάρια και λογισμικό.

Η ιδέα να «κάνουμε φίλους» με αυτά τα δύο συστήματα γεννήθηκε εδώ και πολύ καιρό, χωρίς να εγκαταστήσετε πρόσθετο λογισμικό ή σενάρια. Ένα γρήγορο γκουγκλάρισμα έδωσε πολλές πιθανές λύσεις, όλα συνέβησαν στο γεγονός ότι ανεβάστε τα σενάρια (σε Pyha, Bash, Python κ.λπ.) στον διακομιστή και θα είστε ευχαριστημένοι. Ήθελα να εφαρμόσω παρακολούθηση "out of the box" - χωρίς εξωτερικά σενάρια και εγκατάσταση πρόσθετου λογισμικού στον διακομιστή με παρακολούθηση και PBX.

Πέρασα συνολικά 4 εργάσιμες ημέρες με αυτό, αλλά το αποτέλεσμα άξιζε τον κόπο. Η εργασία μέσω της διεπαφής AMI, η ανίχνευση χαμηλού επιπέδου, οι σκανδαλισμοί και το πιο σημαντικό, η σύνδεση του PBX και όλων των άλλων ρυθμίσεων διαρκεί τώρα περίπου 15 λεπτά.

Το Zabbix 4.4 είναι διαθέσιμο, περίπου 100 κομμάτια Asterisk έκδοσης 13. Ορισμένα PBX διαθέτουν τη διεπαφή ιστού FreePBX, μερικά με γυμνή κονσόλα, ένα σωρό κόλπα και ενσωμάτωση μέσω σχεδίου κλήσης.

Λήψη δεδομένων από το PBX

Το πρώτο και κύριο σημείο που πρέπει να επιλυθεί είναι η απόκτηση δεδομένων σχετικά με ομότιμες και εγγραφές SIP. Για το σκοπό αυτό, το PBX διαθέτει διεπαφές κονσόλας AGI, AMI, ARI και SSH. Για προφανείς λόγους, δεν εξέτασα πρόσθετες ενότητες.

Πρώτα πρέπει να καταλάβουμε τι είναι αυτά τα αγί, άμι, άρι...

  • AGI - χρήση σεναρίων στο σχέδιο κλήσης. Χρησιμοποιείται κυρίως για τη διαχείριση κλήσεων.
  • AMI - μπορεί να παρέχει όλες τις απαραίτητες πληροφορίες, λειτουργεί μέσω της θύρας 5038, παρόμοια με το Telnet. Μας ταιριάζει!
  • ARI - μοντέρνο, μοντέρνο, JSON. Υπάρχουν πολλές δυνατότητες, η μορφή δεδομένων είναι κατανοητή για το Zabbix, αλλά για μένα δεν υπάρχει κύριο πράγμα: δεν μπορείτε να ελέγξετε την εγγραφή γουλιά. Ένα άλλο μειονέκτημα είναι ότι για τους ομοτίμους υπάρχουν μόνο δύο καταστάσεις online/offline, αν και υπάρχουν περισσότερες καταστάσεις και είναι χρήσιμο να ληφθούν υπόψη κατά τη διάγνωση.
  • Το SSH μπορεί να κάνει τα πάντα, αλλά μερικές φορές δεν επιτρέπεται για «λόγους ασφαλείας». Οι σκέψεις μπορεί να είναι διαφορετικές, δεν θα υπεισέλθω σε αυτές.

Ωστόσο, με όλες τις ελλείψεις του, το ARI καλύπτει το 90% όλων των αναγκών παρακολούθησης.

Zabbix και Telnet - η απογοήτευσή μου

Γνωρίζω καλά την AMI· κάποτε εφάρμοσα παρακολούθηση απωλειών σε συνομιλίες με τμήμα από απομακρυσμένα γραφεία, διαχείριση κλήσεων κ.λπ. Με το Telnet, όλα είναι επίσης πολύ ξεκάθαρα: ανοίξτε τη σύνδεση, στείλτε τις εντολές και διαβάστε την απάντηση. Αυτό έκανα, αλλά το αποτέλεσμα με απογοήτευσε.

Το Telnet στο Zabbix δεν είναι το ίδιο όπως στην κονσόλα Linux, είναι λίγο πιο απλό και προσαρμοσμένο για τυπική εξουσιοδότηση όπως σύνδεση/κωδικός πρόσβασης. Εάν η λογική εξουσιοδότησης είναι διαφορετική και δεν υπάρχει αίτημα για ζεύγος σύνδεσης/κωδικού πρόσβασης, παρουσιάζεται σφάλμα. Μετά από μάταιες προσπάθειες παράκαμψης της απαίτησης εξουσιοδότησης, ήταν χρήσιμο να δούμε τον πηγαίο κώδικα της μονάδας Telnet.

Συνειδητοποίησα ότι μέχρι να υπάρξει ένα παραδοσιακό αίτημα σύνδεσης και κωδικού πρόσβασης, δεν θα προχωρήσω. Για πλάκα, αφαίρεσα ό,τι σχετίζεται με την εξουσιοδότηση από τον κωδικό και τα ξαναέφτιαξα όλα. Εργα! Αλλά δεν πληροί τις απαιτήσεις. Προχώρα…

Ας επιστρέψουμε στην αναζήτηση

Ξαναδιάβασα την τεκμηρίωση του ARI ξανά, έκανα πρόσθετες δοκιμές - δεν υπάρχουν εγγραφές γουλιά εδώ. Γίνονται γλέντια, γίνονται κουβέντες, υπάρχουν βράκες, αλλά δεν γίνονται εγγραφές. Κάποια στιγμή σκέφτηκα, χρειαζόμαστε όντως καταγραφή του γύπα;

Κατά αστεία σύμπτωση, αυτή τη στιγμή έρχεται ένα άλλο αίτημα από τον χρήστη, με πρόβλημα στις εξερχόμενες κλήσεις. Το πρόβλημα ήταν ότι η εγγραφή γουλιά είχε παγώσει και λύθηκε με απλή επανεκκίνηση της μονάδας.

asterisk -rx "sip reload"

Θα ήταν υπέροχο να αποκτήσετε πρόσβαση στο AMI μέσω του ιστού: αυτό θα έλυνε όλα τα προβλήματα, σκέφτηκα. Αρχίζω να σκάβω προς αυτήν την κατεύθυνση και κυριολεκτικά η πρώτη γραμμή αναζήτησης οδηγεί στην επίσημη τεκμηρίωση του Asterisk, η οποία λέει ότι υπάρχει μια επιλογή για τις εργασίες μου webenable στο αρχείο /etc/asterisk/manager.conf, το οποίο πρέπει να οριστεί σε ΝΑΙ, στην ενότητα [γενικός]

Μετά από αυτό, μέσω ενός κανονικού διαδικτυακού αιτήματος της φόρμας http://ats:8089/mxml?action=SIPshowregistry λαμβάνουμε όλες τις απαραίτητες πληροφορίες.

Όταν χρησιμοποιείτε τη διεπαφή FreePBX, δεν μπορείτε να ενεργοποιήσετε αυτήν την επιλογή μέσω του web, πρέπει να την ενεργοποιήσετε μέσω της κονσόλας κάνοντας αλλαγές στο αρχείο manager.conf. Το FreePBX δεν το διαγράφει όταν γίνονται αλλαγές διαμόρφωσης μέσω του web.

Έχω δουλέψει με διάφορα είδη ενσωματώσεων Asterisk για μεγάλο χρονικό διάστημα, αλλά δεν έχω δει ποτέ να αναφέρεται αυτή η δυνατότητα πουθενά. Με εξέπληξε που κανείς δεν περιγράφει αυτή τη μέθοδο αλληλεπίδρασης με το PBX. Ήταν ακόμη ιδιαίτερα χρήσιμο να αναζητήσετε πληροφορίες σχετικά με αυτό το θέμα: δεν υπάρχει σχεδόν τίποτα ή χρησιμοποιήθηκε για εντελώς διαφορετικές εργασίες.

WEB AMI - τι είδους θηρίο;

Προσθήκη επιλογής webenable να αρχειοθετήσω manager.conf παρείχε πλήρη πρόσβαση στη διαχείριση ATS μέσω του Διαδικτύου. Όλες οι εντολές που είναι διαθέσιμες μέσω ενός κανονικού AMI είναι πλέον στο διαδίκτυο, μπορείτε να ακούτε συμβάντα από το PBX μέσω μιας πρίζας. Η αρχή λειτουργίας δεν διαφέρει από την κονσόλα AMI. Αφού ενεργοποιήσετε αυτήν την επιλογή, μπορείτε να επικοινωνήσετε με το PBX στις ακόλουθες διευθύνσεις:

https://ats:8089/manager — μια ιστοσελίδα με απλή διεπαφή για δοκιμή και μη αυτόματη αποστολή αιτημάτων. Όλες οι απαντήσεις μορφοποιούνται σε αναγνώσιμο HTML. Δεν είναι πολύ κατάλληλο για παρακολούθηση.
https://ats:8089/rawman — Μόνο έξοδος κειμένου, μορφή παρόμοια με την κονσόλα AMI
https://ats:8089/mxml - Μόνο εξαγωγή κειμένου, σε μορφή XML. Μας ταιριάζει!

Πώς να συνδέσετε το Zabbix με το Asterisk out of the box

Τότε σκέφτηκα: «Αυτή είναι η λύση! Τώρα όλα θα είναι έτοιμα! Easy-peezy lemon squeezey», αλλά ήταν πολύ νωρίς για να χαρούμε. Για να λάβουμε τις πληροφορίες που χρειαζόμαστε, αρκεί να χρησιμοποιήσουμε ένα αίτημα GET με την απαραίτητη ενέργεια δράση, το οποίο σε απάντηση επιστρέφει το xml με μια λίστα με όλες τις εγγραφές και την κατάστασή τους. Όλα αυτά είναι υπέροχα, αλλά χρειάζεστε εξουσιοδότηση για να θυμάστε την περίοδο λειτουργίας από το cookie. Όταν κάνετε δοκιμές στο πρόγραμμα περιήγησης, δεν σκέφτεστε αυτήν τη διαδικασία.

Διαδικασία εξουσιοδότησης

Πρώτα απευθυνόμαστε στη διεύθυνση http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, σε απάντηση, ο διακομιστής μας στέλνει ένα cookie με την περίοδο λειτουργίας εξουσιοδότησης. Έτσι μοιάζει ένα αίτημα 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

Απάντηση:

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>

Για να εργαστείτε εκεί χρειάζεστε mansession_id="6f5de42c", δηλαδή το ίδιο το cookie εξουσιοδότησης.
Περιεχόμενο που πρέπει απλώς να ελέγξετε για την απάντηση "Ο έλεγχος ταυτότητας έγινε αποδεκτός" Στη συνέχεια, για όλες τις κλήσεις προς τον διακομιστή PBX, θα χρειαστεί να προσθέσουμε ένα cookie εξουσιοδότησης στο αίτημα.

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

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

Διαβάστε πώς μπορείτε να αποκτήσετε ένα cookie εξουσιοδότησης και να το χρησιμοποιήσετε σε άλλα αιτήματα εδώ:Zabbix - επέκταση των μακροοικονομικών ορίων»

Για να δημιουργήσω στοιχεία παρακολούθησης στο Zabbix, θα χρησιμοποιήσω την αυτόματη ανίχνευση.

Αυτόματος εντοπισμός

Για να εντοπίσετε αυτόματα εγγραφές και να παρακολουθήσετε καταστάσεις ομοτίμων, πρέπει να επικοινωνήσετε με την ακόλουθη διεύθυνση: https://ats:8089/mxml?action=SIPshowregistry ή https://ats:8089/mxml?action=SIPpeers

Σε απόκριση, το PBX μας επιστρέφει μια απάντηση 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>

Υπάρχουν πολλά σκουπίδια στην απόκριση, οπότε στην προεπεξεργασία τη φιλτράρουμε ανά πρότυπο XPath: //response/generic[@host]
Μετά αρχίζει η διασκέδαση. Για να εργαστείτε με τον εντοπισμό και να δημιουργήσετε δυναμικά στοιχεία, η απάντηση πρέπει να είναι σε μορφή JSON. Η XML δεν υποστηρίζεται για αυτόματο εντοπισμό.

Για να μετατρέψω XML σε JSON, έπρεπε να παίξω λίγο με την αυτόματη αντικατάσταση, για την οποία έφτιαξα ένα σενάριο σε JS

Πώς να συνδέσετε το Zabbix με το Asterisk out of the box

Ένα ενδιαφέρον σημείο: στην απόκριση ATS, όλες οι παράμετροι περιβάλλονται από μεμονωμένα εισαγωγικά και μετά την εφαρμογή του προτύπου //response/generic[@host] αντικαθίστανται από διπλές.

Για να δημιουργήσουμε στοιχεία, χρησιμοποιούμε μεταβλητές από την απόκριση XML (τώρα JSON)​.

Πώς να συνδέσετε το Zabbix με το Asterisk out of the box

Μητρώο SIP

Για εγγραφές γουλιά χρησιμοποιούμε τρεις μεταβλητές: όνομα χρήστη, οικοδεσπότης, λιμάνι. Χάρηκα με το όνομα του στοιχείου [προστασία μέσω email]: 5060, Δεν βρήκα περιπτώσεις όπου πρέπει να χρησιμοποιήσετε και τις πέντε μεταβλητές.

Το κύριο στοιχείο που λαμβάνει πληροφορίες για όλες τις εγγραφές, Asterisk - AMI SIPshowregistry. Μια φορά το λεπτό κάνει ένα αίτημα GET https://ats:8089/mxml?action=SIPshowregistry, μετά την οποία τα δεδομένα XML απόκρισης μεταβιβάζονται σε όλα τα εξαρτημένα στοιχεία για ανάλυση. Για κάθε εγγραφή δημιουργώ ένα στοιχείο που εξαρτάται από αυτό. Αυτό είναι βολικό επειδή λαμβάνουμε ενημερωμένες πληροφορίες σε ένα αίτημα και όχι για κάθε αίτημα ξεχωριστά. Αυτή η υλοποίηση έχει ένα σημαντικό μειονέκτημα - το φορτίο στον επεξεργαστή.

Κατά τη δοκιμή έως και 100 εξαρτημένων στοιχείων, δεν παρατήρησα το φορτίο, αλλά με 1700 στοιχεία, αυτό έδωσε ένα αξιοσημείωτο φορτίο 15 δευτερολέπτων στον επεξεργαστή. Λάβετε αυτό υπόψη εάν έχετε μεγάλο αριθμό εξαρτημένων στοιχείων.

Ως επιλογή για να «απλώσετε» το φορτίο ή να ορίσετε διαφορετικές συχνότητες μέτρησης για ένα στοιχείο, μπορείτε να μετακινήσετε τη λογική επεξεργασίας σε κάθε στοιχείο ξεχωριστά.

Δεν αποθηκεύω τις λαμβανόμενες πληροφορίες στο κύριο στοιχείο. Πρώτον, δεν βλέπω την ανάγκη για αυτό και δεύτερον, εάν η απόκριση είναι μεγαλύτερη από 64K, τότε το Zabbix το κόβει.

Εφόσον χρησιμοποιούμε μια πλήρη απόκριση XML για το εξαρτημένο στοιχείο, πρέπει να λάβουμε την τιμή αυτού του στοιχείου κατά την προεπεξεργασία. Διά μέσου XPath γίνεται έτσι:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ κατάσταση)
Για καταστάσεις εγγραφής, δεν χρησιμοποίησα καταστάσεις κειμένου, αλλά τις μετέτρεψα σε αριθμητική μορφή χρησιμοποιώντας JavaScript:

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

SIP Peers

Κατ' αναλογία με τις εγγραφές SIP, υπάρχει ένα κύριο στοιχείο του Asterisk - AMI SIPshowregistry, στο οποίο προστίθενται εξαρτημένα.

Αυτό δημιουργεί δύο εξαρτημένα στοιχεία:

  • Κατάσταση ομοτίμου σε μορφή κειμένου
  • Χρόνος απόκρισης συσκευής - εάν η κατάσταση είναι εντάξει, τότε γράφεται ο χρόνος απόκρισης της συσκευής, διαφορετικά "-1"

Η διαδρομή προς το ίδιο το στοιχείο είναι λίγο πιο απλή XPath:

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

Για το δεύτερο στοιχείο χρησιμοποίησα JavaScript για διαχωρισμό χρόνος απόκρισης από την κατάσταση ομοτίμου, αφού αποθηκεύονται μαζί:

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

Συμπέρασμα

Μια λύση εκτός συσκευασίας μπορεί να είναι πολύπλοκη και όχι αμέσως διαυγή. Αυξάνει την ευελιξία και τη φορητότητα μεταξύ διαφορετικών συστημάτων

Καλή και εύκολη ενσωμάτωση σε όλους! Πρότυπο και οδηγίες για τη ρύθμιση GitHub.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο