除了從指令列執行 Google Cloud CLI 指令,您也可以從指令碼或其他自動化項目中執行這些指令,例如使用 Jenkins 來驅動 Google Cloud 工作的自動化。
Google Cloud SDK 隨附各種工具,例如篩選、格式化和 --quiet 標記,可讓您有效處理輸出內容及自動執行工作。
使用 Google Cloud SDK 編寫指令碼的基本知識
如需使用 gcloud CLI 建構基本指令碼的逐步指南,請參閱這篇網誌文章:使用 gcloud 編寫指令碼:自動執行工作的新手指南 Google Cloud 。
授權
使用 Google Cloud SDK 撰寫指令碼時,您需要考慮授權方法。Google Cloud SDK 提供兩種選項:
- 使用者帳戶授權
- 服務帳戶授權
如果您正在單一機器上執行指令碼或其他自動化項目,則建議使用使用者帳戶授權。
如要授權存取權並執行其他常見的 Google Cloud SDK 設定步驟,請按照下列指示操作:
gcloud init
如果您正在正式版環境的所有機器上部署指令碼或其他自動化項目,則建議使用服務帳戶授權。如果您正在 Compute Engine 虛擬機器執行個體 (即所有使用者可存取 root 的地方) 上執行 gcloud CLI 指令,我們也建議您使用這種授權方法。
如要使用服務帳戶授權,請使用現有服務帳戶,或在「服務帳戶」頁面中新增一個帳戶:
如要建立並下載相關聯的私密金鑰 (JSON 格式的金鑰檔案),請從服務帳戶的動作選單中選擇「管理金鑰」。
如要執行授權,請執行 gcloud auth activate-service-account:
gcloud auth activate-service-account --key-file [KEY_FILE]
您可以使用負責驗證的 gcloud compute ssh,透過 SSH 登入 VM 執行個體。SSH 設定檔能運用 gcloud compute config-ssh 加以設定。
如需授權 Google Cloud SDK 工具的詳細操作說明,請參閱「授權 gcloud CLI」一文。
停用提示
部分 gcloud CLI 指令為互動式,可對使用者顯示確認作業或要求使用者輸入指令的其他輸入提示。
在大部分情況下,當指令在指令碼或其他自動化項目中執行時,使用者均不太想要提示出現。如要停用 gcloud CLI 指令的提示,請將設定中的 disable_prompts 屬性設為 True,或使用全域 --quiet 或 -q 旗標。大部分的互動式指令在需要進行其他確認或輸入時都設有預設值。如果停用提示,系統會使用這些預設值。
例如:
gcloud debug targets list --quiet
篩選及設定輸出內容格式
如要使用 gcloud CLI 編寫指令碼,請務必確保輸出內容可預測;這時 --filter 和 --format 旗標就能派上用場。這些標記可確保您使用 gcloud CLI 執行指令時,產生的輸出內容符合格式 (例如 json、yaml、csv 和 text) 和篩選條件 (VM 名稱開頭為「test」、建立年份在 2015 年之後等) 規格。
下列範例說明如何使用 gcloud CLI 指令設定格式和篩選:
列出建立於 us-central1-a 區域的執行個體:
gcloud compute instances list --filter="zone:us-central1-a"
以 JSON 格式列出標籤符合特定值的專案 (例如 label.env 為「測試」而 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)'
如需輸出內容設定功能的更複雜範例,請參閱這篇有關篩選和格式設定的網誌文章。這些功能內建於 gcloud CLI 的 filters、formats 和 projections 標記。
最佳做法
如果您想要指令碼或其他自動化項目在 gcloud CLI 指令輸出時的特定情況下才執行動作,請注意下列條件:
- 請依附於指令結束狀態。 - 如果結束狀態不是零,表示發生錯誤,除非指令說明文件另有註明,否則輸出內容可能不完整。舉例來說,建立多個資源的指令可能只會建立幾個資源,並在標準輸出中列出這些資源,然後以非零狀態結束。或者,您也可以使用 - show_structured_logs屬性剖析錯誤記錄。如需更多詳細資料,請執行- gcloud config。
- 不要依存列印至標準錯誤的訊息。 - 日後版本的 gcloud CLI 可能會變更這些訊息的措辭,導致自動化程序中斷。 
- 不要依存列印至標準輸出的原始輸出訊息。 - 任何指令的預設輸出可能在日後推出的版本有所變更。您可以使用 - --format標記設定輸出的格式,以將這些變更造成的影響降至最低,設定格式能採用下列其中一個選項來指定傳回的值:- --format=json|yaml|csv|text|list。如要查看更多選項,請執行- gcloud topic formats。- 您可以透過 - projections修改- --format的預設輸出內容。如要增加精細程度,請使用- --filter標記傳回運算式得出值的子集。您可以針對傳回的值編寫指令碼。- 下方內容提供格式和篩選輸出的範例。 
指令碼範例
使用格式與篩選的功能,您能結合 gcloud CLI 指令作為指令碼,輕易地擷取嵌入資訊。
列出所有專案服務帳戶的金鑰
下列範例指令碼會執行下列作業,列出與所有專案服務帳戶相關聯的金鑰:
- 疊代專案
- 針對每個專案,取得相關聯的服務帳戶
- 為每個服務帳戶取得相關聯的金鑰 
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"
      }
  }
}
剖析輸出內容以進行處理
以下範例示範如何剖析輸出內容以進行處理。具體來說,範例指令碼會將服務帳戶資訊寫入陣列,並分隔多值 CSV 格式的 serviceAccounts.scope() 欄位中的值:
#!/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
