Zabbix - επέκταση των μακροοικονομικών ορίων

Όταν έφτιαξα μια λύση για έναν πελάτη, προέκυψαν 2 εργασίες που ήθελα να λύσω όμορφα και με κανονική λειτουργικότητα Zabbix.

Εργασία 1. Παρακολούθηση της τρέχουσας έκδοσης υλικολογισμικού στους δρομολογητές Mikrotik.

Η εργασία επιλύεται εύκολα - προσθέτοντας έναν πράκτορα στο πρότυπο HTTP. Ο πράκτορας λαμβάνει την τρέχουσα έκδοση από τον ιστότοπο της Mikrotik και η σκανδάλη συγκρίνει την τρέχουσα έκδοση με την τρέχουσα και εκδίδει μια ειδοποίηση σε περίπτωση ασυμφωνίας.

Όταν έχετε 10 δρομολογητές, ένας τέτοιος αλγόριθμος δεν είναι κρίσιμος, αλλά τι να κάνετε με 3000 δρομολογητές; Αποστολή 3000 αιτημάτων στον διακομιστή; Φυσικά, ένα τέτοιο σχέδιο θα λειτουργήσει, αλλά η ίδια η ιδέα των 3000 αιτημάτων δεν με ταίριαζε, ήθελα να βρω άλλη λύση. Επιπλέον, υπήρχε ακόμα ένα μειονέκτημα σε έναν τέτοιο αλγόριθμο: η άλλη πλευρά μπορεί να μετρήσει έναν τέτοιο αριθμό αιτημάτων από μια IP για μια επίθεση DoS, μπορεί απλά να την απαγορεύσει.

Εργασία 2. Χρήση μιας περιόδου λειτουργίας εξουσιοδότησης σε διαφορετικούς πράκτορες HTTP.

Όταν ένας πράκτορας χρειάζεται να λάβει πληροφορίες από "κλειστές" σελίδες μέσω HTTP, απαιτείται ένα cookie εξουσιοδότησης. Για να γίνει αυτό, υπάρχει συνήθως μια τυπική φόρμα εξουσιοδότησης με ένα ζεύγος "σύνδεση / κωδικό πρόσβασης" και ορίζοντας το αναγνωριστικό περιόδου λειτουργίας στο cookie.

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

Υπάρχει επίσης ένα "Web script", έχει έναν άλλο περιορισμό, δεν σας επιτρέπει να λάβετε περιεχόμενο για ανάλυση και περαιτέρω αποθήκευση. Μπορείτε να ελέγξετε μόνο για την παρουσία των απαραίτητων μεταβλητών στις σελίδες ή να περάσετε μεταβλητές που έχετε αποκτήσει προηγουμένως μεταξύ των βημάτων σεναρίου ιστού.

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

Το Zabbix διαθέτει καλή και λεπτομερή τεκμηρίωση API. Για ανταλλαγή δεδομένων μέσω api, χρησιμοποιείται η μορφή δεδομένων Json. Λεπτομέρειες μπορείτε να βρείτε στο επίσημη τεκμηρίωση.

Η σειρά των ενεργειών για τη λήψη των δεδομένων που χρειαζόμαστε και την καταγραφή τους σε μια μακροεντολή φαίνεται στο παρακάτω διάγραμμα.

Zabbix - επέκταση των μακροοικονομικών ορίων

Βήμα 1

Το πρώτο βήμα μπορεί να αποτελείται από μία ενέργεια ή πολλαπλές ενέργειες. Όλη η βασική λογική βρίσκεται στα πρώτα βήματα και τα 3 τελευταία βήματα είναι τα κύρια.

Στο παράδειγμά μου, το πρώτο βήμα ήταν η λήψη cookie εξουσιοδότησης στο PBX για την πρώτη εργασία. Για τη δεύτερη εργασία, πήρα τον αριθμό της τρέχουσας έκδοσης του υλικολογισμικού Mikrotik.

URL των τρεχουσών εκδόσεων του υλικολογισμικού Mikrotik

Αυτές οι διευθύνσεις είναι προσβάσιμες από τον ίδιο τον εξοπλισμό της Mikrotik όταν λαμβάνεται η πιο πρόσφατη διαθέσιμη έκδοση υλικολογισμικού.

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

Όταν εργάζεστε με δέσμες ενεργειών Ιστού, παρακολουθείτε ποια μέθοδο απόκρισης χρειάζεστε. Επικεφαλίδες Απόκριση HTTP ή εαυτός тело απάντηση χωρίς κεφαλίδες;
Εάν χρειάζονται cookie εξουσιοδότησης, ορίστε τη μέθοδο απόκρισης Επικεφαλίδες όπως στην περίπτωση του Asterisk.

Εάν χρειάζεστε δεδομένα, όπως στην περίπτωση της απόκρισης διακομιστή mikrotik, βάλτε Σώμα απάντηση χωρίς κεφαλίδες.

Βήμα 2

Ας προχωρήσουμε στο δεύτερο βήμα. Λήψη συνεδρίας εξουσιοδότησης:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
        "user": "Admin"
        "password": "zabbix"
    },
    "id": 1,
    "auth": null
}

Το jsonrpc είναι η έκδοση του πρωτοκόλλου JSON-RPC που χρησιμοποιείται.
Το Zabbix υλοποιεί την έκδοση 2.0 του JSON-RPC.

  • μέθοδος - η μέθοδος που ονομάζεται?
  • παράμετροι - παράμετροι που περνούν από τη μέθοδο.
  • Το id είναι ένα αυθαίρετο αναγνωριστικό αιτήματος.
  • auth - κλειδί ελέγχου ταυτότητας χρήστη. αφού δεν το έχουμε ακόμα, ας το βάλουμε σε null.

