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

时间:2015-06-18 09:38:14

标签: google-compute-engine google-cloud-platform

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

4 个答案:

答案 0 :(得分:9)

根据metadata docs

  

您可以使用元数据服务器轻松检测您的应用程序或脚本是否在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/

答案 1 :(得分:5)

如果您不想拨打网络电话,也可以use the dmidecode utility to probe the virtual hardware

my@myinst:~$ sudo dmidecode -s bios-vendor | grep Google
Google

答案 2 :(得分:4)

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

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

[root@vm-1]# dig +short metadata.google.internal
169.254.169.254

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

所以要检查,你需要做的就是(例如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

答案 3 :(得分:0)

这是通过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