Como posso monitorar o cloud-init em busca de erros e disparar um script quando ele falhar?

3

Estou usando cloud-init para provisionar servidores na AWS e gostaria que meus servidores enviassem um e-mail quando terminassem (com falha ou sucesso). Para execuções bem-sucedidas do cloud-init, a solução é trivial. cloud-init tem um módulo embutido para esse tipo de coisa. Do a fonte :

# 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' ]

Infelizmente, isso não funciona quando um script cloud-init falha. Outro answer parece sugerir que eu poderia monitorar upstart para o sucesso, mas, novamente, não parece funcionar para o fracasso. O seguinte trabalho inicial, por exemplo, executa o sucesso e o fracasso:

start on stopped cloud-final
script
    echo "cloud-final stopped" > /tmp/cloud
end script

Posso monitorar o cloud-init para falha e disparar um script quando ele sai? Se sim, como eu poderia fazer isso? Estou usando o ubuntu v12.04.

    
por Christopher 21.02.2013 / 22:09

2 respostas

1

12.04 está fora de suporte. Não há uma ótima resposta para o cloud-init nessa versão.

Nas versões mais recentes do cloud-init, o cloud-init grava /run/cloud-init/result.json com conteúdo como:

{
 "v1": {
  "datasource": "DataSourceNoCloud [seed=/var/lib/cloud/seed/nocloud-net][dsmode=net]",
  "errors": []
 }
}

Se houver erros, ele terá um valor não vazio na lista errors .

Além disso, como execuções do cloud-init, ele mantém /run/cloud-init/status.json .

Em 17.2, há um subcomando que pode ajudar. cloud-init status --wait permitirá que seus scripts personalizados sejam bloqueados até que o cloud-init seja concluído. Se cloud-init tiver erros, o status sairá diferente de zero. (Obrigado a Chad Smith por essa sugestão).

$ 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
    
por smoser 07.03.2018 / 09:25
0

Além disso, o cloud-init 17.2 adicionou um novo subcomando que pode ajudar:

O status do cloud-init --wait permitirá que seus scripts personalizados sejam bloqueados até que o cloud-init seja concluído.

Um erro cloud-init sairá diferente de zero e seu script poderá reagir a isso.

Aqui está um script cron simples e a entrada é executada em cada inicialização que faria isso para alguém (presumindo que o 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
    
por Chad Smith 07.03.2018 / 16:49