如何获取GCE实例的内部IP地址列表

时间:2015-01-16 22:50:18

标签: awk google-compute-engine gcloud

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

我知道我可以跑:

gcloud compute instances list

但是有没有我可以传递的标志来获取我想要的信息? e.g。

gcloud compute instances list --internal-ips

或类似?或者我是否需要清除我的sed / awk大脑并解析输出?

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

5 个答案:

答案 0 :(得分:26)

以编程方式获取内部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,它还需要projection,这是一个选择资源数据值的resource keys列表。对于任何命令,您都可以使用--format=flattened获取资源键/值对列表:

$ gcloud --format=flattened compute instances list

答案 1 :(得分:8)

这里有一些事情。

首次列出的gcloud默认输出格式不保证稳定,将来可能会添加新列。不要反对这个脚本!

三种输出模式是三种输出模式,可通过格式标志访问, - 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'

答案 2 :(得分:3)

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

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

在您选择的地区预订静态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

答案 3 :(得分:1)

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

可以使用table()的{​​{1}}格式选项,如下所示:

gcloud

它为您做什么?

  • 以干净的格式获取数据
  • 允许您选择添加或删除列

是否需要其他列?在运行上述命令之前,如何查找列名?

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

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

加分点::这几乎与您可以调整的任何GCP资源数据(包括gcloud compute instances list --format=json 等)进行调整的语法相同。

答案 4 :(得分:0)

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

gcloud compute instances list --format=yaml | grep "  networkIP:" | cut -c 14-100