Monitoreo Zabbix de Jobs y Procesos del Bacula

Esto es un fork de un proyecto del GIT con algunas reparaciones. Compruebe posibles actualizaciones: https://github.com/germanodlf/bacula-zabbix

Este proyecto consta de un shell script que recoge información del servidor de Bacula, envía al servidor Zabbix a través de su cliente (Zabbix sender), y una plantilla que se instala en el servidor de supervisión.

Características

  • Monitoreo individual para cada trabajo de copia de seguridad
  • Diferentes niveles de trabajo tienen diferentes gradades
  • Monitoreo de los procesos del Director, Storage y Cliente del Bacula
  • Gráficos y dashboards
  • Funciona con Catálogos de Bacula en PostgreSQL y MySQL

Datos Recopilados por el Script

  • Estado de finalización del trabajo (elemento OK)
  • Número de bytes transferidos (elemento Bytes)
  • Número de archivos transferidos (elemento Files)
  • Duración (elemento Time)
  • Tasa de transferencia (elemento Speed)
  • Tasa de compresión (elemento Compression)

Datos de los Procesos del Bacula

  • Estado del proceso del Bacula Director. El nombre del proceso es definido por la variable {$BACULA.DIR} y tiene su valor predeterminado como ‘bacula-dir’. Este elemento debe estar deshabilitado en hosts que sólo son clientes de Bacula.
  • Estado del Storage Daemon. El nombre del proceso es definido por la variable {$BACULA.SD} y tiene su valor predeterminado como ‘bacula-sd’. Este elemento debe estar deshabilitado en hosts que sólo son clientes de Bacula.
  • Estado del File Daemon. El nombre del proceso es definido por la variable {$BACULA.FD} y tiene su valor predeterminado como ‘bacula-fd’.

Disparadores (Triggers)

  • El daemon del Bacula está DOWN en {HOST.NAME}: Inicia una alerta de gravedad del desastre cuando el proceso del Bacula está parado
  • Copia de seguridad completa FAIL en {HOST.NAME}: inicia una alerta de alta gravedad cuando una tarea de copia de seguridad completa falla
  • Copia de seguridad diferencial FAIL en {HOST.NAME}: inicia una alerta de gravedad media cuando una tarea de copia de seguridad diferencial falla
  • Copia de seguridad incremental de FAIL en {HOST.NAME}: inicia una alerta de gravedad de advertencia cuando una tarea de copia de seguridad incremental falla

Configuración

Template Zabbix

Descargue el template xml (zip) e importe a su servidor Zabbix.

Continúe con la instalación del script en las máquinas con Bacula a continuación. Posteriormente, el modelo de Zabbix debe proporcionarse a cada uno de estos hosts. Cada host configurado en Zabbix con esta plantilla vinculada debe tener su nombre igual al nombre configurado en el recurso de cliente de Bacula. De lo contrario, los datos recogidos por la secuencia de comandos bash no serán recibidos por el servidor Zabbix.

Script Zabbix Servidor Bacula

Instale Zabbix Sender y el Agent. Ejemplo para CentOS 7:

rpm -Uivh https://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-sender-3.0.22-1.el7.x86_64.rpm
rpm -Uivh https://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.22-1.el7.x86_64.rpm
systemctl enable zabbix-agent

Modifique la configuración del agente Zabbix necesario como dirección del servidor, puerto y host de la máquina del agente, si no es necesario. Reinicie el servicio para aplicar los cambios:

vi /etc/zabbix/zabbix_agentd.conf
...
Server=192.168.0.50
ListenPort=10051
...
:x!

service zabbix-agent restart

Cree el archivo de configuración /opt/bacula/etc/bacula-zabbix.conf con el siguiente contenido. Modifique con la información de su entorno:

### BACULA CONFIG ###

# IP address or FQDN of database server
baculaDbAddr='127.0.0.1'

# TCP port of database server
baculaDbPort='5432'

# Name of the database used by Bacula
baculaDbName='bacula'

# User used by Bacula on it's database
baculaDbUser='bacula'

# Password used by Bacula on it's database
baculaDbPass=''

### ZABBIX CONFIG ###

# IP address or FQDN of Zabbix server
zabbixSrvAddr='192.168.37.200'

# TCP port of Zabbix server
zabbixSrvPort='10051'

# Path to zabbix_sender command
zabbixSender='/usr/bin/zabbix_sender'

