除了從指令列執行 Google Cloud CLI 指令,您也可以從指令碼或其他自動化項目執行這些指令,例如使用 Jenkins 來驅動 Trusted Cloud 工作的自動化。
gcloud CLI 隨附各種工具,例如篩選、格式化和 --quiet
標記,可讓您有效處理輸出內容及自動執行工作。
使用 gcloud CLI 編寫指令碼的基本知識
如需使用 gcloud CLI 建構基本指令碼的逐步指南,請參閱這篇網誌文章:使用 gcloud 編寫指令碼:自動執行工作的新手指南 Trusted Cloud 。
授權
使用 gcloud CLI 編寫指令碼時,您需要考慮授權方法。gcloud CLI 提供兩種選項:
- 使用者帳戶授權
- 服務帳戶授權
如果您正在單一機器上執行指令碼或其他自動化項目,則建議使用使用者帳戶授權。
如要授權存取權並執行其他常見的 gcloud CLI 設定步驟,請按照下列指示操作:
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
加以設定。
如需授權 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 等)。
下列範例說明如何使用 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)'
如需輸出內容設定功能的更複雜範例,請參閱這篇有關篩選和格式設定的網誌文章。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