有没有办法从命令行shell了解我目前是在Google Compute Engine机器上还是在其他地方(开发机器)?
答案 0 :(得分:9)
您可以使用元数据服务器轻松检测您的应用程序或脚本是否在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)
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