我使用cloud-init
AWS 来配置服务器,并希望我的服务器在完成时发送电子邮件(无论它们失败还是成功)。对于成功的 cloud-init 运行,解决方案很简单。cloud-init
有一个内置模块用于这种事情。从来源:
# When cloud-init is finished running including having run
# cloud_init_modules, then it will run this command. The default
# is to emit an upstart signal as shown below. If the value is a
# list, it will be passed to Popen. If it is a string, it will be
# invoked through 'sh -c'.
#
# default value:
# cc_ready_cmd: [ initctl, emit, cloud-config, CLOUD_CFG=/var/lib/instance//cloud-config.txt ]
# example:
# cc_ready_cmd: [ sh, -c, 'echo HI MOM > /tmp/file' ]
不幸的是,当 cloud-init 脚本失败时,这种方法就行不通了。另一个回答似乎表明我可以监控upstart
成功情况,但同样,它似乎对失败不起作用。例如,以下 upstart 作业在成功和失败时都会执行:
start on stopped cloud-final
script
echo "cloud-final stopped" > /tmp/cloud
end script
我可以监控 cloud-init 是否失败并在其退出时触发脚本吗?如果可以,我该怎么做?我正在使用 ubuntu v12.04。
答案1
12.04 不再受支持。该版本中没有针对 cloud-init 的出色解决方案。
在较新版本的 cloud-init 中,cloud-init 写入/run/cloud-init/result.json
如下内容:
{
"v1": {
"datasource": "DataSourceNoCloud [seed=/var/lib/cloud/seed/nocloud-net][dsmode=net]",
"errors": []
}
}
如果出现错误,列表中将具有非空值errors
。
此外,当 cloud-init 运行时,它会维护/run/cloud-init/status.json
。
在 17.2 中,有一个子命令可以提供帮助。 cloud-init status --wait
将允许您的自定义脚本阻塞,直到 cloud-init 完成。如果 cloud-init 出现错误,则状态将以非零值退出。(感谢 Chad Smith 的建议)。
$ cat > /usr/local/bin/after-cloud-init <<"EOF"
#!/bin/bash
# Block until cloud-init completes
exec >/run/after-cloud-init.txt 2>&1
msg() { read up idle < /proc/uptime; echo "$up:" "$@"; }
msg starting
if ! cloud-init status --wait ; then
msg "Cloud-init failed with $?"
exit 1
fi
msg done. put your stuff here.
exit 1
EOF
$ chmod 755 /usr/local/bin/after-cloud-init
$ crontab -e
@reboot /usr/local/bin/after-cloud-init
$ sudo reboot
答案2
此外,cloud-init 17.2 添加了一个新的子命令,可以帮助:
cloud-init 状态 --wait将允许您的自定义脚本阻止直到 cloud-init 完成。
cloud-init 错误将以非零形式退出,并且您的脚本可以对此做出反应。
这是一个简单的 cron 脚本,每次启动时都会运行该脚本来为某人执行此操作(假设 cloud-init 17.2+)
$ cat > /home/ubuntu/yourscript.sh <<EOF
#!/bin/bash
set -e
cloud-init status --wait > /dev/null 2>&1 # Blocks until cloud-init
completes
echo 'Cloud-init now done ' `date -R` # do things here
EOF
$ chmod 755 /home/ubuntu/yourscript.sh
$ crontab -e
@reboot /home/ubuntu/yourscript.sh
$ sudo reboot