הקצאת שרתים אוטומטית: cloud-init ו-user-data

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

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

שאלות נפוצות

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

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

פרוביז'נינג ידני של שרתים במקום cloud-init: מה נשבר

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

cloud-init מסיר את הפער הזה — הצומת בעת האתחול הראשון מיישם בעצמו חבילות, משתמשים, מפתחות וחלוקת דיסקים מתוך user-data.

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

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

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

מה נותן פרוביז'נינג אוטומטי בעת אתחול השרת

פרוביז'נינג בעת אתחול הצומת מסיר שלבים ידניים בין יצירת המכונה למוכנותה לקבל עומס. ההוראות מוגדרות מראש, ו-cloud-init מיישם אותן בעת האתחול הראשון — בלי התחברות ב-SSH ותיקונים «במקום». זמן הכנסת השרת לעבודה יורד מעשרות דקות ליחידות ומפסיק להיות תלוי במי שתורן.

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

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

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

דרכי אוטומציה: cloud-init, תמונות, קונפיגורציה

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

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

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

סדר היישום: מביקורת ועד מסירת נהלים

המעבר מהקצאת מכונות ידנית לפרוביז'נינג הצהרתי הוא ארגון מחדש של התהליך, ולא התקנה של cloud-init. להלן — הרצף שבו אנו מובילים את העבודה: כל שלב נותן תוצאה ניתנת לבדיקה, ואת העבודה אפשר לעצור בלי לאבד את מה שכבר נעשה.

  1. ביקורת ההקצאה הנוכחית של שרתים. אוספים מלאי: מאין מגיעות התמונות, אילו פרמטרים מוגדרים ידנית, היכן הקונפיגורציות נפרדות בין הסביבות. התוצאה — מפת הבדלים ורשימת פעולות שאנו מסירים.
  2. תרשים פרוביז'נינג. מחלקים אחריות: מה נאפה לתוך התמונה, מה עובר ל-user-data, מה מוגדר מאוחר יותר. מקבעים את פורמט התבניות, מקורות הסודות וסדר היישום.
  3. תבניות ומודולים. כותבים בלוקים לשימוש חוזר — רשת, חשבונות, עגינת דיסקים, סוכני ניטור. תפקיד צומת אחד — תבנית אחת, בלי הסתעפויות לפי שם מארח.
  4. בדיקה בסטנד. מריצים את התבניות בקונטור מבודד: יוצרים ויוצרים מחדש צמתים, בודקים הרצה חוזרת, התנהגות כשמקור הסודות אינו זמין וכשהקונפיגורציה הוחלה חלקית.
  5. קבוצת צמתים נסיונית. מוציאים מקטע אחד של הסביבה לסכימה החדשה ומשווים לתבנית לפי הרכב חבילות, שירותים ופורטים פתוחים. שגיאות מתקנים בתבנית, ולא במכונה.
  6. מסירה לתפעול. מוסרים נהלים, תרשים פרוביז'נינג וסדר שינוי תבניות: ניהול גרסאות, בדיקה לפני פריסה, חזרה לרוויזיה הקודמת.

מה נשאר לצוות: תבניות, תרשימים, נהלים

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

  • ערכת תבניות ופרופילים להקצאה — תמונות בסיס, פרופילים לפי תפקידים (צומת ווב, בסיס נתונים, ברוקר) ומשתני סביבה: מכונה חדשה עולה מפרופיל מוכן, ולא נבנית ידנית.
  • תרשים זרימת הפרוביז'נינג — המסלול מבקשה ועד צומת מוכן: היכן מוזרקים user-data ומטא-נתונים, ובאיזה רגע הצומת נכנס לאיזון העומסים ולניטור.
  • מדיניות גישה ותפקידים — הרשאות מינימליות: מי עורך תבניות, מי רק מריץ, מי קורא יומנים; סודות אינם נשמרים בטקסט גלוי ב-user-data.
  • תיעוד תפעול — נקודות כניסה וכשלים טיפוסיים עם סדר פעולות: האתחול לא עבר, הצומת לא נרשם, הקונפיגורציה נפרדה מהתבנית.
  • נוהל שינוי תבניות — עריכה דרך ענף ובדיקה בסטנד בדיקות, ניהול גרסאות לפרופילים, חלון חזרה לרוויזיה הקודמת.
  • מערכת בדיקות לפני פריסה — אידמפוטנטיות של הרצה חוזרת, נכונות הגדרות רשת, כניסת הצומת לניטור ולמלאי.

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

מקרה בוחן: הקצאת שרתים הואצה פי כמה

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

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

מה שינו

אספנו ספרייה של תבניות הצהרתיות לתפקידים טיפוסיים — צומת ווב, צומת אפליקציות, בסיס נתונים, מאזן עומסים. cloud-init בעת ההרצה הראשונה מחלק בעצמו דיסקים, מתקין חבילות, מגדיר משתמשים ומפתחות גישה, מעלה סוכן ניטור; הבדלים בין סביבות מתוארים במשתנים ב-user-data, ולא בהוראה למהנדס.

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

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

במה הגדרה ראשונית של צומת שונה מניהול קונפיגורציה?

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

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

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

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

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

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

שאלות טכניות נפוצות בנושא אוטומציה של הקצאת שרתים

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

האם הקצאה תעבוד בקונטור סגור בלי רשת חיצונית?

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

האם אפשר להעביר שרתים שכבר עובדים?

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

מי אחראי לתבניות לאחר המסירה?

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

כיצד נבדקת התאמת הצומת לתבנית?

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

מה כלול במסירת הליווי?

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

נדון במשימת האוטומציה שלכם לפרוביז'נינג

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

בהתחלה מספיק:

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

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

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