אתם יכולים ליצור ולהריץ סקריפטים של כיבוי שמפעילים פקודות רגע לפני שמכונה וירטואלית (VM) נעצרת או מופעלת מחדש. האפשרות הזו שימושית אם אתם מסתמכים על סקריפטים אוטומטיים כדי להפעיל ולכבות מכונות, ומאפשרת למכונות זמן לנקות או לבצע משימות, כמו ייצוא יומנים או סנכרון עם מערכות אחרות.
סקריפטים של כיבוי שימושיים במיוחד למכונות וירטואליות בקבוצת מופעי מכונה מנוהלים עם מנגנון התאמה לעומס (autoscaler). אם המידרוג האוטומטי משבית מכונה וירטואלית בקבוצה, הסקריפט להשבתה פועל לפני שהמכונה הווירטואלית נעצרת, והסקריפט מבצע את הפעולות שהגדרתם. הסקריפט פועל במהלך תקופת הכיבוי המוגבלת לפני שהמכונה הווירטואלית נעצרת. לדוגמה, סקריפט הכיבוי יכול להעתיק נתונים מעובדים ל-Cloud Storage או לגבות יומנים.
סקריפטים להשבתה פועלים באופן דומה מאוד לסקריפטים לטעינה בזמן ההפעלה. רוב המידע במסמכי התיעוד של סקריפטים לטעינה בזמן ההפעלה רלוונטי גם לסקריפטים להשבתה.
במשימות של כיבוי והפעלה מחדש, המכונות הווירטואליות תמיד מריצות סקריפטים של כיבוי באופן הבא:
- במכונות וירטואליות של Linux, באמצעות המשתמש
root. - במכונות וירטואליות של Windows, באמצעות החשבון
System.
דרישות מוקדמות
כדי להריץ סקריפטים שמאוחסנים במטא-נתונים במכונה וירטואלית, צריך להתקין את סביבת האורח ולהפעיל אותה.
- סביבת האורח כוללת את סוכן האורח (לדוגמה, google-guest-agent ב-Linux) שקורא את תוכן הסקריפט או את כתובת ה-URL מהמטא-נתונים של המכונה ומתחיל את ההפעלה.
- כל האימג'ים הציבוריים של Compute Engine מגיעים עם סביבת אורח מותקנת מראש.
- אם אתם יוצרים קובץ אימג' בהתאמה אישית, אתם צריכים להתקין ידנית את סביבת האורח של Google כדי לוודא שהסקריפטים מהמטא-נתונים ותכונות אחרות של Google Cloud פועלים כמו שצריך.
לפני שמתחילים
- מידע על סקריפטים לטעינה בזמן ההפעלה
- להבין מהו שרת המטא-נתונים.
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא התהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Google Cloud . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים האלה:
צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:
המסוף
כשמשתמשים במסוף Google Cloud כדי לגשת לשירותים ולממשקי ה-API של Google Cloud , לא צריך להגדיר אימות.
gcloud
-
התקינו את ה-CLI של Google Cloud. אחר כך, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:
gcloud initאם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
- הגדרת אזור ותחום כברירת מחדל.
-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
אם אתם משתמשים במעטפת מקומית, צרו פרטי כניסה לאימות מקומי בחשבון המשתמש:
gcloud auth application-default login
אם אתם משתמשים ב-Cloud Shell, אתם לא צריכים לעשות את זה.
אם מוחזרת שגיאת אימות ואתם משתמשים בספק זהויות חיצוני (IdP), ודאו ש נכנסתם ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
Terraform
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של Terraform שבדף הזה, מתקינים ומפעילים את ה-CLI של gcloud, ואז מגדירים את Application Default Credentials באמצעות פרטי הכניסה של המשתמש.
למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.
REST
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.
התקינו את ה-CLI של Google Cloud.
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Google Cloud .
ההרשאות שנדרשות למשימה הזו
כדי לבצע את המשימה הזו נדרשות ההרשאות הבאות:
- כל ההרשאות שנדרשות כדי ליצור מכונה
-
compute.instances.setMetadataבמכונה
מפרטים
בקטעים הבאים מפורטים המאפיינים של סקריפטים להשבתה.
מגבלות
יש כמה מגבלות שצריך לשים לב אליהן כשמשתמשים בסקריפטים של כיבוי:
- סקריפטים להשבתה ב-Compute Engine מופעלים רק על בסיס המאמץ המרבי. במקרים נדירים, יכול להיות שסקריפט הכיבוי לא יסתיים ב-Compute Engine.
- ב-Windows, המדיניות הקבוצתית המקומית משמשת להפעלת הסקריפט לכיבוי.
- חבילת ההתקנה מגדירה את ההגדרה Local Group Policy
Computer Configuration/Windows Setting/Scripts (Startup/Shutdown)כדי להפעיל את הסקריפט כשהמערכת נכבית.
- חבילת ההתקנה מגדירה את ההגדרה Local Group Policy
הפעלת סקריפט כיבוי
סקריפטים של כיבוי מופעלים כשהמכונה מושבתת אחרי שמתרחש אחד מהאירועים הבאים:
אתם מבצעים את הפעולות הבאות:
עצירה או הפעלה מחדש של המכונה מתוך מערכת ההפעלה של האורח.
Compute Engine עוצר מכונה כחלק מפעולת עצירה או מחיקה מתוכנתת.
Compute Engine מפסיק מכונה וירטואלית במודל Spot או מכונה זמנית כחלק מתהליך ההפקעה.
סקריפט השבתה יכול להיות מכל סוג קובץ. אם במכונה יש סקריפט כיבוי, Compute Engine מבצע את הפעולות הבאות:
- העתקת הסקריפט לקובץ מקומי במכונה.
- מגדירה הרשאות בקובץ כדי להפוך את הסקריפט לניתן להפעלה.
- מריץ את הקובץ כשהמכונה מושבתת.
לדוגמה, אפשר לספק סקריפט Python במקום סקריפט Bash. חשוב לזכור ש-Compute Engine מריץ את הסקריפט מילה במילה, בלי קשר לסוג הסקריפט.
כדי להריץ סקריפט שהוא לא bash, צריך להוסיף שורת shebang בחלק העליון של הקובץ כדי שהמערכת תדע באיזה מפרש להשתמש. לדוגמה, בסקריפט Python אפשר להוסיף שורת shebang כמו:
#!/usr/bin/python
זמן הריצה של סקריפט הכיבוי
הסקריפטים להשבתה מתחילים לפעול כש-Compute Engine מגדיר את מצב המכונה ל-STOPPING. הסקריפטים צריכים להסתיים לפני שהמכונה נעצרת לגמרי, כלומר כשהמצב שלה משתנה ל-TERMINATED. משך הזמן שלוקח למכונה להגיע למצב TERMINATED משתנה בהתאם לסוג המכונה.
אם הסקריפטים פועלים יותר זמן מהזמן שלוקח למכונה להפסיק, Compute Engine מפסיק את הסקריפטים באופן כפוי, מה שעלול להוביל לאובדן נתונים או למשימות שלא הושלמו. כדי למנוע את זה, עוצרים את המכונה מתוך מערכת ההפעלה של האורח.
בגישה הזו, מצב המכונה נשאר STOPPING עד שסקריפטי ההשבתה מסיימים לפעול.
שימוש בסקריפט מקומי לכיבוי
סקריפט כיבוי מקומי הוא סקריפט שקיים במחשב המקומי. מעבירים סקריפט מקומי להשבתה כקובץ או על ידי העברת התוכן ישירות ל-Compute Engine.
סקריפטים של כיבוי יכולים לבצע כמה פעולות שצריך, אבל אם מעבירים את הקובץ באופן מקומי, הסקריפט לא יכול לחרוג ממגבלת האורך של ערך המטא-נתונים, שהיא 256KB. כדי להשתמש בסקריפט שחורג ממגבלת האורך, צריך לאחסן את הקובץ ב-Cloud Storage. מידע נוסף זמין במאמר שימוש בסקריפט כיבוי מ-Cloud Storage.
הוספת קובץ סקריפט לכיבוי
אפשר להעביר קובץ סקריפט מקומי להשבתה רק באמצעות הכלי gcloud בשורת הפקודה.
gcloud
כדי להעביר קובץ מקומי של סקריפט השבתה, צריך לספק את הדגל --metadata-from-file ואחריו זוג מפתחות של מטא-נתונים, shutdown-script=PATH/TO/FILE, כאשר PATH/TO/FILE הוא נתיב יחסי לסקריפט ההשבתה. לדוגמה:
gcloud compute instances create example-instance \
--metadata-from-file shutdown-script=examples/scripts/install.sh
Terraform
כדי לציין סקריפט כיבוי באופן ישיר, משתמשים במשאב google_compute_instance עם הנתיב לסקריפט הכיבוי במטא-נתונים.
כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.
הזנת התוכן של סקריפט הכיבוי ישירות
אפשר גם להעביר ישירות את התוכן של סקריפט הכיבוי.
המסוף
במסוף Google Cloud , מציינים סקריפט כיבוי ישירות באמצעות מפתח המטא-נתונים shutdown-script:
נכנסים לדף Create an instance.
מציינים את פרטי המכונה הווירטואלית.
מרחיבים את הקטע אפשרויות מתקדמות.
מרחיבים את האפשרות Management ומבצעים את הפעולות הבאות:
- בקטע Metadata, לוחצים על Add item.
- בשדה Key, מזינים
shutdown-scriptלמפתח המטא-נתונים. - בשדה Value, מוסיפים את התוכן של סקריפט הכיבוי.
ממשיכים בתהליך היצירה של המכונה הווירטואלית.
gcloud
ב-Google Cloud CLI, משתמשים בדגל --metadata כדי לספק את התוכן של סקריפט ההשבתה, ואחריו את זוג המפתחות shutdown-script=CONTENTS, כאשר CONTENTS הוא התוכן של סקריפט ההשבתה.
gcloud compute instances create example-instance --metadata shutdown-script="#! /bin/bash
> # Shuts down Apache server
> /etc/init.d/apache2 stop"
Terraform
כדי לציין סקריפט כיבוי באופן ישיר, משתמשים במשאב google_compute_instance עם סקריפט הכיבוי במטא-נתונים.
כדי ללמוד איך להחיל הגדרות ב-Terraform או להסיר אותן, ראו פקודות בסיסיות ב-Terraform.
REST
ב-API, מספקים סקריפט השבתה כחלק מהמאפיין metadata בבקשה כשיוצרים מכונה. שימוש ב-shutdown-script כמפתח המטא-נתונים:
POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instances
{...
"metadata": {
"items": [
{
"key": "shutdown-script",
"value": "#! /bin/bash\n\n# Shuts down Apache server\n/etc/init.d/apache2 stop"
}
]
}...
}
הוספת סקריפט כיבוי במכונות של Windows
כדי להריץ סקריפטים של כיבוי במכונות של Windows, משתמשים במפתחות המטא-נתונים הבאים שספציפיים ל-Windows. בוחרים באחד מהמקשים המיוחדים שמופיעים ברשימה הבאה. כל מפתח צריך להתאים לסוג הסקריפט שרוצים להריץ.
אפשר לציין כמה סקריפטים להשבתה על ידי העברת מפתחות שונים למכונה, אבל אפשר לציין כל מפתח רק פעם אחת לכל מכונה וירטואלית.
אפשר להשתמש במפתחות הבאים עם סקריפט השבתה מקומי, באמצעות אותן הוראות שמופיעות למעלה במסמך הזה.
cmd סקריפטים של כיבוי |
bat סקריפטים של כיבוי |
ps1 סקריפטים של כיבוי |
|---|---|---|
windows-shutdown-script-cmd |
windows-shutdown-script-bat |
windows-shutdown-script-ps1 |
שימוש בסקריפט כיבוי מ-Cloud Storage
אתם יכולים לאחסן סקריפט כיבוי ב-Cloud Storage ולהשתמש בו. פועלים לפי ההוראות במאמר סקריפטים לטעינה בזמן ההפעלה, אבל מחליפים את startup-script-url ב-shutdown-script-url.
במכונות של Windows, מחליפים את windows-startup-script-url ב-windows-shutdown-script-url.
החלת סקריפט כיבוי על מכונות פועלות
כדי להוסיף סקריפט כיבוי למכונה פועלת, פועלים לפי ההוראות במאמרי עזרה החלת סקריפט לטעינה בזמן ההפעלה על מכונות פועלות, אבל מחליפים את מפתחות המטא-נתונים באחד מהמפתחות הבאים:
-
shutdown-script: מספקים את תוכן הסקריפט להשבתה ישירות באמצעות המפתח הזה. באמצעות Google Cloud CLI, אתם יכולים לספק את הנתיב לקובץ של סקריפט הכיבוי באמצעות הדגל--metadata-from-fileומפתח המטא-נתוניםshutdown-script. -
shutdown-script-url: מספקים כתובת URL של Cloud Storage לקובץ של סקריפט הכיבוי באמצעות המפתח הזה.
הרצת סקריפט כיבוי במהלך כיבוי מבוקר
כברירת מחדל, אם במכונה מופעל כיבוי מבוקר, כל הסקריפטים להשבתה שהגדרתם במפתחות המטא-נתונים יפעלו אחרי שהכיבוי המבוקר יסתיים.
כדי להריץ פקודות במהלך כיבוי מבוקר, צריך להשתמש בסקריפט מותאם אישית של צופה שדוגם באופן רציף את שרת המטא-נתונים ברקע, כמו שמוצג בקטע הזה. כדי לתת לסקריפטים מספיק זמן להשלים את הפעולה ולמנוע אובדן נתונים או משימות שלא הושלמו, מומלץ לשנות את סקריפטים של הכיבוי על ידי העברת הלוגיקה לסקריפט הצופה הזה.
כדי להריץ סקריפט כיבוי במהלך כיבוי מבוקר, בוחרים אחת מהאפשרויות הבאות בהתאם למערכת ההפעלה של המכונה:
Linux
אם עדיין לא עשיתם זאת, מתחברים למכונה.
מריצים סקריפט של צופה או מגדירים אותו כך שירוץ בזמן האתחול, כמו בדוגמה הבאה. מוסיפים את לוגיקת הכיבוי הספציפית במקום שצוין:
#!/bin/bash # -------------------------------------------------------- # Script for graceful shutdown based on the metadata value # -------------------------------------------------------- # # This script monitors the metadata key `shutdown-status` and # waits for its value to change to `PENDING_STOP`. After the script # runs a series of user-defined commands, it runs `sudo shutdown -h now` # to signal to Compute Engine that the shutdown process is # complete. # # To run this script, you must have passwordless sudo privileges. METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance/attributes/shutdown-status" LAST_ETAG="0" echo "Starting shutdown status watcher" while true; do # Wait for the metadata value to change. # The metadata server blocks the request until a change occurs or a timeout is reached. RESPONSE=$(curl -H "Metadata-Flavor: Google" -s -i "${METADATA_URL}?wait_for_change=true&last_etag=${LAST_ETAG}") CURL_EXIT_STATUS=$? if [[ ${CURL_EXIT_STATUS} -ne 0 ]]; then echo "Error: curl command failed with exit status ${CURL_EXIT_STATUS}. Retrying in 5 seconds..." sleep 5 continue fi # Strip carriage returns (\r) immediately to prevent CRLF line endings from corrupting string comparisons RESPONSE=$(echo "$RESPONSE" | tr -d '\r') # Extract the HTTP status code from the first line of the response HTTP_STATUS=$(echo "$RESPONSE" | head -n 1 | awk '{print $2}') if [[ "${HTTP_STATUS}" -eq 200 ]]; then # Read the new etag value to re-subscribe on the next poll. NEW_ETAG=$(echo "$RESPONSE" | grep -i "^ETag:" | awk '{print $2}') if [[ -n "${NEW_ETAG}" ]]; then LAST_ETAG="${NEW_ETAG}" fi # Extract the value of the shutdown status from the last line of the response body. SHUTDOWN_STATUS=$(echo "$RESPONSE" | tail -n 1) echo "Metadata changed. New ETag: ${LAST_ETAG}, shutdown-status: '${SHUTDOWN_STATUS}'" if [[ "${SHUTDOWN_STATUS}" == "PENDING_STOP" ]]; then echo "Shutdown signal 'PENDING_STOP' received. Exiting watcher loop." break fi elif [[ "${HTTP_STATUS}" -eq 503 ]]; then # 503 Service Unavailable: wait_for_change timed out with no change. Sleep and loop again. echo "Service temporarily unavailable or request timed out. Retrying in 2 seconds..." sleep 2 continue else # Unexpected HTTP status echo "Warning: Unexpected HTTP status ${HTTP_STATUS}. Retrying in 5 seconds..." sleep 5 fi done # -------------------------------------------------------- # Graceful shutdown commands section # -------------------------------------------------------- echo "Watcher loop exited. Starting graceful shutdown procedures..." # --- ADD YOUR GRACEFUL SHUTDOWN COMMANDS HERE --- echo "Graceful shutdown commands executed." # -------------------------------------------------------- # Signal OS to stop # -------------------------------------------------------- echo "Shutting down the guest OS to turn off the compute instance..." sudo shutdown -h now
Windows
אם עדיין לא עשיתם זאת, התחברו למכונה באמצעות אחת מהשיטות הבאות:
מריצים סקריפט של צופה או מגדירים אותו כך שירוץ בזמן האתחול, כמו בדוגמה הבאה. מוסיפים את לוגיקת הכיבוי הספציפית במקום שצוין:
<# .SYNOPSIS pre-shutdown-script.ps1 #> # -------------------------------------------------------- # Script for graceful shutdown based on the metadata value # -------------------------------------------------------- # # This script monitors the metadata key `shutdown-status` and # waits for its value to change to `PENDING_STOP`. After the script # runs a series of user-defined commands, it runs `Stop-Computer -Force` # to signal to Compute Engine that the shutdown process is # complete. $METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/instance/attributes/shutdown-status" $LAST_ETAG = "0" Write-Host "Starting shutdown status watcher" while ($true) { $Response = $null $HTTP_STATUS = 0 # Wait for the metadata value to change. # The metadata server blocks the request until a change occurs or a timeout is reached. try { $Response = Invoke-WebRequest ` -Headers @{"Metadata-Flavor" = "Google"} ` -Uri "${METADATA_URL}?wait_for_change=true&last_etag=${LAST_ETAG}" ` -TimeoutSec 320 ` -ErrorAction Stop if ($null -ne $Response) { $HTTP_STATUS = [int]$Response.StatusCode } } catch { # Invoke-WebRequest throws an error for non-2xx status codes or connection failures. $Exception = $_.Exception if ($null -ne $Exception -and $null -ne $Exception.Response) { $HTTP_STATUS = [int]$Exception.Response.StatusCode } else { $HTTP_STATUS = 0 } } if ($HTTP_STATUS -eq 0) { Write-Host "Error: Request failed. Retrying in 5 seconds..." Start-Sleep -Seconds 5 continue } if ($HTTP_STATUS -eq 200) { # Read the new etag value to re-subscribe on the next poll. $NEW_ETAG = $Response.Headers["ETag"] if ($null -ne $NEW_ETAG) { $LAST_ETAG = $NEW_ETAG } # Extract the value of the shutdown status from the response body. $SHUTDOWN_STATUS = $Response.Content.Trim() Write-Host "Metadata changed. New ETag: ${LAST_ETAG}, shutdown-status: '${SHUTDOWN_STATUS}'" if ($SHUTDOWN_STATUS -eq "PENDING_STOP") { Write-Host "Shutdown signal 'PENDING_STOP' received. Exiting watcher loop." break } } elseif ($HTTP_STATUS -eq 503) { # 503 Service Unavailable: wait_for_change timed out with no change. Sleep and loop again. Write-Host "Service temporarily unavailable or request timed out. Retrying in 2 seconds..." Start-Sleep -Seconds 2 continue } else { # Unexpected HTTP status Write-Host "Warning: Unexpected HTTP status ${HTTP_STATUS}. Retrying in 5 seconds..." Start-Sleep -Seconds 5 } } # -------------------------------------------------------- # Graceful shutdown commands section # -------------------------------------------------------- Write-Host "Watcher loop exited. Starting graceful shutdown procedures..." # --- ADD YOUR GRACEFUL SHUTDOWN COMMANDS HERE --- Write-Host "Graceful shutdown commands executed." # -------------------------------------------------------- # Signal OS to Halt # -------------------------------------------------------- Write-Host "Shutting down the guest OS to turn off the compute instance..." Stop-Computer -Force
הצגת הפלט של סקריפט השבתה
Linux
כדי לראות את הפלט של סקריפט השבתה של Linux:
מתחברים למכונה ומריצים את הפקודה הבאה:
sudo journalctl -u google-shutdown-scripts.serviceצפייה בפלט דרך יציאה טורית 1 במסוף Google Cloud ובדיקת אירועי
google_metadata_script_runner.IAP Desktop מתחנת עבודה של Windows. מידע נוסף זמין במאגר GoogleCloudPlatform/iap-desktop ב-GitHub.
Windows
כדי לראות את הפלט של סקריפט כיבוי של Windows Server, אפשר להשתמש בכל אחת מהאפשרויות הבאות ולבדוק אם יש אירועים של GCEMetadataScripts:
יציאה טורית 1 במסוף Google Cloud . למידע נוסף, ראו הצגת הפלט של היציאה הטורית.
יומן האפליקציות של Windows Event Viewer.
IAP Desktop מתחנת עבודה של Windows. מידע נוסף זמין במאגר GoogleCloudPlatform/iap-desktop ב-GitHub.