編寫 gcloud CLI 指令碼

除了從指令列執行 Google Cloud CLI 指令,您也可以從指令碼或其他自動化項目執行這些指令,例如使用 Jenkins 來驅動 Google Cloud 工作的自動化。

gcloud CLI 隨附各種工具,例如篩選、格式化和 --quiet 標記,可讓您有效處理輸出內容及自動執行工作。

使用 gcloud CLI 編寫指令碼的基本知識

如需使用 gcloud CLI 建構基本指令碼的逐步指南,請參閱這篇網誌文章:使用 gcloud 編寫指令碼:自動執行工作的新手指南 Google Cloud

授權

使用 gcloud CLI 編寫指令碼時,您需要考慮授權方法。gcloud CLI 提供兩種選項:

  • 使用者帳戶授權
  • 服務帳戶授權

如果您正在單一機器上執行指令碼或其他自動化項目,則建議使用使用者帳戶授權。

如要授權存取權並執行其他常見的 gcloud CLI 設定步驟,請按照下列指示操作:

gcloud init

如果您正在正式版環境的所有機器上部署指令碼或其他自動化項目,則建議使用服務帳戶授權。如果您正在 Compute Engine 虛擬機器執行個體 (即所有使用者可存取 root 的地方) 上執行 gcloud CLI 指令,我們也建議您使用這種授權方法。

如要使用服務帳戶授權,請使用現有服務帳戶,或在「服務帳戶」頁面中新增一個帳戶:

前往「Service Accounts」(服務帳戶) 頁面

如要建立並下載相關聯的私密金鑰 (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 加以設定。

如需授權 gcloud CLI 工具的詳細操作說明,請參閱「授權 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 和文字) 和篩選條件 (例如以「test」為前置字串的 VM 名稱、2015 年後建立的 VM 等)。

如要使用關於篩選和格式標記的互動式教學課程,請改用下列按鈕啟動教學課程:

在 Cloud Shell 開啟

下列範例說明如何使用 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)'

如需輸出內容設定功能的更複雜範例,請參閱這篇有關篩選和格式設定的網誌文章。filtersformatsprojections

最佳做法

如果您想要指令碼或其他自動化項目在 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