Es muy importante tener nuestros entornos siempre monitorizados por si alguna vez nos ocurre algo que podamos reaccionar frente a posibles problemas. La Monitorización no sólo nos ayuda a adelantarnos a estos problemas cuando vemos la progresión del comportamiento de lo que estamos monitorizando como por ejemplo, aquí un disco se está llenando que la memoria, RAM se esté también llenando y podamos remediarlo antes de que ocurra algo. Sino que también nos permite que cuando un evento. Se produzca, podemos. Podamos de manera automatizada, poner remedio a ello.
Existen muchos programas soluciones de software y demás de pago y opensource que nos permiten empezar a monitorizar nuestro entorno de Proxbox en este caso, vamos a empezar con un ejemplo sencillo, pero muy potente, gracias al script que nuestro amigo tteckster preparó y que dejó el enlace aquí. Pero vamos a darle una vuelta de tuerca y lo vamos a mejorar añadiendo alertas a través de email y Gotify.
¿Qué hace el script?
El script es una maravilla es súper sencillo, no es muy largo y fácil de entender incluso si no tienes mucha experiencia en scripting. Gracias al script que nos ha preparado tteckster, vamos a tener un servicio que va a ejecutar siempre un archivo script escrito en Bash. Este archivo lo que hace es ejecutar continuamente un bucle infinito, que va a comprobar si determinados contenedores o máquinas virtuales que nosotros queramos, estén siempre levantadas están levantadas, de lo contrario, lo que va a hacer el script es, automáticamente intentar levantarlas para nosotros.
Todo eso está muy bien, pero tiene un pequeño fallo por así decirlo y, es que el fallo es que no somos conscientes de que está pasando en nuestro entorno hasta que nos metemos y miramos logs y vemos qué pasa así. En No sólo hacking hemos decidido mejorar este pedazo de script añadiendo notificaciones a través de correo, y por Gotify.
Requisitos
Necesitamos tener las alertas configuradas en Proxmox y un entorno de Gotify levantado. Si no lo has hecho te dejo los dos enlaces con la documentación para poder tenerlo listo.
Una vez lo tienes debes seguir el vídeo de abajo con la explicación y proceso.
Script
# #!/usr/bin/env bash
# Read excluded instances from command line arguments
excluded_instances=("$@")
echo "Excluded instances: ${excluded_instances[@]}"
nodo=$(hostname)
#Plantilla Push Gotify
TITLE="Alerta Proxmox: VM/CT no está corriendo"
#MESSAGE="Hola El contenedor o VM $instance no está ejecutándose, procedo a intentar levantarlo "
PRIORITY=5
#Modifica en la siguiente línea los datos de tu servidor Gotify
URL="http://IPDeTuGotify:PUERTO/message?token=AwE3Y2HVUZuSZjk"
#Pon abjo el token que as creado en Gotify entre comillas
token="Token"
while true; do
for instance in $(pct list | awk '{if(NR>1) print $1}'; qm list | awk '{if(NR>1) print $1}'); do
# Skip excluded instances
if [[ " ${excluded_instances[@]} " =~ " ${instance} " ]]; then
echo "Skipping $instance because it is excluded"
continue
fi
# Determine the type of the instance (container or virtual machine)
if pct status $instance >/dev/null 2>&1; then
# It is a container
config_cmd="pct config"
IP=$(pct exec $instance ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
else
# It is a virtual machine
config_cmd="qm config"
IP=$(qm guest cmd $instance network-get-interfaces | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -E "192\.|10\." | head -n 1)
fi
# Skip instances based on onboot and templates
onboot=$($config_cmd $instance | grep -q "onboot: 0" || ( ! $config_cmd $instance | grep -q "onboot" ) && echo "true" || echo "false")
template=$($config_cmd $instance | grep template | grep -q "template:" && echo "true" || echo "false")
if [ "$onboot" == "true" ]; then
echo "Skipping $instance because it is set not to boot"
continue
elif [ "$template" == "true" ]; then
echo "Skipping $instance because it is a template"
continue
fi
# Ping the instance
if ! ping -c 1 $IP >/dev/null 2>&1; then
# If the instance can not be pinged, stop and start it
if pct status $instance >/dev/null 2>&1; then
# It is a container
echo "$(date): CT $instance is not responding, restarting..."
pct stop $instance >/dev/null 2>&1
sleep 5
pct start $instance >/dev/null 2>&1
ct_nombre=$( pct list | grep $instance | awk '{print $3}')
MESSAGE="El contenedor con ID: $instance y Nombre: $ct_nombre en el Nodo: $nodo no está ejecutándose, procedo a intentar levantarlo "
curl -s -S --data '{"message": "'"${MESSAGE}"'", "title": "'"${TITLE}"'", "priority":'"${PRIORITY}"', "extras": {"client::display": {"contentType": "text/markdown"}}}' -H 'Content-Type: application/json' "$URL"
EMAIL="Querido Sysadmin, el contenedor $ct_nombre en el nodo '$nodo' no está corriendo. Voy a intentar levantarlo.Atentamente. Tu script de monitoreo"
echo $EMAIL | mail -s "Alerta Proxmox: VM/CT no está corriendo" carlos@nosolohacking.info
else
# It is a virtual machine
if qm status $instance | grep -q "status: running"; then
echo "$(date): VM $instance is not responding, restarting..."
qm stop $instance >/dev/null 2>&1
sleep 5
else
echo "$(date): VM $instance is not running, starting..."
fi
qm start $instance >/dev/null 2>&1
vm_nombre=$( qm list | grep $instance | awk '{print $2}')
MESSAGE="La máquina virtual con ID: $instance y Nombre: $vm_nombre en el Nodo: $nodo no está ejecutándose, procedo a intentar levantarla "
curl -s -S --data '{"message": "'"${MESSAGE}"'", "title": "'"${TITLE}"'", "priority":'"${PRIORITY}"', "extras": {"client::display": {"contentType": "text/markdown"}}}' -H 'Content-Type: application/json' "$URL"
EMAIL="Querido Sysadmin, el contenedor $vm_nombre en el nodo '$nodo' no está corriendo. Voy a intentar levantarlo.Atentamente. Tu script de monitoreo"
echo $EMAIL | mail -s "Alerta Proxmox: VM/CT no está corriendo" carlos@nosolohacking.info
fi
fi
done
# Wait for 5 minutes. (Edit to your needs)
echo "$(date): Pausing for 5 minutes..."
sleep 8
done >/var/log/ping-instances.log 2>&1