Zabbix - הרחבת גבולות המאקרו

כשעושים פתרון ללקוח, עלו 2 משימות שרציתי לפתור בצורה יפה ועם פונקציונליות רגילה של Zabbix.

1 משימה. מעקב אחר גרסת הקושחה הנוכחית בנתבים של Mikrotik.

המשימה נפתרת בקלות - על ידי הוספת סוכן לתבנית ה-HTTP. הסוכן מקבל את הגרסה העדכנית מאתר מיקרוטיק, והטריגר משווה את הגרסה הנוכחית לגרסה הנוכחית ומוציא התראה במקרה של אי התאמה.

כשיש לך 10 נתבים, אלגוריתם כזה לא קריטי, אבל מה לעשות עם 3000 נתבים? לשלוח 3000 בקשות לשרת? כמובן שתוכנית כזו תעבוד, אבל עצם הרעיון של 3000 בקשות לא התאים לי, רציתי למצוא פתרון אחר. בנוסף, עדיין היה חסרון באלגוריתם כזה: הצד השני יכול לספור מספר כזה של בקשות מ-IP אחד להתקפת DoS, הם יכולים פשוט לאסור זאת.

2 משימה. שימוש בהפעלת הרשאה בסוכני HTTP שונים.

כאשר סוכן צריך לקבל מידע מדפים "סגורים" באמצעות HTTP, יש צורך ב-cookie הרשאה. לשם כך, יש בדרך כלל טופס הרשאה סטנדרטי עם צמד "כניסה / סיסמה" והגדרת מזהה ההפעלה בקובץ ה-cookie.

אבל יש בעיה, אי אפשר לגשת לנתונים של פריט אחר מפריט אחד של סוכן HTTP כדי להחליף את הערך הזה ב-Header.

יש גם "סקריפט אינטרנט", יש לו מגבלה נוספת, הוא לא מאפשר לקבל תוכן לניתוח ולהמשך שמירה. אתה יכול רק לבדוק את נוכחותם של המשתנים הדרושים בדפים או להעביר משתנים שהתקבלו בעבר בין שלבי סקריפט אינטרנט.

לאחר שחשבתי מעט על המשימות הללו, החלטתי להשתמש בפקודות מאקרו הנראות בצורה מושלמת בכל חלק של מערכת הניטור: בתבניות, מארחים, טריגרים או פריטים. ואתה יכול לעדכן פקודות מאקרו דרך ממשק ה-API של האינטרנט.

ל-Zabix יש תיעוד API טוב ומפורט. עבור חילופי נתונים באמצעות API, נעשה שימוש בפורמט הנתונים Json. פרטים ניתן למצוא ב תיעוד רשמי.

רצף הפעולות להשגת הנתונים הדרושים לנו ורישומם במאקרו מוצג בתרשים שלהלן.

Zabbix - הרחבת גבולות המאקרו

שלב 1

הצעד הראשון יכול להיות מורכב מפעולה בודדת או מספר פעולות. כל ההיגיון העיקרי מונח בשלבים הראשונים, ו-3 השלבים האחרונים הם העיקריים.

בדוגמה שלי, הצעד הראשון היה לקבל עוגיות הרשאה ב-PBX עבור המשימה הראשונה. עבור המשימה השנייה, קיבלתי את המספר של הגרסה הנוכחית של הקושחה של Mikrotik.

כתובת האתר של גרסאות עדכניות של קושחת Mikrotik

הציוד של Mikrotik עצמו ניגש לכתובות אלה כאשר מתקבלת גרסת הקושחה הזמינה האחרונה.

הצעד הראשון הוא אינדיבידואלי לחלוטין לכל מקרה וההיגיון של עבודתו עשוי להיות שונה. הכל תלוי במשימה שלך.

כשאתה עובד עם סקריפטים באינטרנט, עקוב אחר שיטת התגובה שאתה צריך. כותרות תגובת HTTP או עצמי тело תגובה ללא כותרות?
אם יש צורך בקובצי Cookie של הרשאה, הגדר את שיטת התגובה כותרות כמו במקרה של כוכבית.

אם אתה צריך נתונים, כמו במקרה של תגובת שרת 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 מיישמת JSON-RPC גרסה 2.0;

  • שיטה - השיטה שנקראת;
  • params - פרמטרים המועברים בשיטה;
  • id הוא מזהה בקשה שרירותי;
  • auth - מפתח אימות משתמש; מכיוון שעדיין אין לנו אותו, בוא נגדיר אותו ל-null.

כדי לעבוד עם ה-API, יצרתי חשבון נפרד עם זכויות מוגבלות. ראשית, אינך צריך לתת גישה למקום שאינך צריך. ושנית, לפני גרסה 5.0, ניתן היה לקרוא את הסיסמה שהוגדרה דרך המאקרו. בהתאם, אם אתה משתמש בסיסמת המנהל של Zabbix, קל לגנוב את חשבון הניהול.

זה יהיה נכון במיוחד כאשר עובדים עם API דרך סקריפטים של צד שלישי ואחסון אישורים בצד.

מאז גרסה 5.0 ישנה אפשרות להסתיר את הסיסמה שנשמרה במאקרו.

Zabbix - הרחבת גבולות המאקרו

בעת יצירת חשבון נפרד לעדכון נתונים דרך ה-API, הקפידו לבדוק האם הנתונים הדרושים לכם זמינים דרך ממשק האינטרנט והאם ניתן לעדכן אותם. לא בדקתי, ואז במשך זמן רב לא הצלחתי להבין מדוע המאקרו שהייתי צריך לא נראה ב-API.

Zabbix - הרחבת גבולות המאקרו

לאחר שקיבלנו הרשאה ב-API, אנו ממשיכים לקבל רשימה של פקודות מאקרו.

שלב 3

ה-API לא מאפשר לך לעדכן מאקרו מארח לפי שם, תחילה עליך לקבל את מזהה המאקרו. יתרה מכך, כדי לקבל רשימה של פקודות מאקרו עבור מארח ספציפי, אתה צריך לדעת את המזהה של המארח הזה, וזו בקשה נוספת. השתמש במאקרו ברירת מחדל {מזהה מארח} בבקשה אסור. החלטתי לעקוף את ההגבלה כך:

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
}

משתנה {סיד} הושג בשלב השני ויהיה בשימוש מתמיד, שבו אתה צריך לעבוד עם ממשק ה-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

הוספת תגובה