30/10/14

Check Network Device: plugin Nagios para chequear recursos en dispositivos de red

Desde hace un tiempo vengo trabajando en un plugin para Nagios que me permita chequear recursos básicos de dispositivos de red. Me focalicé en el monitoreo de dispositivos Cisco, con los cuales trabajo a diario y es mi principal interés, pero la idea es que soporte diversos dispositivos en el futuro.

El plugin permite chequear los siguientes recursos:
  • Carga de CPU
  • Temperaturas
  • Estados de los FANs
  • Uso de Memoria
  • Estado de interfaces de red (up/down)
  • Ancho de banda (input y output) en interfaces de red
Además de chequear el estado (con umbrales warning y critical), también retorna información contabilizable para poder graficar los resultados con PNP4Nagios u otros plugins. Los valores posibles de graficar son carga de CPU, memoria, temperatura y ancho de banda de las interfaces.

El monitoreo se realiza por SNMP, por lo cual este protocolo debe estar activo en los dispositivos y aceptar conexiones desde el servidor Nagios. Además, el script utiliza la versión en python de la librería Net-SNMP, la cual se encuentra en los siguientes paquetes:
  • python-netsnmp // debian
  • net-snmp-python // Red Hat
Actualmente el proyecto se encuentra en Launchpad y pueden descargar la última versión desde la siguiente dirección: https://launchpad.net/check-net-device/+download


Opciones

Se proveen varias opciones que pueden resultar abrumantes al principio, pero una vez que se entienden, no son complicadas..

El uso de check_net_device es el siguiente:
check_net_device -H <ip_address> -C <community> <-t -t device_type | -i interface_ID> [-o check_option] [-w warning] [-c critical] [-P log_path]
donde las opciones obligatorias son:
  • -H; --host <ip_address>:  es la IP del host a chequear.
  • -C; --community <community>: comunidad SNMP definida en el dispositivo.
  • -t; --type <device_type>: tipo de dipositivo a chequear. Los valores permitidos en la versión 0.4 son cisco y bc (de BlueCoat), pero sólo cisco está implementado.
  • -i; --interface <interface_id>: se utiliza para chequear estado de interfaces y anchos de banda. El ID dado por el fabricante a la interfaz que se desea chequear. El ID de la interfaz se puede encontrar consultando el OID 1.3.6.1.2.1.31.1.1.1.1 (ifName) con snmpwalk, y sólo la última parte del OID se necesita como parámetro. Ejemplo: snmpwalk -v2c -c <community> <host ip> 1.3.6.1.2.1.31.1.1.1.1
  • -o; --option <check_option>: especifica el recurso a chequear. 
  • Las opciones disponibles son con el argumento -t son:
    • env: check environmental status. On Cisco it includes temperatures and fan status.
    • cpu: check status and return CPU load.
    • memory: check memory status, and return percentage usage.
    Con el argumento -i, las opciones disponibles son:
    • ifstatus: check the interface status, returning OK or DOWN.
    • ifbw: check input/output bandwidth and return usage.
  • -w; --warning <value>: umbral para reportar un warning. Dependiendo del tipo de chequeo, puede ser un porcentaje o un número.
  • -c; --critical <value>: umbral para reportar un estado crítico. Dependiendo del tipo de chequeo, puede ser un porcentaje o un número.
  • -P; --log-path <path to dir>: necesario para utilizar la opción "-i <interface id> -o ifbw", dado que esta opción necesita un directorio donde guardar los valores de ancho de banda leídos. El usuario que ejecute este comando (usualmente llamado nagios) necesita permiso de escritura en el directorio especificado.
Nota:
  • -t y -i no se usan al mismo tiempo, dado que los chequeos de interfaces son independientes del tipo de dispositivo. Esta opción se puede utililizar para chequear cualquier tipo de dispositivo.
  • -w y -c son opcionales, dado que el script posee valores ya definidos para estados de warning y critical.

Ejemplos

Uso de CPU:
$ ./check_net_device.py -C public -H 192.168.0.1 -t cisco -o cpu
OK -  CPU Load: 1% | 'CPU Load'=1%;60;80
Ancho de banda:
$ ./check_net_device.py -C public -H 192.168.0.1 -i 2 -o ifbw -P /tmp/
OK -  In: 1.08 Mb/s, Out: 1.49 Mb/s | 'In'=1129850B;629145600;83886080  'Out'=1561893B;629145600;83886080
Estado de interfaces:
$ ./check_net_device.py -C public -H 192.168.0.1 -i 2,3,4,6
OK -  All Interfaces UP | Gi1/1: Up, Gi1/2: Up, Fa2/1: Up, Fa2/3: Up

Ejemplos de gráficos con PNP4Nagios, a partir de valores retornados por check_net_device:

Ancho de banda:


Carga de CPU:




Otro Plugin?

Alguno seguramente dirá, ya existen plugins para monitorear equipos de red. Pues si, pero desarrollé este script por tres grandes razones:
  • No encontré ningún plugin que realice todo esto junto:
    • Chequeo de estado de CPU, memoria, interfaces, ancho de banda, temperatura y fans.
    • Entrega de información de performance para poder graficar los valores obtenidos.
    • Sirva para múltiples dispositivos. Los que chequean múltiples tipos de dispositivos, no permiten muchos tipos de chequeos (por ejemplo check_snmp_environment).
  • Los plugins que vi están todos escritos en perl, y si bien perl me parece un lenguaje fantástico, se me hace difícil de seguir, con lo cual, me dificulta la posibilidad de agregar funcionalidad a scripts existentes. Creo que un script en python facilitará que muchos lo extiendan, ya que python es más fácil de aprender.
  • Me gusta programar =)
