Google compute engine 是否检测实例何时已完成安装脚本?

Google compute engine 是否检测实例何时已完成安装脚本?,google-compute-engine,Google Compute Engine,我正在使用以下命令启动实例: gcutil addinstance \ --image=debian-7 \ --persistent_boot_disk \ --zone=us-central1-a \ --machine_type=n1-standard-1 \ --metadata_from_file=startup-script:install.sh \ instance-name 如何检测此实例何时完成其安装脚本?我希望能够将此启动命令放在一个更大的配置脚本中,然后根据已成功完成的安

我正在使用以下命令启动实例:

gcutil addinstance \
--image=debian-7 \
--persistent_boot_disk \
--zone=us-central1-a \
--machine_type=n1-standard-1 \
--metadata_from_file=startup-script:install.sh \
instance-name

如何检测此实例何时完成其安装脚本?我希望能够将此启动命令放在一个更大的配置脚本中,然后根据已成功完成的安装脚本向服务器发出命令。

一个可能的解决方案是让您的安装脚本在云存储桶中创建一个文本文件,这是最后一件事,使用主机名作为文件名


执行原始gcutil addinstance命令的主脚本可以定期轮询bucket的内容(使用gsutil ls)直到它看到一个具有匹配名称的文件,然后它就会知道该实例上的安装已经完成。

一个可能的解决方案是让您的安装脚本在云存储桶中创建一个文本文件,就像它最后做的一样,使用主机名作为文件名


执行原始gcutil addinstance命令的主脚本可能会定期轮询bucket的内容(使用gsutil ls),直到它看到一个具有匹配名称的文件,然后它就会知道安装已在该实例上完成。

我不知道如何在
gcutil addinstance中完成所有这一切

我建议:

  • 通过
    gcutil addinstance
    添加实例,确保使用
    --wait_until_running
    标志确保实例正在运行,然后继续
  • 通过类似于
    gcutil push的方式将脚本复制到实例
  • 使用
    gcutil ssh
    手动运行脚本

  • 通过这种方式,您可以编写脚本,直到脚本完成为止,ssh命令将不会返回,直到远程计算机上的脚本执行完毕。

    我不知道在
    gcutil addinstance
    中如何完成所有这一切

    我建议:

  • 通过
    gcutil addinstance
    添加实例,确保使用
    --wait_until_running
    标志确保实例正在运行,然后继续
  • 通过类似于
    gcutil push的方式将脚本复制到实例
  • 使用
    gcutil ssh
    手动运行脚本

  • 通过这种方式,您可以编写脚本,直到脚本完成为止,ssh命令不会返回,直到远程机器上的脚本执行完毕。

    有多种方法:向自己发送电子邮件、上传到云存储、发送jabber消息

    IMHO的一个简单、可观察的方法是在
    install.sh
    脚本的末尾添加一个
    logger
    条目(我还调整了开头的对称性)。比如:

    #!/bin/bash
    
    /usr/bin/logger "== Startup script START =="
    #
    # Your code goes here
    #
    /usr/bin/logger "== Startup script END   =="
    
    然后,您可以检查脚本是否以两种方式开始或结束:

    • 从中,选择“项目”>“计算”>“虚拟机实例”>您的实例>“串行控制台”>“查看输出”
    • 从CLI发出一个
      gcutil getserialportoutput实例名

    有很多种方式:给自己发送电子邮件、上传到云存储、发送叽叽喳喳的信息

    IMHO的一个简单、可观察的方法是在
    install.sh
    脚本的末尾添加一个
    logger
    条目(我还调整了开头的对称性)。比如:

    #!/bin/bash
    
    /usr/bin/logger "== Startup script START =="
    #
    # Your code goes here
    #
    /usr/bin/logger "== Startup script END   =="
    
    然后,您可以检查脚本是否以两种方式开始或结束:

    • 从中,选择“项目”>“计算”>“虚拟机实例”>您的实例>“串行控制台”>“查看输出”
    • 从CLI发出一个
      gcutil getserialportoutput实例名

      • 实现这一目标的方法确实有很多。让我感到高兴的是使用与实例关联的元数据服务器。当脚本完成时,让启动脚本将一段元数据设置为“FINISHED”。您可以使用挂起的GET查询,该GET仅在元数据更新时返回。只用 作为最后一个命令从脚本中删除


        我喜欢这种方法,因为挂起的GET只给了您一个运行的命令,而不是一个循环中运行的轮询,并且它不涉及除了计算引擎之外的任何服务

        实现这一目标的方法确实有很多。让我感到高兴的是使用与实例关联的元数据服务器。当脚本完成时,让启动脚本将一段元数据设置为“FINISHED”。您可以使用挂起的GET查询,该GET仅在元数据更新时返回。只用 作为最后一个命令从脚本中删除

        我喜欢这种方法,因为挂起的GET只给了您一个运行的命令,而不是一个循环中运行的轮询,并且它不涉及除了计算引擎之外的任何服务

        还有一种老套的方法:

        startup_script_finished=false
        while [[ "$startup_script_finished" = false ]]; do
            pid=$(gcloud compute ssh $GCLOUD_USER@$GCLOUD_INSTANCE -- pgrep -f "\"/usr/bin/python /usr/bin/google_metadata_script_runner --script-type startup\"")
            if [[ -z $pid ]]; then
                startup_script_finished=true
            else
                sleep 2
            fi
        done
        
        还有一种方法:

        startup_script_finished=false
        while [[ "$startup_script_finished" = false ]]; do
            pid=$(gcloud compute ssh $GCLOUD_USER@$GCLOUD_INSTANCE -- pgrep -f "\"/usr/bin/python /usr/bin/google_metadata_script_runner --script-type startup\"")
            if [[ -z $pid ]]; then
                startup_script_finished=true
            else
                sleep 2
            fi
        done
        

        上次我检查时,这不起作用,因为启动脚本是在后台启动的。如果您尝试“sleep 3600”,在启动脚本结束之前,vm将处于“RUNNING”状态。上次我检查时,这不起作用,因为启动脚本是在后台启动的。如果您尝试“sleep 3600”,在启动脚本结束之前,vm将处于“RUNNING”状态。如果我错了,请纠正我,但您不能仅从实例本身访问元数据服务器吗?在文档中:“您只能从其关联实例查询元数据服务器。”这一点很好-您必须使用setcommoninstancemetadata来生成项目级元数据。然后您可以使用gcutil从实例外部访问它。您有一个如何从实例外部设置和检索元数据的示例吗?看起来查看元数据的唯一方法是通过
        gcutil getinstance myinstance1
        ,它实际上不是可解析的格式。gcutil getproject——格式json将以可解析的格式包含commoninstancemetadata。然后你可以把它扔了