באיזו שפה הייתם כותבים את זה?

xcalibur

New member
באיזו שפה הייתם כותבים את זה?

לא ממזמן סיימתי לכתוב פרוייקט קטן ב-POWERSHELL וכעת התבקשתי להעביר אותו ללינוקס.

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

חשבתי להתחיל לכתוב את זה באחת משתיים: PERL או BASH.
באחת אני חלש ואילו את השניה אני כלל לא מכיר אך יודעי דבר אמרו לי שזו ה-שפה לכתוב כמעט כל דבר.

מיותר לציין שאין בעיה לשבת עם ספר וללמוד מ-0.

מה דעתכם?
X
 

hetzbh

New member
זה יותר פשוט ממה שאתה חושב

בשביל להתתחבר מלינוקס ל-MS SQL אתה צריך ספריות/אפליקציה שנקראת FreeTDS ולהגדיר שם את החיבור ל-MS SQL.
אתה לא ציינת איזו הפצת לינוקס אתה עובד אבל אם זה אובונטו לדוגמא, אז אתה יכול להשתמש בקישור הבא כדי לעשות לעצמך את החיים קלים:

http://www.billyshaw.com/2012/09/28/query-mssql-from-bash/

עכשיו, מבחינת שפות...

תראה, היתרון הענק של BASH שזו שפה מאוד קלה ללימוד ואתה יכול להשתמש בה תחת כל לינוקס ויוניקס (וגם עם cygwin ועוד כמה סביבות ב-Windows), אבל כשמשווים בין BASH ל-PERL, אז PERL בועט ב-BASH בכל צורה וכיוון אפשריים: ל-PERL יש ספריות לכל דבר שתנסה לחשוב עליו. רוצה להתחבר עם PERL ל-MSSQL? כנס ללינק פה: http://www.billyshaw.com/2012/09/28/query-mssql-from-bash/

רוצה להתחבר עם ה-PERL ל-NAGIOS ולקבל עדכונים ולהוסיף דברים? גם לזה יש לך ספריות מוכנות, כך שטכנית אתה יכול לכתוב סקריפט חכם שמצד אחד מתחבר ל-MS SQL, לבצע שאילתות ובאותו סקריפט כבר לעדכן דינמית את ה-NAGIOS וכל זה בעזרת מספר ספריות.

החסרון של PERL הוא שהוא אינו קל ללימוד. הוא מצריך השקעה בלימוד ולמען האמת ביותר ויותר חברות יורדים מ-PERL לכיוון שפות אחרות, בין אם זה Python (חיבור ל-MS SQL עם פייתון - https://code.google.com/p/pymssql/wiki/PymssqlExamples ) או Ruby.

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


בהצלחה
 

xcalibur

New member
הכל קל כשיש לך שמץ של מושג מה אתה עושה :)

לא אכחיש שלא ירקתי דם על הפרוייקט הזה...
אבל זה בעיקר כי היה חסר לי ידע.

אני לא מפחד לחזור על זה שוב.

במקום עבודה הראשון שלי היה מתכנת אחד שהיה נחשב לסוג של עילוי. בחבר'ה קראו לו PERLNINIO. כל המתכנתים השתמשו ב-C# ורק הוא היה עמוק בתוך ה-PERL. מה שהכי הדהים אותי זה שבזמן שכולם היו רודפים אחרי הזנב של עצמם עם פתירת בעיות שונות, הוא היה שולף איזו ספריה מאיפשהו והכל היה עובד כמו שעון :)
 

hetzbh

New member
ל-PERL יש את CPAN

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

Testosterone

New member
Keep it simple

באופן כללי הייתי ממליץ לך ללמוד Python. שפה מדהימה.
Perl היא האולר השוויצרי של עולם התכנות. אפשר לעשות איתה כמעט הכל. אבל היא ערכאית ויש עדיפות ברורה היום לPython.

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

אחרי הכל, אתה רוצה לבנות Nagios Plugin לא מסובך.
חפש ב Nagios Exchange פלאגינים שמריצים MSSQL Queries, ושלב אותם בתוך הסקריפט שתכתוב.

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

xcalibur

New member
אני רוצה לנצל את ההזדמנות ללמוד משהו חדש

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

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

קח שאילתא כלשהי ב-SQL.
השאילתא הזו מחזירה מס' דינאמי של שורות שמשתנה אחת לפרק זמן מסוים.
כל שורה שמוחזרת מחזיקה מידע כולל SEVERITY.

יש צורך לנטר כל שורה ושורה בנפרד. כלומר SERVICECHECK פר-שורה.
אם מס' השורות גדל או פחת יש צורך לעדכן את הנגיוס בהתאם ולהוסיפן/להסירן.
 

Testosterone

New member
תן לי דוגמה לפלט של כזו שאילתה

דוגמה אמיתית מהשטח.

בנוסף, יש איזה Sting בשאילתה שמהווה אינדיקציה לWarning/Critical/OK State?

מה התנאים שעומדים לפנינו בלקבוע איזה סטטוס הבדיקה תחזיר?
 

Testosterone

New member
ביקשתי שתציין מה החוקיות,

והתעלמת מזה לחלוטין.

האם אנו נעבוד בעיקר עם עמודה מס' 3, שמיצגת Severity?
 

xcalibur

New member
חלילה התעלמתי