Για να εργαστώ με το API, δημιούργησα έναν ξεχωριστό λογαριασμό με περιορισμένα δικαιώματα. Πρώτον, δεν χρειάζεται να δώσετε πρόσβαση σε εκεί που δεν χρειάζεται. Και δεύτερον, πριν από την έκδοση 5.0, ο κωδικός πρόσβασης που ορίστηκε μέσω της μακροεντολής μπορούσε να διαβαστεί. Αντίστοιχα, εάν χρησιμοποιείτε τον κωδικό πρόσβασης διαχειριστή Zabbix, ο λογαριασμός διαχειριστή είναι εύκολο να κλαπεί.

Αυτό ισχύει ιδιαίτερα όταν εργάζεστε με API μέσω σεναρίων τρίτων και αποθήκευσης διαπιστευτηρίων στο πλάι.

Από την έκδοση 5.0 υπάρχει μια επιλογή απόκρυψης του κωδικού πρόσβασης που είναι αποθηκευμένος στη μακροεντολή.

Zabbix - επέκταση των μακροοικονομικών ορίων

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

Zabbix - επέκταση των μακροοικονομικών ορίων

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

Βήμα 3

Το API δεν σας επιτρέπει να ενημερώσετε μια μακροεντολή κεντρικού υπολογιστή με όνομα, πρέπει πρώτα να λάβετε το αναγνωριστικό μακροεντολής. Επιπλέον, για να λάβετε μια λίστα με μακροεντολές για έναν συγκεκριμένο κεντρικό υπολογιστή, πρέπει να γνωρίζετε το αναγνωριστικό αυτού του κεντρικού υπολογιστή και αυτό είναι ένα επιπλέον αίτημα. Χρησιμοποιήστε προεπιλεγμένη μακροεντολή {HOST ID} στο αίτημα δεν επιτρέπεται. Αποφάσισα να παρακάμψω τον περιορισμό ως εξής:

Zabbix - επέκταση των μακροοικονομικών ορίων

Δημιούργησα μια τοπική μακροεντολή με το αναγνωριστικό αυτού του κεντρικού υπολογιστή. Η εύρεση του αναγνωριστικού κεντρικού υπολογιστή είναι πολύ εύκολη από τη διεπαφή ιστού.

Μια απάντηση με μια λίστα με όλες τις μακροεντολές σε έναν δεδομένο κεντρικό υπολογιστή μπορεί να φιλτραριστεί από ένα μοτίβο:

regex:{"hostmacroid":"([0-9]+)"[A-z0-9,":]+"{$MIKROTIK_VERSION}"

Zabbix - επέκταση των μακροοικονομικών ορίων

Έτσι, παίρνουμε το αναγνωριστικό της μακροεντολής που χρειαζόμαστε, όπου MIKROTIK_VERSION είναι το όνομα της μακροεντολής που αναζητούμε. Στην περίπτωσή μου, η μακροεντολή αναζητείται MIKROTIK_VERSIONΑυτό που ανατέθηκε στον οικοδεσπότη.

Το ίδιο το αίτημα μοιάζει με αυτό:

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.get",
    "params":{
        "output":"extend",
        "hostids":"{$HOST_ID}"
    },
    "auth":"{sid}",
    "id":1
}

Μεταβλητή {sid} λαμβάνεται στο δεύτερο βήμα και θα χρησιμοποιείται συνεχώς, όπου πρέπει να εργαστείτε με τη διεπαφή API.

Τελικό 4 ΒΗΜΑ - ενημέρωση της μακροεντολής

Τώρα γνωρίζουμε το αναγνωριστικό μακροεντολής που πρέπει να ενημερωθεί, το cookie εξουσιοδότησης ή την έκδοση υλικολογισμικού του δρομολογητή. Μπορείτε να ενημερώσετε την ίδια τη μακροεντολή.

POST http://company.com/zabbix/api_jsonrpc.php HTTP/1.1
Content-Type: application/json-rpc

{
    "jsonrpc":"2.0",
    "method":"usermacro.update",
    "params":{
        "hostmacroid":"{hostmacroid}",
        "value":"{mikrotik_version}"
    },
    "auth":"{sid}",
    "id":1
}

{mikrotik_version} είναι η τιμή που προκύπτει στο πρώτο βήμα. Στο παράδειγμά μου, η έκδοση του τρέχοντος υλικολογισμικού mikrotik
{hostmacroid} - η τιμή λήφθηκε στο τρίτο βήμα - το αναγνωριστικό της μακροεντολής που ενημερώνουμε.

Ευρήματα

Η προσέγγιση για την επίλυση του προβλήματος με τυπική λειτουργικότητα είναι πολύ πιο περίπλοκη και μεγαλύτερη. Ειδικά αν γνωρίζετε προγραμματισμό και μπορείτε να προσθέσετε γρήγορα την απαραίτητη λογική στο σενάριο.

Το προφανές πλεονέκτημα αυτής της προσέγγισης είναι η «φορητότητα» της λύσης μεταξύ διαφορετικών διακομιστών.

Για μένα προσωπικά, είναι περίεργο ότι ο πράκτορας HTTP δεν μπορεί να έχει πρόσβαση στα δεδομένα ενός άλλου στοιχείου και να τα αντικαταστήσει στο σώμα ή τις κεφαλίδες αιτήματος [ ZBXNEXT-5993].

Το έτοιμο πρότυπο μπορεί λήψη στο GitHub.

Πηγή: www.habr.com

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