יחידה 9 / 11

יצירת סקריפט ואוטומציה: Bash, Python ו-PowerShell

רווחים:

  • יכולת להבין את החוזקות של Bash, Python ו-PowerShell ובינה מלאכותית לייצר טיוטות סקריפט בטוחות ומוגנות
  • יכולת להוסיף מעקות בטיחות לסקריפטים כגון set -euo pipefail, בדיקת משתנים ריקים, מצב ריצה יבשה ורישום
  • יכולת לקרוא פקודות הרסניות ולנסות אותן בסביבה מבודדת ובהתחלה יבשה, וליישם את המשמעת של אי הטמעת הסוד בתסריט.

הרוח של DevOps מתמצתת במשפט אחד: "הפוך את העבודה שאתה עושה פעמיים לאוטומטי." כל משימה שחוזרת על עצמה הנעשית באופן ידני - ניקוי יומן, גיבוי, בדיקת תקינות השרת, עיבוד קבצי אצווה - לוקחת זמן ובסופו של דבר פגומה על ידי טעות אנוש. סקריפטים משתלטים על העבודות הללו: תוכנות קטנות שמבצעות סדרה של פקודות באופן רציף, אמין וניתן לחזור עליהן. איש המקצוע של DevOps משתמש לעתים קרובות בשלוש שפות: Bash (עבור סקריפטים של מעטפת Linux/Unix), Python (עבור לוגיקה מורכבת, קריאת API, מניפולציה של נתונים) ו-PowerShell (עבור Windows וניהול ענן).

בינה מלאכותית היא אולי המקום שבו היא מציעה את הערך המעשי ביותר ביצירת תסריט: הפקת טיוטה עובדת מתיאור של משפט אחד, פתרון באג מסתורי, תרגום תסריט לשפה אחרת. אבל סקריפט מסוכן כשהוא מופעל בצורה עיוורת - RM שגוי, Remove-Item -Recurse ימחק קבצים באופן בלתי הפיך. זו הסיבה שהמוטו של היחידה הזו הוא: תן ל-AI לכתוב את הסקריפט, אתה קורא אותו, נסה אותו קודם במצב בטוח ואז הרץ אותו.

באיזו שפה לבחור ומתי? כלל אצבע גס: אם העבודה מורכבת מהפעלת מספר פקודות מערכת ברצף (העתקת קובץ, שירות הפעלה מחדש, אחזור ארכיון) Bash היא הבחירה הטבעית ביותר מכיוון שלינוקס נמצאת בכל מקום בשרתים. אם העבודה כוללת לוגיקה של החלטות, לולאה, טרנספורמציה של נתונים, בקשה ל-API או עיבוד JSON - כלומר, לוגיקה העולה על 20 שורות - Python בולטת בקריאה ובספריות העשירות שלה; תסריט של Bash מורכב במהירות הופך לבלתי מובן, בעוד ש-Python נשאר קל לתחזוקה. אם העבודה כוללת ניהול שרתי Windows, Active Directory או Azure, PowerShell היא הסביבה הטבעית מכיוון שהטבע מונחה האובייקטים שלה משתלב בצורה עמוקה עם הפלטפורמות הללו. ציון איזו שפה בחרת ומדוע בעת בקשת סקריפט ל-AI מבטיח שהפלט מתאים ואידיומטי לסביבה שלך.

צעד אחר צעד: יצירת סקריפט מאובטח

  1. תאר את המשימה והסביבה. מה זה יעשה, איזו מערכת הפעלה/מעטפת, אילו אילוצים?
  2. בקשו מעקות בטיחות. ב-bash, הגדר -euo pipefail (עצור על שגיאה, עצור על משתנה לא מוגדר), הנחיית אישור לפעולות מסוכנות, העבר תחילה במקום מחיקה.
  3. בקש מצב ריצה יבשה. תן לתסריט לכתוב מה לעשות עם --dry-run, אבל אל תעשה את זה.
  4. לקרוא ולהבין. ודא מה עושה כל שורה, במיוחד פעולות מחיקה/הזזה/רשת.
  5. נסה זאת בסביבה מבודדת. בתיקיית הבדיקה, הפעל אותה עם נתונים לדוגמה.
  6. הוסף לרישום. תן לתסריט לתעד את מה שהוא עושה כדי שניתן יהיה לצפות בו מאוחר יותר.

יסודות של סקריפטים בטוחים

