CLI ל-DevOps ב-Go ו-Python: פיתוח כלי אוטומציה

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

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

מדוע כלי CLI של DevOps נשברים עם צמיחת הצוות

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

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

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

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

בהמשך נפרט כיצד סוגרים זאת — ממיפוי סקריפטי האוטומציה ועד כלי CLI של DevOps ב-Go או Python עם בדיקות, בקרת גישה וחזרה לאחור צפויה.

מה נותנת אוטומציה של פעולות שגרה: השפעה במספרים

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

זמן הפעולה האופיינית

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

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

שיעור ההרצות הכושלות

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

זמן הכנסת מהנדס חדש

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

יכולת השחזור של התוצאה

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

פורמטים של פתרון: השוואה בין חמש גישות לפיתוח

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

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

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

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

שלבי פיתוח כלי CLI: מניתוח המשימות ועד המסירה

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

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

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

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

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

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

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

מה נשאר לצוות לאחר הטמעת האוטומציה

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

כלי ב-Go סוגר קריאות מערכת ועבודה עם קבצים, Python — את עטיפת ה-API והדוחות; שניהם נבנים מהמקור בפקודה אחת, התלויות מקובעות, ולכן כל מהנדס מרים את הסביבה בכמה דקות.

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

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

מקרה בוחן: כיצד צמצמנו פעולות ידניות ומספר הכשלים

מה היה

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

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

מה עשינו

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

מדד לפני אחרי
הכנת סביבה 3 שעות ידנית 12 דקות בפקודה אחת
שיעור ההשקות שהוחזרו לאחור ~17% 3%
זמן עד להשקה עצמאית ראשונה 3 שבועות 5 ימים
שלבים ידניים במחזור שחרור 20+ 4 ניתנים לבדיקה

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

ספקות טכניים לפני תחילת העבודה

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

אילו גישות אתם מבקשים?

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

מה יקרה בהפסקה באמצע הפעולה?

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

אפשר לבדוק תחילה על עותק של הסביבה?

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

כיצד נפתרות שאלות של תלויות וסביבה?

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

האם נוכל לתמוך בכלי בכוחות עצמנו?

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

נדון במשימה ונחזור עם הערכה ותוכנית

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

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

השלב הראשון בדרך כלל מתגבש כך:

  • מיפוי השגרה ומדידה כמה זמן היא גובה מהצוות
  • בחירת שפה למשימה: Go — כשנדרש קובץ בינארי אחד בלי תלויות, Python — כשיש הרבה עבודה עם מערכות חיצוניות
  • חוזה הכלי: סט תת-פקודות, דגלים, קודי החזרה, פלט קריא למכונה
  • קונפיגורציה דרך משתני סביבה וקבצים, סודות — מחוץ למאגר
  • הרצת פיילוט על סביבה אחת והשוואה להרצה ידנית לפי זמן ומספר שגיאות
  • בדיקות על ניתוח התשובות של המערכות ועל קודים שגויים
  • מסירה: מאגר, תיעוד, דוגמאות קריאה ומעבר עם הצוות שלכם

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

במה נבדל כלי מוכן מסט סקריפטים?

סקריפט פותר את המשימה היום — כלי מחזיק אותה שנים. ההבדל מתגלה לא בהרצה הראשונה, אלא במאה: סקריפט דורש שהמחבר שלו יהיה рядом, ואילו כלי — רק פרמטרים מתוארים וקוד החזרה מובן.