撰寫 gcloud CLI 指令碼

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

授權

Google Cloud SDK 工具支援兩種授權方法:

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

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

如何授權存取和執行其他常見的 Cloud SDK 設定步驟:

    gcloud init

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

如果要使用服務帳戶授權,請使用目前的服務帳戶,或在 Google Cloud Platform 主控台中新增一個帳戶。在服務帳戶資料表的選項一欄中,建立並下載相關聯的私密金鑰作為 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 加以設定。

如需 Cloud SDK 工具相關的詳細說明,請參閱這裡的完整指南

停用提示

部分 gcloud CLI 指令為互動式,可對使用者顯示確認作業或要求使用者輸入指令的其他輸入提示。

在大部分情況下,當指令在指令碼或其他自動化項目中執行時,使用者均不太想要提示出現。您可以將設定中的 disable_prompts 屬性設為 True 或使用通用的 --quiet-q 標記,藉此停用 gcloud CLI 指令的提示。大部分的互動式指令在需要進行其他確認或輸入時都設有預設值。如果停用提示,系統會使用這些預設值。

例如:

    gcloud --quiet debug targets list

注意:請將 --quiet 標記加在最前面。

處理輸出

如果您想要指令碼或其他自動化項目在 gcloud CLI 指令輸出時的特定情況下才執行動作,請注意下列條件:

  • 不要依存列印至標準錯誤的訊息。

    日後版本的 gcloud CLI 可能有所變更並中斷您的自動化。

  • 不要依存列印至標準輸出的原始輸出訊息。

    任何指令的預設輸出可能在日後推出的版本有所變更。您可以使用 --format 標記設定輸出的格式,以將這些變更造成的影響降至最低,設定格式能採用下列其中一個選項來指定傳回的值:--format=json|yaml|csv|text|list。執行 $ gcloud 主題格式能取得更多選項。

    您可以利用 projections 修改 --format 預設的輸出。若要增加精細程度,請使用 --filter 標記傳回運算式得出值的子集。您可以針對傳回的值編寫指令碼。

    下方內容提供格式和篩選輸出的範例。

  • 不要依存指令結束狀態。

    如果結束狀態不為零就會發生錯誤且輸出未完成,除非有指令文件註記。例如建立多個資源的指令可能只建立幾個資源並將其列在標準輸出上,然後以非零的狀態結束。或者,您可以使用 show_structured_logs 屬性來剖析錯誤記錄。執行 $ gcloud 配置進一步瞭解詳情。

篩選和格式範例

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

在 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:title=zone,status)'

列出已驗證使用者電子郵件地址的專案:

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

編寫指令碼範例

使用格式與篩選的這個功能,您能結合 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:

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

更多資訊

如需使用 gcloud CLI 建構基本指令碼的逐步指南,請參閱此自動化 GCP 工作的新手指南

如需更多關於 gcloud CLI filtersformatsprojections 標記內建輸出設定功能的相關範例,請參閱這篇關於篩選與格式化的網誌文章

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud SDK 說明文件