Espero que les sea útil. Si encuentran errores, por favor reportar, trataré de solucionarlos lo más rápido posible.

16 comentarios:

  1. Como se utiliza en el nagios

    ResponderEliminar
  2. Tenes que definir un comando en la configuración de Nagios que utilice el script check_net_device.py, luego un servicio que utilice ese comando y finalmente asignar el servicio a un host o un hostgroup. En el readme que trae el tar.gz hay más información.

    ResponderEliminar
  3. Me da este error (No output on stdout) stderr: Traceback (most recent call last):
    File "/usr/local/nagios/libexec/check_net_device.py", line 22, in
    import netsnmp
    ImportError: No module named netsnmp

    ResponderEliminar
  4. Es que te falta la librería netsnmp. Fijate que tenes q instalar esa librería para python. Los paquetes son:
    python-netsnmp // debian
    net-snmp-python // Red Hat

    ResponderEliminar
  5. Lo tengo instalado en ubuntu 14.04 instale snmp pero net-snmp-python no se. La verdad soy nuevo en esto no tengo mucha idea. Gracias

    ResponderEliminar
  6. Ahora me da esto. Creo que consegui instalar python-netsnmp y ahora me dice esto Return code of 127 is out of bounds - plugin may be missing)

    ResponderEliminar
  7. Cómo lo estás ejecutando? Probaste ejecutarlo desde consola y ver si así anda?

    ResponderEliminar
  8. Eso me sale en el propio nagios en la consola no tengo muy claro como ejecutarlo pues he probado varias opciones sin resultados positivos pero no tengo la certeza de hscerlo bien

    ResponderEliminar
  9. root@A200:/home/net# /usr/local/nagios/libexec/check_net_device.py -H 127.1.1.1 -C xxxxxxxxx -i 1
    /etc/snmp/snmp.conf: line 2: Warning: Unknown token: com2sec.
    /etc/snmp/snmp.conf: line 11: Warning: Unknown token: group.
    /etc/snmp/snmp.conf: line 14: Warning: Unknown token: view.
    /etc/snmp/snmp.conf: line 17: Warning: Unknown token: access.
    /etc/snmp/snmp.conf: line 19: Warning: Unknown token: syslocation.
    /etc/snmp/snmp.conf: line 20: Warning: Unknown token: syscontact.
    UNKNOWN - Error: could not get informati |

    ResponderEliminar
  10. Si usas snmpwalk también te da error? tipo ejecutar $snmpwalk -v2c -c XXXXX 127.1.1.1 1.3.6.1.2.1.31.1.1.1.1

    ResponderEliminar
  11. me da exactamente el mismo error

    ResponderEliminar
  12. Buenos Dias :

    Este plugin se me hace muy interesante en cuestion de que puedes monitorear varias cosas con un solo plugin , solo tengo una cuestion , este plugin solo esta enfocado para cisco y bluecoat ??

    La cuestion es porque en mi infraestructura cuento con servidores linux , windows , virtuales , firewalls , etc , etc ....

    y al hacel el test me sale lo siguiente :

    /usr/local/nagios/libexec# ./check_net_device.py -H 192.168.13.24 -C monitor -t windows -o cpu
    Device type must be one of: cisco | bluecoat

    El de las interfaces funciona bien , solamente para identificar si esta arriba porque si quiero el ancho de banda me manda un error :

    /usr/local/nagios/libexec# ./check_net_device.py -H 192.168.13.24 -C monitor -i 6,7
    OK - All Interfaces UP | ethernet_0: Up, ethernet_1: Up

    /usr/local/nagios/libexec# ./check_net_device.py -H 192.168.13.24 -C monitor -i 6,7 -o ifbw -P /temp
    [Errno 2] No such file or directory: '/temp/192.168.13.24_6,7.log'

    Se podra utilizar para otros servidores ???



    ResponderEliminar
  13. Hola,
    el plugin lo desarrollé más que nada para monitorear dispositivos Cisco que es en lo que se centra. Lo que podes monitorear en otros sistemas es si las interfaces están levantadas y el ancho de banda.
    Para monitorear el ancho de banda el script necesita tener permiso de escritura en el directorio que le pasas por parámetro. Además, deberías pasarle de a una interfaz a la vez. Es decir, ejecutá por separado el comando para las interfaces 6 y 7, ya que al ver una coma, el script está intentando crear un archivo de nombre "192.168.13.24_6,7.log", que incluye una coma, y el sistema operativo no lo permite, por eso da que no encuentra el archivo. Se podría mejorar el script para poder poner en un sólo parámetro dos interfaces, pero vengo algo corto de tiempo :S
    Tené en cuenta que para medir el ancho de banda, el script debe ser ejecutado por lo menos dos veces, ya que la primera vez no tendrá datos previos de la interfaz, y el cálculo lo realiza en base a la diferencia de bytes transmitidos entre una ejecución y otra del script.

    ResponderEliminar
  14. hola

    me sale error de syntaxsis

    DEVICE_TYPE = {'cisc0`, 'bluecoat'}

    cual seria el problema?

    ResponderEliminar
  15. Parece que no está tomando bien el 'cisco', fijage cómo está esa línea en el código. Hace mucho que no toco el código, pero me resulta raro el error.

    ResponderEliminar
  16. Fabuloso plugin, gracias por el aporte, alguna actualización con nuevas funcionalidades.?. Saludos

    ResponderEliminar