Proporcione permisos al usuario Bacula al archivo .conf creado.

chown root:bacula /opt/bacula/etc/bacula-zabbix.conf
chmod 640 /opt/bacula/etc/bacula-zabbix.conf

Cree el archivo de script bash /opt/bacula/scripts/bacula-zabbix.bash, con el contenido que sigue. Para Catálogo PostgreSQL:

#!/bin/bash
#
# For PGSQL

# Import configuration file
source /opt/bacula/etc/bacula-zabbix.conf

sql="/usr/bin/psql -qtAX -h$baculaDbAddr -p$baculaDbPort -U$baculaDbUser -d$baculaDbName -c"
# With Password
# sql="PGPASSWORD=$baculaDbPass /usr/bin/psql -qtAX -h$baculaDbAddr -p$baculaDbPort -U$baculaDbUser -d$baculaDbName -c"

# Get Job ID from parameter
baculaJobId="$1"
if [ -z $baculaJobId ] ; then exit 3 ; fi

# Test if zabbix_sender exists and execute permission is granted, if not, exit
if [ ! -x $zabbixSender ] ; then exit 5 ; fi

# Get Job type from database, then if it is a backup job, proceed, if not, exit
baculaJobType=$($sql "select Type from Job where JobId=$baculaJobId;" 2>/dev/null)
if [ "$baculaJobType" != "B" ] ; then exit 9 ; fi

# Get Job level from database and classify it as Full, Differential, or Incremental
baculaJobLevel=$($sql "select Level from Job where JobId=$baculaJobId;" 2>/dev/null)
case $baculaJobLevel in
  'F') level='full' ;;
  'D') level='diff' ;;
  'I') level='incr' ;;
  *)   exit 11 ;;
esac

# Get Job exit status from database and classify it as OK, OK with warnings, or Fail
baculaJobStatus=$($sql "select JobStatus from Job where JobId=$baculaJobId;" 2>/dev/null)
if [ -z $baculaJobStatus ] ; then exit 13 ; fi
case $baculaJobStatus in
  "T") status=0 ;;
  "W") status=1 ;;
  *)   status=2 ;;
esac

# Get client's name from database
baculaClientName=$($sql "select Client.Name from Client,Job where Job.ClientId=Client.ClientId and Job.JobId=$baculaJobId;" 2>/dev/null)
if [ -z $baculaClientName ] ; then exit 15 ; fi

# Initialize return as zero
return=0

# Send Job exit status to Zabbix server
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.status" -o $status >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+1)) ; fi

# Get from database the number of bytes transferred by the Job and send it to Zabbix server
baculaJobBytes=$($sql "select JobBytes from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.bytes" -o $baculaJobBytes >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+2)) ; fi

# Get from database the number of files transferred by the Job and send it to Zabbix server
baculaJobFiles=$($sql "select JobFiles from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.files" -o $baculaJobFiles >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+4)) ; fi

# Get from database the time spent by the Job and send it to Zabbix server
baculaJobTime=$($sql "select round(cast( float8 (EXTRACT(EPOCH FROM EndTime-StartTime)) as numeric)) from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.time" -o $baculaJobTime >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+8)) ; fi

# Get Job speed from database and send it to Zabbix server
baculaJobSpeed=$($sql "select case when EXTRACT(EPOCH FROM EndTime-StartTime) <= 0 then 0 else round(cast( float8 (JobBytes/EXTRACT(EPOCH FROM EndTime-StartTime)/1024) as numeric),2) end from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.speed" -o $baculaJobSpeed >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+16)) ; fi

# Get Job compression rate from database and send it to Zabbix server
baculaJobCompr=$($sql "select round(1-JobBytes/ReadBytes,2) from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.compr" -o $baculaJobCompr >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+32)) ; fi

# Exit with return status
exit $return

Para Catálogo MySQL:

#!/bin/bash
#
# For MYSQL

# Import configuration file
source /opt/bacula/etc/bacula-zabbix.conf

sql="/usr/bin/mysql -NB -h$baculaDbAddr -P$baculaDbPort -u$baculaDbUser -p$baculaDbPass -D$baculaDbName -e"

# Get Job type from database, then if it is a backup job, proceed, if not, exit
baculaJobType=$($sql "select Type from Job where JobId=$baculaJobId;" 2>/dev/null)
if [ "$baculaJobType" != "B" ] ; then exit 9 ; fi

