使用关闭脚本创建新的Google云端实例

时间:2018-06-12 05:51:44

标签: google-compute-engine

我正在尝试使用shutdown-script从正在关闭的实例中创建一个新实例。

该脚本有三个任务, 1.创建一个空文件 2.获取要创建的新实例的名称 3.为要生成的下一个新实例生成名称 4.使用生成的名称在此实例中创建一个新实例。

这是脚本:

#!/bin/bash

touch /home/ubuntu/newfile.txt

new_instance_name=$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/next_instance_name -H "Metadata-Flavor: Google")

next_instance_name="instance-"$(printf "%04d" $((${new_instance_name: -4}+1)))

gcloud beta compute --project=xxxxxxxxx instances create $new_instance_name --zone=us-central1-c --machine-type=f1-micro --subnet=default --network-tier=PREMIUM --metadata=next_instance_name=$next_instance_name --maintenance-policy=MIGRATE --service-account=XXXXXXXX-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/cloud-platform --image=image-1 --image-project=xxxxxxxx --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=$new_instance_name

此脚本使用chmod +x可执行,脚本的文件名为/home/ubuntu/shtudown_script.sh。此实例的元数据shutdown-script也是/home/ubuntu/shtudown_script.sh

当我从实例中手动运行脚本时,脚本的所有部分都运行正常,因此创建了一个新文件,并在当前实例关闭时创建了一个新实例。

但是当我stop实例时从API调用它时,它只使用touch命令创建我创建的文件,但是没有像以前那样创建新实例。

我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

所以我能够重现你描述的行为。我运行了一个类似于你提供的关闭脚本的bash脚本,它只会创建一个名为" newfile.txt"的空文件。

然后我决定附加gcloud命令的输出以查看发生了什么。我不得不调整bash脚本以适应我的项目。这是我运行的将输出复制到文件的bash脚本:

#!/bin/bash

touch /home/ubuntu/newfile.txt

gcloud beta compute --project=xxx instances create instance-6 --zone=us-central1-c --machine-type=f1-micro --subnet=default --maintenance-policy=MIGRATE --service-account=xxxx-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/cloud-platform --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=instance-6 > /var/output.txt 2>&1

我收到的输出如下:

错误:(gcloud.beta.compute.instances.create)无法获取资源: - 权限不足

这意味着我的默认服务帐户没有适当的范围来创建VM实例。

然后我停止了我的VM实例并编辑了范围,以便按照here所述为服务帐户提供完全访问权限。一旦我更改了范围,我就启动了VM实例,然后再次停止它。此时,它成功创建了名为" instance-6"的VM实例。我不建议给默认服务完全访问权限。我建议指定它应该具有哪些范围,但如果您希望关闭脚本能够工作,请确保它具有对计算引擎的完全访问权限。

答案 1 :(得分:0)

如果使用以下命令停止VM实例时关闭脚本有效:

$ sudo shutdown -h now

通过按“停止”按钮从云控制台停止VM实例时不起作用,然后我怀疑这种行为是可以预期的。

当您停止VM实例时,关闭脚本的运行时间有限;但是,如果使用“sudo shutdown”命令请求关闭,则此限制不适用。您可以阅读有关此行为的更多信息here

如果您想了解关闭期间的更多信息,可以阅读here

答案 2 :(得分:0)

我已经通过给予服务帐户完全访问权限(这是一种不好的做法)给了我的实例适当的范围。

但是当我使用

重新安装google-cloud-sdk时,实际问题就解决了
sudo apt-get install google-cloud-sdk

当我在通过sshing重新安装gcloud之前运行这些脚本时,它正在使用预安装目录gcloud中的/snap/bin/gcloud命令。但是当它从启动或关闭脚本运行时,由于某种原因它无法访问预安装的/snap/bin/目录,当我使用apt-get重新安装google cloud sdk时,gcloud命令正在进行从/usr/bin/gcloud访问,我认为可以通过启动或关闭脚本访问。