איך cloud-init רץ בעלייה הראשונה

‏cloud-init מחיל את ה-user-data בחמישה שלבי אתחול, ואת רובו רק פעם אחת לכל instance. עברו בין השלבים, ראו איפה כל מפתח של #cloud-config רץ, ומה רץ שוב אחרי reboot.

פורסם ב-13 באוקטובר 2026

קובץ #cloud-config נקרא כמו סקריפט מלמעלה למטה, אבל cloud-init לא מריץ אותו כך. המשתמשים והקבצים קיימים לפני שהחבילות מותקנות, runcmd רץ כמעט בסוף, ובעלייה הבאה כמעט שום דבר לא רץ בכלל.

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

נסו בעצמכם

אתחול
שלבי האתחול של cloud-init ערכים לדוגמה
  1. Detect ds-identify

    אין מודולים של user-data

  2. Local cloud-init-local.service

    אין מודולים של user-data

  3. Network cloud-init-network.service

    • bootcmd רץ bootcmd, בכל אתחול
    • write_files רץ write_files, פעם אחת לכל instance
    • users רץ users_groups, פעם אחת לכל instance
    • ssh_authorized_keys רץ ssh, פעם אחת לכל instance
  4. Config cloud-config.service

    • runcmd כותב את הסקריפט runcmd, פעם אחת לכל instance
  5. Final cloud-final.service

    • packages רץ package_update_upgrade_install, פעם אחת לכל instance
    • runcmd רץ scripts_user, פעם אחת לכל instance
    • final_message רץ final_message, בכל אתחול

עלייה ראשונה: ‏8 מתוך 8 מודולים רצים.

שלב אחר שלב

  1. בתחילת האתחול, ds-identify בודק על איזו פלטפורמה השרת רץ ומפעיל את cloud-init. בשלב Local (‏cloud-init-local.service) ‏cloud-init מוצא את מקור הנתונים המקומי, קורא את מזהה ה-instance ובעלייה ראשונה כותב את הגדרות הרשת לפני שהרשת עולה.

  2. כשהרשת עולה, שלב Network (‏cloud-init-network.service) מעבד את ה-user-data ומריץ את המודולים הראשונים: bootcmd, ‏write_files, ‏users ומפתחות ה-SSH. המשתמש שלכם והמפתח שלו קיימים מכאן והלאה.

  3. שלב Config (‏cloud-config.service) מריץ את מודולי ההגדרה. ‏runcmd הוא אחד מהם, אבל הוא רק כותב את הפקודות שלכם לסקריפט; שום דבר בו עוד לא רץ.

  4. שלב Final (‏cloud-final.service) רץ אחרון באתחול. הוא מתקין את packages, אחר כך scripts_user מריץ את סקריפט ה-runcmd, והודעת הסיום נכתבת ללוג. פקודה ב-runcmd יכולה להניח שהחבילות כבר מותקנות.

  5. ב-reboot מזהה ה-instance זהה לזה שבמטמון, ולכן זו לא עלייה ראשונה. מודולים שרצים פעם אחת לכל instance (משתמשים, קבצים, חבילות, runcmd) מדולגים; רק מודולים שרצים בכל אתחול, כמו bootcmd, רצים שוב. עריכת user-data בשרת שכבר רץ לא משנה דבר עד ש-instance חדש עולה או ש-cloud-init clean מאפס את המטמון.

ערכים לדוגמה המודולים המוצגים הם ברירות המחדל של cloud.cfg ב-Ubuntu; הפצות אחרות יכולות לסדר אותם אחרת.

מה התרשים מראה

התרשים הוא ציר זמן של חמשת שלבי האתחול, ‏Detect, ‏Local, ‏Network, ‏Config ו-Final, כל אחד עם יחידת ה-systemd שלו והמודולים שהוא מריץ עבור מפתחות ה-user-data: ‏bootcmd, ‏write_files, ‏users, ‏ssh_authorized_keys, ‏runcmd, ‏packages ו-final_message. השלב הנוכחי מודגש.

בקר אחד עובר בין העלייה הראשונה לעלייה מאוחרת יותר של אותו instance. בעלייה מאוחרת, כל מודול שרץ פעם אחת לכל instance מסומן "מדולג"; ‏bootcmd ו-final_message עדיין רצים.

נסו בכלי

פתחו את cloud-init Generator ל-Ubuntu 24.04

מה לא מכוסה כאן

בגרסאות ישנות של cloud-init היחידה של שלב Network נקראת cloud-init.service. ‏Boothooks, ‏vendor-data ו-part-handlers לא מוצגים, ו-manual_cache_clean משנה את האופן שבו עלייה ראשונה מזוהה.

מקורות

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

כל ההסברים