除了从命令行运行 Google Cloud CLI 命令之外,您还可以通过脚本或其他自动化功能运行这些命令,例如,在使用 Jenkins 自动执行 Google Cloud 任务时运行这些命令。
gcloud
CLI 附带过滤、格式设置和 --quiet
标志等各种工具,使您能够有效地处理输出并自动执行任务。
使用 gcloud
CLI 编写脚本的基础知识
如需查看如何使用 gcloud
CLI 构建基本脚本的分步指南,请参阅使用 gcloud 编写脚本:自动执行 Google Cloud 任务的新手指南。
授权
使用 gcloud
CLI 编写脚本时,您需要考虑授权方法。
gcloud
CLI 提供了两个选项:
- 用户帐号授权
- 服务帐号授权
如果您在单台机器上运行脚本或其他自动化功能,我们建议您使用用户帐号授权。
如需授予访问权限并执行其他常见 gcloud
CLI 设置步骤,请执行以下操作:
gcloud init
如果您要在生产环境中跨机器部署脚本或其他自动化功能,我们建议您使用服务帐号授权。如果您在所有用户均有权访问 root
的 Compute Engine 虚拟机实例上运行 gcloud
CLI 命令,那么我们也是建议您使用授权方法。
要使用服务帐号授权,请使用现有服务帐号或在“服务帐号”页面上创建新的帐号:
如需创建和下载关联的私钥作为 JSON 格式的密钥文件,请从服务帐号的操作菜单中选择管理密钥。
如需运行授权,请运行 gcloud auth activate-service-account
:
gcloud auth activate-service-account --key-file [KEY_FILE]
您可以通过 gcloud compute ssh
通过 SSH 连接到您的虚拟机实例,后者负责身份验证。您可以使用 gcloud compute config-ssh
配置 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 和文本)和过滤器(虚拟机名称以 2015 之后的创建年份等命名)的输出。
如果您想学习有关使用过滤条件和格式标志的互动教程,请使用以下按钮启动教程:
以下示例展示了使用 gcloud
CLI 命令进行格式设置和过滤的常见用途:
列出在地区 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)'
如需查看 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 命令合并到脚本中,以便轻松提取嵌入的信息。
列出所有项目的密钥和服务帐号
以下示例脚本通过以下方式列出与所有项目关联的密钥:
- 迭代项目
- 对于每个项目,获取关联的服务帐号
对于每个服务帐号,获取关联的密钥
巴什语
#!/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