כתיבת סקריפטים של פקודות ב-CLI של gcloud

את הפקודות של Google Cloud CLI שמריצים משורת הפקודה אפשר להריץ גם מסקריפטים או מפעולות אוטומטיות אחרות, למשל כאשר משתמשים ב-Jenkins כדי להפעיל פעולות אוטומטיות של משימות של Google Cloud .

ב-Google Cloud SDK כבר כלולים מגוון כלים שמאפשרים לטפל ביעילות בפלט ולהפוך משימות לאוטומטיות כמו סינון, עיצוב והדגל --quiet.

העקרונות הבסיסיים של כתיבת סקריפט עם Google Cloud SDK

כדי לבנות סקריפטים בסיסיים ב-CLI של gcloud אפשר להיעזר במדריך המפורט שנמצא בבלוג שלנו בפוסט שכותרתו Scripting with gcloud: a beginner’s guide to automating Google Cloud tasks.

הרשאה

לצורך כתיבת סקריפטים ב-Google Cloud SDK צריך לבחור שיטת הרשאה. ‫Google Cloud SDK מספק שתי אפשרויות:

  • הרשאה באמצעות חשבון משתמש
  • הרשאה באמצעות חשבון שירות

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

כדי לאשר גישה ולבצע פעולות הגדרה נפוצות נוספות ב-SDK של Google Cloud:

gcloud init

בהרשאה באמצעות חשבון שירות מומלץ להשתמש כאשר פורסים סקריפט או פעולות אוטומטיות אחרות בכמה מכונות בסביבת ייצור. זוהי גם שיטת ההרשאה המומלצת כאשר מריצים פקודות של ה-CLI של gcloud במכונה וירטואלית של Compute Engine שבה לכל המשתמשים יש גישה ל-root.

להרשאה באמצעות חשבון שירות משתמשים בחשבון שירות קיים או יוצרים חשבון חדש בדף 'חשבונות שירות':

מעבר לדף 'חשבונות שירות'

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

כדי להפעיל את ההרשאה, מריצים את gcloud auth activate-service-account:

gcloud auth activate-service-account --key-file [KEY_FILE]

אפשר להיכנס עם SSH למכונה הווירטואלית באמצעות הקוד gcloud compute ssh, שמטפל באימות. קובצי תצורה מסוג SSH ניתן להגדיר בעזרת gcloud compute config-ssh.

במאמר אימות ל-CLI של gcloud אפשר למצוא הוראות מפורטות בנוגע לשימוש בכלי ההרשאות של Google Cloud SDK.

השבתת ההנחיות

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

ברוב המקרים, ההנחיות הן לא דבר רצוי כאשר מריצים פקודות בסקריפט או בפעולות אוטומטיות אחרות. אפשר להשבית את ההנחיות מהפקודות ב-CLI של gcloud על ידי הגדרת הנכס disable_prompts בהגדרות האישיות ל-True או באמצעות הדגל הכללי --quiet או -q. למרבית הפקודות האינטראקטיביות יש ערכי ברירת מחדל למקרים שבהם יש צורך באישור או בקלט נוספים. ערכי ברירת המחדל האלו משמשים במקרים שבהם ההנחיות מושבתות.

לדוגמה:

gcloud debug targets list --quiet

סינון ועיצוב הפלט

לצורך כתיבת סקריפטים ב-CLI של gcloud חשוב שהפלט יהיה צפוי מראש, והדגלים --filter ו---format יכולים לעזור בכך. באמצעותם אפשר להבטיח שכאשר מריצים פקודה ב-CLI של gcloud, הפלט שלה יתאים להגדרות הפורמט (כמו json‏, yaml‏, csv ו-text) והמסנן (למשל קידומת test בשם המכונה הווירטואלית או שנת יצירה לאחר 2015 וכדומה).

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

Cloud Shell-פתיחה ב

בדוגמאות הבאות אפשר לראות שימושים נפוצים של עיצוב בעזרת פקודות ב-CLI של gcloud:

הצגת רשימת מכונות שנוצרו בתחום (Zone) ‏us-central1-a‏:

gcloud compute instances list --filter="zone:us-central1-a"

הצגת רשימה בפורמט JSON של פרויקטים שבהם התווית תואמת לערך ספציפי (למשל label.env היא 'test' ו- label.version היא alpha):

gcloud projects list --format="json" \
  --filter="labels.env=test AND labels.version=alpha"

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

