Я использую cloud-init
к серверам условия в AWS, и хотел бы, чтобы мои серверы послали электронное письмо, когда они сделаны (перестали ли они работать или успешно выполняются). Для успешных облачных-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' ]
К сожалению, это не работает, когда облачный-init сценарий перестал работать. Другой ответ, кажется, предполагает, что я мог контролировать upstart
для успеха, но снова, это, кажется, не работает на отказ. Следующее новомодное задание, например, выполняется и на успехе и на отказе:
start on stopped cloud-final
script
echo "cloud-final stopped" > /tmp/cloud
end script
Я могу контролировать облако-init для отказа и инициировать сценарий, когда это выходит? Если так, как я мог сделать это? Я использую человечность v12.04.
12.04 вне поддержки. Нет большого ответа для облака-init в той версии.
В более новых версиях облака-init, облачных-init записей /run/cloud-init/result.json
с содержанием как:
{
"v1": {
"datasource": "DataSourceNoCloud [seed=/var/lib/cloud/seed/nocloud-net][dsmode=net]",
"errors": []
}
}
Если будут ошибки, то это будет иметь непустое значение в errors
список.
Кроме того, когда облако-init работает, оно поддерживает /run/cloud-init/status.json
.
В 17,2, существует подкоманда, которая может помочь. cloud-init status --wait
позволит Вашим пользовательским сценариям блокироваться, пока облако-init не будет сделано. Если облако-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
Кроме того, облако-init 17.2 добавило новую подкоманду, которая может помочь:
облачное-init состояние - ожидание позволит Вашим пользовательским сценариям блокироваться, пока облако-init не будет сделано.
Облачная-init ошибка выйдет ненулевой, и Ваш сценарий мог реагировать на это.
Вот простой сценарий крона, и запись работает на каждой начальной загрузке, которая сделала бы это для кого-то (предположение облака-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