如何知道某台计算机是否为Google Compute Engine实例

poi*_*rez 10 google-compute-engine google-cloud-platform

有没有办法从命令行shell了解我目前是在Google Compute Engine机器上还是在其他地方(开发机器)?

Mis*_*man 10

根据元数据文档:

您可以使用元数据服务器轻松检测应用程序或脚本是否在Compute Engine实例中运行.向服务器发出请求时,元数据服务器的任何响应都将包含Metadata-Flavor: Google标头.您可以查找此标头以可靠地检测您是否在Compute Engine中运行.

例如,以下curl请求返回一个Metadata-Flavor: Google标头,表示该请求是在Compute Engine实例中进行的.

me@my-inst:~$ curl metadata.google.internal -i
HTTP/1.1 200 OK
Metadata-Flavor: Google
Content-Type: application/text
Date: Thu, 10 Apr 2014 19:24:27 GMT
Server: Metadata Server for VM
Content-Length: 22
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

0.1/
computeMetadata/
Run Code Online (Sandbox Code Playgroud)


nor*_*ree 9

这是通过socket.getaddrinfo的python实现

import socket


def is_gce_instance():
  """Check if it's GCE instance via DNS lookup to metadata server.
  """
  try:
    socket.getaddrinfo('metadata.google.internal', 80)
  except socket.gaierror:
    return False
  return True


Run Code Online (Sandbox Code Playgroud)


小智 6

您还可以对元数据服务器进行 DNS 查找,而不是实际调用它。

例如,在 Google Compute 实例dig +short metadata.google.internal 执行操作会输出如下内容:

[root@vm-1]# dig +short metadata.google.internal
169.254.169.254
Run Code Online (Sandbox Code Playgroud)

但是,如果您dig +short metadata.google.internal在 Google Cloud 外部的标准服务器内执行相同的命令 ( ),则可能会得到空响应。

因此,要检查,您需要做的bash就是(例如):

GMETADATA_ADDR=`dig +short metadata.google.internal`
if [[ "${GMETADATA_ADDR}" == "" ]]; then
    echo "I am NOT in a Google VM!"
else
    echo "I AM INSIDE a Google VM! Whoohoo!"
fi
Run Code Online (Sandbox Code Playgroud)


E. *_*son 5

如果您不想进行网络呼叫,也可以使用该dmidecode实用程序探测虚拟硬件:

my@myinst:~$ sudo dmidecode -s bios-vendor | grep Google
Google
Run Code Online (Sandbox Code Playgroud)