13

我有一堆在 GCE 中运行的实例。我想以编程方式获取它们的内部 IP 地址列表,而无需(本地)登录实例。

我知道我可以运行:

gcloud compute instances list

但是我可以传递任何标志来获取我想要的信息吗?例如

gcloud compute instances list --internal-ips

或类似的?还是我必须清理我的 sed/awk 大脑并解析输出?

我也知道我可以使用 --format=json 以 JSON 格式获取输出,但我正在尝试在 bash 脚本中执行此操作。

4

6 回答 6

33

以编程方式获取内部 IP(或外部 IP)列表的最简单方法gcloud是:

$ gcloud --format="value(networkInterfaces[0].networkIP)" compute instances list
$ gcloud --format="value(networkInterfaces[0].accessConfigs[0].natIP)" compute instances list

--format=value也需要一个投影,它是选择资源数据值的资源键列表。对于任何可用于--format=flattened获取资源键/值对列表的命令:

$ gcloud --format=flattened compute instances list
于 2016-08-15T07:29:27.173 回答
10

这里有几件事。

首先gcloud的listing的默认输出格式不保证稳定,以后可能会增加新的列。不要为此编写脚本!

三种输出模式是可以通过格式标志访问的三种输出模式,--format=json、--format=yaml 和 format=text,基于键=值对,即使引入新字段也可以编写脚本在将来。

做你想做的两个好方法是使用 JSON 和 jq 工具,

gcloud compute instances list --format=json \
    | jq '.[].networkInterfaces[].networkIP'

或文本格式和 grep + 面向行的使用工具,

gcloud compute instances list --format=text \
    | grep '^networkInterfaces\[[0-9]\+\]\.networkIP:' | sed 's/^.* //g'
于 2015-01-20T17:06:11.573 回答
4

我四处寻找并找不到直接的答案,可能是因为当其他人回答原始问题时没有有效的工具。GCP 不断更新他们的库和 API,我们可以使用过滤器和投影来提取目标属性。

在这里,我概述了如何保留外部静态 IP,查看它的属性是如何命名和组织的,然后导出外部 IP 地址以便我可以在其他脚本中使用它(例如,将其分配给 VM 实例或授权此网络(IP地址)在 Cloud SQL 实例上。

在您选择的区域中保留静态 IP

gcloud compute --project=[PROJECT] addresses create [NAME] --region=[REGION]

[信息性] 查看保留的区域静态 IP 的详细信息

gcloud compute addresses describe [NAME] --region [REGION] --format=flattened

[参考] 以键值对的形式列出静态 IP 的属性

gcloud compute addresses describe [NAME] --region [REGION] --format='value(address)'

提取所需的值(例如外部 IP 地址)作为参数

export STATIC_IP=$(gcloud compute addresses describe [NAME] --region [REGION] --format='value(address)’)

在其他脚本中使用导出的参数

echo $STATIC_IP
于 2018-05-10T04:11:34.043 回答
1

最好的方法是让现成gcloud的命令在需要时使用相同的命令。

这可以使用table()格式选项来实现,gcloud如下所示:

gcloud compute instances list --format='table(id,name,status,zone,networkInterfaces[0].networkIP :label=Internal_IP,networkInterfaces[0].accessConfigs[0].natIP :label=External_IP)'

它对你有什么作用?

  • 以干净的格式获取数据
  • 为您提供添加或删除列的选项

需要额外的列?如何在运行上述命令之前找到列名?

执行以下操作,这将为您提供包含值及其名称的原始 JSON 格式的数据,复制这些名称并将它们添加到您的 table() 列表中。:-)

gcloud compute instances list --format=json

加分点:这与您可以调整任何 GCP 资源数据以获取的语法几乎相同,包括 withgcloud, kubectl等。

于 2020-03-30T10:18:35.870 回答
0

我同意@Christiaan。目前没有使用 gcloud 命令自动获取内部 IP 的方法。

您可以使用以下命令打印内部 IP(第 4 列):

gcloud compute instances list | tail -n+2 | awk '{print $4}'

或者如果你想要一对<instance_name> <internal_ip>(第 1 列和第 4 列)

gcloud compute instances list | tail -n+2 | awk '{print $1, $4}'  

我希望它有所帮助。

于 2015-01-17T13:54:46.393 回答
0

据我所知,您无法过滤 gcloud 工具中的特定字段。像这样的东西适用于 Bash 脚本,但它仍然感觉有点脆弱:

gcloud compute instances list --format=yaml | grep "  networkIP:" | cut -c 14-100
于 2015-01-16T23:38:07.657 回答