如何监控 cloud-init 的错误,并在失败时触发脚本?

如何监控 cloud-init 的错误,并在失败时触发脚本?

我使用cloud-initAWS 来配置服务器,并希望我的服务器在完成时发送电子邮件(无论它们失败还是成功)。对于成功的 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

相关内容