תסריט הפקה צריך לכלול את מעקות הבטיחות הבאים:

  • עצירה במקרה של טעות. Bash: set -euo pipefail. PowerShell: $ErrorActionPreference = 'עצור'. אם שלב אחד נכשל, הצעד הבא לא אמור לעבוד.
  • אימפוטנציה (חזרה). אם הסקריפט פועל פעמיים, הוא לא אמור לגרום נזק כפול; היגיון "אם כבר יש לך את זה, דלג על זה".
  • אישור והפעלה יבשה. לפעולות הרסניות "אתה בטוח?" או דגל ה--dry-run.
  • אימות קלט. האם הפרמטרים כצפוי? משתנה ריק יכול להפוך את rm -rf "$DIR"/ ל-rm -rf / disaster.
  • רישום. תיעוד של מה נעשה ומתי.
טיפ: הטעות המסוכנת ביותר ב-Bash היא מחיקה עם משתנה ריק. rm -rf "$DIR" מנסה למחוק את ספריית השורש אם $DIR ריק. set -u (עצור על משתנה לא מוגדר) וסימון [ -n "$DIR" ] לפני המחיקה הוא מציל חיים. בקש מפורשות הגנות אלה בעת בקשת סקריפטים מה-AI.

אבטחה: פקודות סודיות והרסניות

שתי סכנות גדולות:

  1. הטמעת הסוד בתסריט. אסור שהסיסמה תהיה טקסט רגיל בתוך סקריפט האסימון; יש לקרוא ממשתנה סביבה או כספת. סקריפטים נכנסים ל-Git; הסוד הקבור הוא דליפה קבועה.
  2. פקודות הרסניות. rm -rf, Remove-Item -Recurse -Force, DROP TABLE, terraform destroy - כשאתה רואה אותם בסקריפט, עצור וחשוב פעמיים. לעולם אל תנסה קודם כל את הפקודה ההרסנית שנוצרת על ידי ה-AI בפרוד.
זהירות: כאשר אתה אומר ל-AI "לכתוב סקריפט שמנקה את הקבצים האלה", קרא בעיון את היקף הפקודת find ... -delete או rm שהיא מייצרת. תו כללי (*) או נתיב שגוי ימחק יותר ממה שאתה רוצה למחוק. הפעל תמיד תחילה את הסקריפט עם מצב "רשימה למחיקה" במקום מחיקה.

השוואה בין שלוש שפות

קריטריון

bash

פייתון

PowerShell

איפה הכי טוב

מעטפת לינוקס, שרשרת פקודות

לוגיקה מורכבת, API, נתונים

ניהול ענן של Windows

עקומת למידה

בינוני (כלוא)

קל

בינוני

טיפול בשגיאות

set -euo pipefail

לנסות/למעט

try/catch, -ErrorAction

ניידות

יוניקס/לינוקס/מק

בכל מקום

חוצה פלטפורמות (PS 7+)

מתי

בקיצור, המערכת עובדת

היגיון ארוך מ-20 שורות

Windows/AD/Azure

שלושה מיני תיקים

מקרה 1 - שעתיים של יצירה בתוך 5 דקות. מהנדס השקיע שעתיים באיסוף וארכיון יומנים מ-40 שרתים מדי שבוע. הוא נתן ל-AI לתאר את המשימה ולהגדיר -euo pipefail + הגנות של ריצה יבשה וליצור סקריפט Bash. תחילה אימת את הסקריפט ב-dry-run, ואז קישר אותו למשימה המתוזמנת (cron). העבודה השבועית מצטמצמת ל-5 דקות וטעויות אנוש מבוטלות.

