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.

Notificaciones con Gotify

Alertas por SMT desde proxmox

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 ![](https://pbs.twimg.com/profile_images/1251535255502192642/zEsDfQMf_400x400.jpg)"
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 ![](https://pbs.twimg.com/profile_images/1251535255502192642/zEsDfQMf_400x400.jpg)"
        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 ![](https://pbs.twimg.com/profile_images/1251535255502192642/zEsDfQMf_400x400.jpg)"
        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

Vídeo

error: ooops!