הבאתי לך כאן את כל מה שרלוונטי.
השילוב של MONITOR_NAME ו-OBJ_NAME הוא אינדבידואלי עבור כל שורה ושורה. כך למשל במה שבניתי ב-PS, אני מייצא את כל התוצאות מכל השאילתות החוצה, וכשנגיוס פונה לשרת הוא מחפש את אותו שילוב. אם ה-SEVERITY השתנה, הוא כמובן שולח התרעה בצירוף כל שאר השדות של השורה.
 

xcalibur

New member
אשתדל לפרט כמה שניתן

נגיוס או OPSVIEW במקרה הזה פונה באמצעות NRPE לשרת מיקרוסופטי ומריץ עליו סקריפטים שונים.

סקריפט ראשון (מורץ ידנית לפי הצורך):

מוסיף את תוצאותן של שאילתות חדשות ומעלה אותן באמצעות ה-REST API של OPSVIEW.
הוא מריץ את השאילתות, שומר אותן כקבצים בפורמט CSV ואז מעלה אותן ל-OPSVIEW כאשר כל SERVICECHECK מורכב משם הקובץ, MONITOR_NAME ו-obj_name שהזכרתי מקודם.

סקריפט שני:

דוגם את שרת ה-MSSQL כל מס' דקות ושומר בצד את התוצאות מהשאילתות בפורמט CSV פר שאילתא. כמו כן, הסקריפט משווה בכל דגימה את התוצאות העכשיויות עם אלו ששמר קודם לכן, מזהה את השורות שהתווספו ו/או הוסרו ושומר אותן בצד בהתאמה.


סקריפט שני:

לוקח את מה שנשמר בתור "להסרה", מתחבר ל-REST API ומסיר אותן.


סקריפט שלישי:

לוקח את מה שנשמר בתור "להוספה", מתחבר ל-REST API ומוסיף.


סקריפט רביעי:

בודק האם נוספו או הוסרו שורות חדשות ומבצע RELOAD לקונפיגורציות באמצעות ה-REST API.

סקריפט חמישי:

מקבל פניות מהנגיוס עם שם קובץ, MONITOR_NAME ו-OBJ_NAME ומחזיר את הערך שבעמודת SEVERITY ואת כל המידע הקיים בשורה.



המממ...
עכשיו כשאני מסתכל על זה, עושה רושם שיהיה הרבה יותר קל לכתוב הכל ב- BASH...
 
BASH עם cat לשני הכיוונים לייצור conf דינאמי

|הקוד|
#!/bin/bash

cd /usr/local/nagios/etc/objects/services/
NEWSERVICE=$(ls *.conf | sort -h | tail -n 1 | cut -f1 -d".")

while read MONITOR OBJ SEVERITY
do
(( NEWSERVICE++ ))

cat <<EOF> ${NEWSERVICE}.conf
define service{
host_name mysql
service description ${NEWSERVICE}
check_command check_dummy!${SEVERITY}!"$MONITOR $OBJ"
active_checks_enabled 0
passive_checks_enabled 1

check_freshness 1
freshness_threshold 4000
}
EOF
done

systemctl reload nagios
|סקוד|

ומריצים

|הקוד|

./new-nagios-script < $(mssql-query-script)
|סקוד|
 
התחרבש לגמרי

http://pastebin.com/GtdAAxMe

אם אין צורך לשמור services, אפשר לאתחל את newservice ל 0, לשמור מונה בלולאה ולמחוק בסוף את הקבצים שנוצרו. בפעם הבאה שתריץ ה reload של נגיוס כבר יעיף את הישנים וייטען את החדשים.

גם הקריאה לסקריפט התחרבשה, אבל אני מקווה שזה טריוויאלי.
 

BravoMan

Active member
בנוסף לכל מה שנאמר פה, ברצוני לציין:

שיש הבדל בין BASH לשפות אחרות שהוזכרו כאן.
BASH היא למעשה יותר שפת אוטומציה של פעולות מאשר שפת תכנות מלאה.

יש דברים שחסרים בה (אם כי ניתנים להשלמה ע"י הפעלה של כלים שונים).

אני לא ממש מכיר את PowerShell, אבל למיטב ידיעתי היא אמורה להיות המקבילה של Bash עבור Windows שנועדה לחסות על המסוף המסורס הרגיל של המערכת הזו.

השפות האחרות שהוזכרו כגון Perl ו-Python הן שפות תכנות מלאות.

סתם בתור דוגמה להבדל, אם תרצה לחבר 2 מספרים "אמתיים" למשל 2.5 + 3.7 ל-BASH אין אפשרות מובנית לעשות זאת, אך ניתן להפעיל דרכה בקלות מחשבון שורה פקודה כמו bc (בהנחה שהוא מורכב במערכת).

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

אז, כשאני בוחר באיזו שפה להשתמש לכלי, אני בודק קודם כל כמה מהפתרון יגיעה מכלים חיצוניים מוכנים.
BASH מצוינת בתור "דבק" לכלים קיימים, אבל לפיתוחים משמעותיים עדיף שפה מלאה יותר.
 

hetzbh

New member
אההמ אההמ... !

המממ...

|הקוד|
[hetz@localhost ~]$ num=5
[hetz@localhost ~]$ x=6
[hetz@localhost ~]$ (( num += x ))
[hetz@localhost ~]$ echo $num
11
|סקוד|
 

BravoMan

Active member
כן, תפוז אuהבים לשבור את האתר שלהם.

תגית הקוד יהיה זכרה ברוך.

אם תשים לב, דיברתי על חישוב מספרים עם נקודה עשרונית.

פעולת החישוב של bash מאוד חביבה ושימושית אבל היא עובדת רק על שלמים.
http://pastebin.com/5v6Rgzx2
 
למעלה