מקרה 2 - נמנע אסון משתנה אפס. היה rm -rf "$TARGET"/* בסקריפט הניקוי שהופק על ידי ה-AI, אבל אם TARGET לא הוקצה איפשהו, הוא נשאר ריק. הוא הבין זאת תוך כדי לימודיו כמהנדס; set -u ו- [ -n "$TARGET" ] || נוסף פקד יציאה 1. במהלך הבדיקה המשתנה נשאר ריק והתסריט נעצר בבטחה ולא בצורה קטסטרופלית.

מקרה 3 - אסימון מוטבע נתפס. מטעמי נוחות, AI הוסיפה שורת TOKEN = "ghp_realtoken" לסקריפט של Python המבקש API (כדוגמה). המהנדס הסיר את זה ושינה אותו לקריאה ממשתנה הסביבה עם os.environ["TOKEN"] וביטל וחידש את האסימון. אם התסריט יעבור ל-Git, האסימון יהיה ציבורי.

ארבע תבניות הניתנות להעתקה

1) סקריפט Bash מאובטח:

כתוב תסריט Bash: [משימה]. חוקים חובה:- `הגדר -euo pipefail` בהתחלה.- בדקו שהמשתנה לא ריק בכל מקום בו מוחק/מזיז.- `--dry-run` דגל: כתוב מה לעשות במצב זה אך אל תעשה זאת.- אל תטמיע את הסוד; קרא מתוך משתנה סביבה. - הדפס יומן אינפורמטיבי בכל שלב. הגיבו לתסריט וסמנו את השורה המסוכנת ביותר.

2) תיאור/בקרת סקריפט:

תאר את הסקריפט הבא שורה אחר שורה ובדוק את האבטחה: סוד מוטבע, פקודה הרסנית (rm/Remove-Item/DROP), קלט לא מאומת, חוסר טיפול בשגיאות? כתבו כל סיכון לפי סדר החשיבות והתיקון. תסריט: [קוד]

3) תרגום שפה:

תרגם את הסקריפט [SOURCE LANGUAGE] ל-[TARGET LANGUAGE]. שמור את ההתנהגות מילולית, השתמש בטיפול בשגיאות אידיומטיות בשפת היעד, העבר כל סודות מוטבעים למשתנה סביבה. שימו לב לנקודות שעלולות להתנהג אחרת. סקריפט: [CODE]

4) משימה מתוכננת (קרון/משימה מתוזמנת):

השתמש בסקריפט זה [תדירות: למשל. כתוב הגדרת לוח זמנים ([cron / systemd timer / Windows Task Scheduler]) שתפעל [בשעה 02:00 בכל לילה]. הוסף כיצד להזהיר אותי על כשל (יומן/קוד יציאה/הודעה) וכיצד למנוע חפיפה.

הנחיה חלשה / הנחיה חזקה

חלש: "כתוב סקריפט שמוחק קבצים ישנים."

תוצאה: סקריפט rm חסר היקף, לא מוגן, ללא ריצה יבש; אם הוא פועל בתיקייה הלא נכונה, הוא יימחק באופן בלתי הפיך.

Strong: "כתוב סקריפט bash למחיקת קבצי .log מעל 30 יום תחת /var/log/app. השתמש ב-set -euo pipefail, עצור אם ספריית היעד ריקה, רשום מה למחוק עם --dry-run תחילה, רישום כל עסקה, אל תטמיע את הסוד. סמן את השורה המסוכנת ביותר."

הבדל: התביעה השנייה נותנת את מלוא ההיקף, מעקות בטיחות וציפיות לריצה יבשה; ניתן להפעיל את הפלט בבטחה.

טעויות נפוצות

  • הפעלת התסריט מבלי לקרוא אותו. מחיקת/הזזת שורות במיוחד מובילה לאסון.
  • לא בודק משתנים ריקים. אסון קלאסי של מחיקת ספריית השורש עם rm -rf "$X"/.
  • דלג על `set -euo pipefail` / `-ErrorAction Stop`. צעד יורה, התסריט ממשיך בעיוורון.
  • הטמעת הסוד בתסריט. דליפה מתמשכת ל-Git.
  • תהליך הרסני ללא ריצה יבשה. קודם "תראה לי מה לעשות", ואז תעשה את זה.
  • עושה את הניסיון הראשון בפרוד. פועל ללא סביבת בדיקה מבודדת.

לסיכום

DevOps היא אומנות האוטומציה; עבודה חוזרת מואצלת לסקריפטים של Bash, Python ו-PowerShell. בינה מלאכותית שימושית מאוד בניסוח סקריפטים, ניפוי באגים ותרגום שפות - אבל סקריפט מאובטח צריך לכלול שומרי שגיאה כמו set -euo pipefail, בדיקת משתני Null, מצב הפעלה יבשה, חוסר סודות מוטבע ורישום. באחריותך לקרוא ולבדוק כל סקריפט, במיוחד אלה המכילים פקודות הרסניות, בסביבה מבודדת ובהתחלה יבשה.

משימת יישום

בחר משימה חוזרת (אחסון יומנים בארכיון, גיבוי, ניקוי). (1) בקש מה-AI ליצור סקריפט מוגן עם התבנית "Secure Bash script". (2) בדוק לאבטחה את אותו סקריפט כמו תבנית "תיאור/ביקורת סקריפט" ומצא את השורה המסוכנת ביותר שה-AI סימן. (3) אמת את התנהגותו על ידי הפעלת הסקריפט עם קבצי דוגמה בתיקיית בדיקה, תחילה עם --dry-run.

רשימת בדיקה

  • [ ] כתבתי את המשימה שאני לא רוצה, מערכת ההפעלה/מעטפת ומעקות הבטיחות.
  • [ ] לסקריפט יש שגיאה בעצירה כמו set -euo pipefail / -ErrorAction Stop.
  • [ ] הוספתי משתנה ריק ובדיקת קלט לפני המחיקה/העברה.
  • [ ] יש --- יבשה-הפעלה/מנגנון אישור לפעולות הרסניות.
  • [ ] אין סוד מוטבע בתסריט; הערכים מגיעים ממשתנה הסביבה/מקרה.
  • [ ] עשיתי את הבדיקה הראשונה בסביבת בדיקה מבודדת עם ריצה יבשה.