如何确保Google Cloud Compute实例正常运行

时间:2015-04-03 14:28:02

标签: google-cloud-platform gcloud

我从shell脚本创建Google Cloud Compute实例,然后通过ssh在该实例上启动多个命令。

如何确保实例中的操作系统正常运行?

例如:

gcloud compute instances create "$my_name" \ --tags "http-server" \ --image container-vm \ --metadata-from-file google-container-manifest="container.yml" \ --zone "$my_zone" \ --machine-type g1-small

然后我想要跑 gcloud compute ssh \ "$my_name" --zone "$my_zone" \ --command 'sudo docker stop $(sudo docker ps -q -a)'

gcloud compute copy-files \ some.conf root@"$my_name":/existing_dir/ \ --zone "$my_zone"

据我所知,如果实例未启动,第二个命令可能会因连接拒绝而失败。

如何确保实例已启动并准备接受ssh连接?

5 个答案:

答案 0 :(得分:2)

简单的跨平台解决方案:

gcloud compute --verbosity error --project "MYPROJECT" ssh "MYINSTANCE" -- "echo instance now up" -o StrictHostKeyChecking=no

循环,直到你得到errorLevel = 0

答案 1 :(得分:1)

在发送命令之前,只需检查SSH端口是否已打开。在实例操作系统启动之前,SSH服务器不会启动:

IP=$(gcloud compute instances list | awk '/'$my_name'/ {print $5}')
if nc -w 1 -z $IP 22; then
    echo "OK! Ready for heavy metal"
    : Do your heavy metal work
else
    echo "Maybe later?"
fi

说明:

  
      
  1. 获取IP,例如$ my_name
  2.   
  3. 检查端口22是否接受传入连接。
  4.         
        

    -w:连接超时(1秒应该足够多)

             

    -z:仅检查端口是否已打开并立即退出

      

答案 2 :(得分:1)

如果你必须确保 ssh 可用,有一个脚本可以做到这一点。

#!/usr/bin/env bash

function wait_vm_up {
  local counter=0

  local readonly project=${1:?"project required"}
  local readonly instance=${2:?"instance required"}
  local readonly zone=${3:?"zone required"}
  local readonly user=${4:?"user required"}
  local readonly maxRetry=${5:-100}

  echo "Project: $project"
  echo "Instance: $instance"
  echo "MaxRetry: $maxRetry"

  while true ; do
    if (( $counter == $maxRetry )) ; then
      echo "Reach the retry upper limit $counter"
      exit 1
    fi

    gcloud compute ssh --quiet --zone "$zone" "$user@$instance" --tunnel-through-iap --project "$project" --command="true" 2> /dev/null

    if (( $? == 0 )) ;then
      echo "The machine is UP !!!"
      exit 0
    else
      echo "Maybe later? $counter"
      ((counter++))
      sleep 1
    fi
  done
}

wait_vm_up $@

答案 3 :(得分:0)

您可以使用此命令:gcloud compute instances描述'实例名' - 区'区域名'| grep“status:RUNNING”

如果您获得了确切的输出状态:RUNNING ,则表示该实例已启动并正在运行。

答案 4 :(得分:-1)

我认为startup scripts为你做的工作:D

或使用REST APIs可以轮询实例状态