Как я могу контролировать облако-init для ошибок и инициировать сценарий, когда оно перестало работать?

Я использую 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.

3
задан 13 April 2017 в 15:25

2 ответа

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
1
ответ дан 1 December 2019 в 17:53

Кроме того, облако-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
0
ответ дан 1 December 2019 в 17:53

Другие вопросы по тегам:

Похожие вопросы: