【问题标题】:How to get a list of internal IP addresses of GCE instances如何获取 GCE 实例的内部 IP 地址列表
【发布时间】:2015-03-15 15:39:36
【问题描述】:

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

我知道我可以跑:

gcloud compute instances list

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

gcloud compute instances list --internal-ips

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

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

【问题讨论】:

  • 或者 awk 可能更好
  • gcloud 的一小部分示例输出和您所需的输出将使非gcloud 成员更容易帮助您解决问题。祝你好运。

标签: awk google-compute-engine gcloud


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我同意@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}'  
    

    希望对你有帮助。

    【讨论】:

    • 请注意,如果您的网络具有可抢占实例,则此方法不起作用(在这种情况下,第 4 列是它是否可抢占)。
    【解决方案3】:

    这里有一些东西。

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

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

    使用 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'
    

    【讨论】:

    • 我认为你需要一个 .在 jq 命令中,例如 gcloud compute instances list --format=json | jq '.[].networkInterfaces[].networkIP'
    • 我在这里的回答现在有点过时了。新版本的 gcloud 对输出格式、过滤字段等提供了更多控制。请参阅 cloud.google.com/sdk/gcloud/reference/topic/formats 了解概览。
    • 这帮助很大。 export PROXY=$(gcloud compute instances list --format=text | grep '^networkInterfaces[[0-9]\+]\.networkIP:' | sed 's/^.* //g') 将其保存到给你的环境变量
    【解决方案4】:

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

    $ 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
    

    【讨论】:

    • 你知道如何用逗号分隔值属性吗?这个不行:gcloud --format="value[terminator=","](networkInterfaces[0].accessConfigs[0].natIP)" compute instances list
    • @AlexCalm1Kov 你有嵌套在双引号中的双引号会中断,因此请像这样替换其中一对:gcloud --format="value[terminator=','](networkInterfaces[0].accessConfigs[0].natIP)" compute instances list 或者您也可以尝试使用paste,如下所示:@987654332 @ 当只有一个值时,它不会留下虚假的尾随逗号——我认为这种情况是上一个命令中的错误。
    • 获取单个实例的内部IP:gcloud compute instances list --format="value(networkInterfaces[0].networkIP)" --filter="name=('INSTANCE-NAME')"
    【解决方案5】:

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

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

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

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

    [Informal] 查看保留的区域静态 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
    

    【讨论】:

      【解决方案6】:

      最好的方法是让现成的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 资源数据以获取的语法几乎相同,包括 gcloud, kubectl 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 2015-03-24
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 2015-06-06
        相关资源
        最近更新 更多