# Get Job level from database and classify it as Full, Differential, or Incremental
baculaJobLevel=$($sql "select Level from Job where JobId=$baculaJobId;" 2>/dev/null)
case $baculaJobLevel in
  'F') level='full' ;;
  'D') level='diff' ;;
  'I') level='incr' ;;
  *)   exit 11 ;;
esac

# Get Job exit status from database and classify it as OK, OK with warnings, or Fail
baculaJobStatus=$($sql "select JobStatus from Job where JobId=$baculaJobId;" 2>/dev/null)
if [ -z $baculaJobStatus ] ; then exit 13 ; fi
case $baculaJobStatus in
  "T") status=0 ;;
  "W") status=1 ;;
  *)   status=2 ;;
esac

# Get client's name from database
baculaClientName=$($sql "select Client.Name from Client,Job where Job.ClientId=Client.ClientId and Job.JobId=$baculaJobId;" 2>/dev/null)
if [ -z $baculaClientName ] ; then exit 15 ; fi

# Initialize return as zero
return=0

# Send Job exit status to Zabbix server
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.status" -o $status >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+1)) ; fi

# Get from database the number of bytes transferred by the Job and send it to Zabbix server
baculaJobBytes=$($sql "select JobBytes from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.bytes" -o $baculaJobBytes >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+2)) ; fi

# Get from database the number of files transferred by the Job and send it to Zabbix server
baculaJobFiles=$($sql "select JobFiles from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.files" -o $baculaJobFiles >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+4)) ; fi

# Get from database the time spent by the Job and send it to Zabbix server
baculaJobTime=$($sql "select timestampdiff(second,StartTime,EndTime) from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.time" -o $baculaJobTime >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+8)) ; fi

# Get Job speed from database and send it to Zabbix server
baculaJobSpeed=$($sql "select round(JobBytes/timestampdiff(second,StartTime,EndTime)/1024,2) from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.speed" -o $baculaJobSpeed >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+16)) ; fi

# Get Job compression rate from database and send it to Zabbix server
baculaJobCompr=$($sql "select round(1-JobBytes/ReadBytes,2) from Job where JobId=$baculaJobId;" 2>/dev/null)
$zabbixSender -z $zabbixSrvAddr -p $zabbixSrvPort -s $baculaClientName -k "bacula.$level.job.compr" -o $baculaJobCompr >/dev/null 2>&1
if [ $? -ne 0 ] ; then return=$(($return+32)) ; fi

# Exit with return status
exit $return

Reinicie el servicio del Director.

service bacula-dir restart

Monitoreo de los Clientes Bacula

Edite sus hosts que configuran tareas de copia de seguridad para usar la plantilla de Zabbix. No olvide deshabilitar en los hosts que son sólo clientes de Bacula los elementos que chequean los procesos del Bacula Director y Storage y de usar el nombre del Host en la consola de Zabbix igual al nombre de los Clientes configurados en el Bacula, como en el ejemplo (Client Name BKP01 -fd):

Monitoreo Zabbix de Jobs y Procesos del Bacula 1

Puede ejecutar la secuencia de comandos manualmente infor- mando un JobId para pasar la información (por ejemplo, 99) para probar las secuencias de comandos.

/opt/bacula/scripts/bacula-zabbix.bash 99

En caso de problemas, puede ejecutar con la opción sh -x para depurar las consultas al Catálogo del Bacula.

sh -x /opt/bacula/scripts/bacula-zabbix.bash 110

# Queries will appear. Try one.

/usr/bin/zabbix_sender -z 192.168.0.50 -p 10051 -s BKP01-fd -k bacula.diff.job.speed -o 137.89
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000070"
sent: 1; skipped: 0; total: 1

Agregar en el JobDefs del Bacula una configuración para siempre ejecutar los clientes después de todo el trabajo de copia de seguridad terminado, pasando el JobId del mismo:

ClientRunAfterJob=/opt/bacula/scripts/bacula-zabbix.bash %i

Screenshots

Monitoreo Zabbix de Jobs y Procesos del Bacula 2 Monitoreo Zabbix de Jobs y Procesos del Bacula 3 Monitoreo Zabbix de Jobs y Procesos del Bacula 4

 

Disponível em: pt-brPortuguês (Portugués, Brasil)enEnglish (Inglés)esEspañol

Deja una respuesta