gcloud projects list \
  --format="table(name, project_id, createTime.date(tz=LOCAL))"

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

gcloud projects list \
  --format="table(projectNumber,projectId,createTime)" \
  --filter="createTime.date('%Y-%m-%d', Z)='2016-05-11'"

שימו לב שבדוגמה האחרונה השתמשנו בפורמט זהה לזה של המפתח. המסנן פועל על המפתח createTime לאחר הגדרת הפורמט של התאריך.

הצגת רשימת מכסות של אזור בצורת טבלה היררכית:

gcloud compute regions describe us-central1 \
  --format="table(quotas:format='table(metric,limit,usage)')"

הצגת רשימה לא היררכית של מכסות כלליות בפורמט CSV:

gcloud compute project-info describe --flatten='quotas[]' \
  --format='csv(quotas.metric,quotas.limit,quotas.usage)'

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

gcloud compute instances list \
  --format='table[box,title=Instances](name:sort=1,zone:label=zone,status)'

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

gcloud info --format='value(config.account)'

דוגמאות רלוונטיות נוספות של אפשרויות הגדרת הפלט שמובנות בדגלים filters, formats ו- projections של CLI של gcloud אפשר לראות בבלוג שלנו בפוסט filtering and formatting.

שיטות מומלצות

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

  • הסתמכו על סטטוס הסיום של הפקודה.

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

  • אל תסתמכו על ההודעות שמוצגות בשגיאה סטנדרטית.

    המלל שמופיע בהודעות האלו עשוי להשתנות בגרסאות הבאות של ה-CLI של gcloud ולעצור את הפעולה האוטומטית.

  • אל תסתמכו על הפלט הגנרי של הודעות שמופיע בפלט הסטנדרטי.

    פלט ברירת המחדל של פקודות עשוי להשתנות בגרסאות הבאות. אפשר לצמצם למינימום את ההשפעה של השינויים האלה על ידי שימוש בדגל --format לעיצוב הפלט באמצעות אחת מהאפשרויות הבאות: --format=json|yaml|csv|text|list ולציין את הערכים שיוחזרו. הריצו את gcloud topic formats להצגת אפשרויות נוספות.

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

    בסעיף הבא יש דוגמאות לעיצוב וסינון הפלט.

סקריפטים לדוגמה

הפונקציות של עיצוב וסינון מאפשרות לשלב פקודות ה-CLI של gcloud ליצירת סקריפט כדי לחלץ בקלות מידע מוטמע.

הצגת רשימה של מפתחות לכל חשבונות השירות של הפרויקט

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

  • הצגת כל הפרויקטים
  • הצגת חשבונות השירות המשוייכים לכל פרויקט
  • הצגת המפתחות המשוייכים לכל חשבון שירות

Bash

#!/bin/bash
for project in  $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId:  $project"
  for robot in $(gcloud iam service-accounts list --project $project --format="value(email)")
   do
     echo "    -> Robot $robot"
     for key in $(gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
        do
          echo "        $key"
     done
   done
done

Windows PowerShell

או כ-Windows PowerShell:

foreach ($project in gcloud projects list --format="value(projectId)")
{
  Write-Host "ProjectId: $project"
  foreach ($robot in  gcloud iam service-accounts list --project $project --format="value(email)")
  {
      Write-Host "    -> Robot $robot"
      foreach ($key in gcloud iam service-accounts keys list --iam-account $robot --project $project --format="value(name.basename())")
      {
        Write-Host "        $key"
      }
  }
}

ניתוח הפלט לצורך עיבוד

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

#!/bin/bash
for scopesInfo in $(
    gcloud compute instances list --filter=name:instance-1 \
        --format="csv[no-heading](name,id,serviceAccounts[].email.list(),
                      serviceAccounts[].scopes[].map().list(separator=;))")
do
      IFS=',' read -r -a scopesInfoArray<<< "$scopesInfo"
      NAME="${scopesInfoArray[0]}"
      ID="${scopesInfoArray[1]}"
      EMAIL="${scopesInfoArray[2]}"
      SCOPES_LIST="${scopesInfoArray[3]}"

      echo "NAME: $NAME, ID: $ID, EMAIL: $EMAIL"
      echo ""
      IFS=';' read -r -a scopeListArray<<< "$SCOPES_LIST"
      for SCOPE in  "${scopeListArray[@]}"
      do
        echo "  SCOPE: $SCOPE"
      done
done