How to know if a machine is an Google Compute Engine instance

前端 未结 4 1481
感动是毒
感动是毒 2021-02-13 09:59

Is there a way to know from a command line shell if I am currently on a Google Compute Engine machine or somewhere else (development machine)?

相关标签:
4条回答
  • 2021-02-13 10:25

    Per the metadata docs:

    You can easily detect if your applications or scripts are running within a Compute Engine instance by using the metadata server. When you make a request to the server, any response from the metadata server will contain the Metadata-Flavor: Google header. You can look for this header to reliably detect if you are running in Compute Engine.

    For example, the following curl request returns a Metadata-Flavor: Google header, indicating that the request is being made from within a Compute Engine instance.

    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/
    
    0 讨论(0)
  • 2021-02-13 10:29

    You can also do a DNS lookup for the Metadata server, instead of actually calling it.

    For example, doing dig +short metadata.google.internal inside a Google Compute instance would output something like this:

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

    If, however, you do the same command (dig +short metadata.google.internal) inside a standard server, outside of Google Cloud, you could get an empty response.

    So to check, all you need to do (in bash for instance) is:

    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
    
    0 讨论(0)
  • 2021-02-13 10:32

    Here is python implementation via socket.getaddrinfo

    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
    
    
    
    0 讨论(0)
  • 2021-02-13 10:38

    You can also use the dmidecode utility to probe the virtual hardware if you don't want to make a network call:

    my@myinst:~$ sudo dmidecode -s bios-vendor | grep Google
    Google
    
    0 讨论(0)
提交回复
热议问题