Zabbix: Alertas a Twitter

Zabbix, del que ya hablamos en este blog muchas veces es una excelente herramienta de monitorización que permite muchos tipos de alertas, perfectamente configurables. Dichas alertas se puede enviar al correo, jabber y por sms. Sin embargo, enviarlas al teléfono móvil es más complicado y tiene un coste adicional (coste del sms). Es por ello que aprovechando la tecnología actual escribí un pequeño script que permite el envío de dichas alertas como un tweet y por lo tnato, desde un smartphone móvil lo podrías consultar.
A continuación, vamos a explicar cómo configurar de forma sencilla las alertas en Zabbix para enviarlas a Twitter.
  1. Instalar el módulo python de envío a Twitter
    Para enviar las alertas a Twitter usaremos la librería tweepy, escrita en python. Para descargarla, desde github se puede hacer perfectamente.
    shell> apt-get install python-setuptools
    shell> git clone git://github.com/tweepy/tweepy.git
    shell> cd tweepy
    shell> python setup.py install
    
  2. Crear y configurar la cuenta de Twitter
    Ahora toca crear la nueva cuenta de Twitter. Vamos a su web oficial y se crea una nueva cuenta.
    Yo aquí personalmente prefiero dejar la cuenta cerrada, ya que serán tweet's con información que sólo a determinada gente le puede interesar. Se crea la cuenta y sólo se permite que la gente autorizada lo sigua.
    Desde hace algún tiempo, la API de Twitter sólo permite comunicarse con ella usando claves de aplicación, lo que se conoce como autenticación oauth, por lo tanto hay que dar de alta ahí una nueva aplicación. Se puede hacer desde aquí (dev.twitter.com/apps) y sólo hay que dar de alta una nueva aplicación que tenga permisos para escribir en el TimeLine. Lo que nos interesa de estos datos son únicamente las claves, pública y secreta y las claves de aplicación, que se usarán en el siguiente punto.
  3. Script de alerta
    Llegados a este punto, está ya instalada la librería de envío de datos a Twitter y también tenemos las claves para poder enviar información a la cuenta desde una aplicación, por lo tanto, sólo queda realizar un pequeño script al que se le envíe información y éste la convierta en un tweet. El código necesario para hacerlo será el que sigue, que se guardará en /etc/zabbix/alert.d/twitter.py
    #!/usr/bin/python
    
    import sys
    import tweepy
    
    CONSUMER_KEY = 'RZ5Xxxxxxxxxxxxxxxxxxx'
    CONSUMER_SECRET = '35YRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ACCESS_KEY = '4610xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ACCESS_SECRET = 'SoBexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
    api = tweepy.API(auth)
    api.update_status(sys.argv[2])
    
    La explicación del código es sencilla. Se importan las librerías y a continuación se ponen las claves que obtuvimos del punto anterior, que serán las que permitan autenticar a nuestra aplicación en Twitter y así enviar las alertas. A continuación se realizar la atutenticación y si todo está correcto, se actualiza el estado del tweet, es decir, se hace una nueva publicación con el segundo parámetro que se le pasa al script.
    Zabbix, al generar la alerta envía dos campos, el primero una dirección de correo o jabber y el segundo el contenido del mensaje (esto, obviamente es modificable). Puesto que no nos interesa saber el usuario que generó la alerta, sino únicamente la alerta, se coge el segundo parámetro, sys.argv[2].
    Nota: Hay que dar permisos de ejecución al script, para ello, chmod +x twitter.py
  4. Configurar zabbix
  5. Ahora que ya tenemos todo listo, únicamente falta crear un nuevo medio para que responda ante una alerta y configurar el tipo de alertas.
    1. Crear un nuevo medio
      Vamos a: "Administration/Media types/Create Media Type"
    2. Configurar alertas para un usuario
      Vamos a: "Administration/Users/Users".
      Elegimos un usuario y le añadimos el nuevo medio que acabamos de crear.
    3. Creamos una nueva acción
      En "Configuration/Actions" -> Create Action.
      Los datos a configurar en Action:
      • Name: Twitter
      • Event source: triggers
      • Default subject: "{TRIGGER.STATUS}: {TRIGGER.NAME}"
      Los datos a configurar en Action conditions:
      • Trigger severity >= "Average", para que sólo se envíen alertas que se consideren importantes. Si se quieren recibir todas, no poner ninguna condición.
      Los datos a configurar en Action operations:
      • Operation type: Send message
      • Send message to: Single User
      • Send only to: Tweet
      • Default message: Check.
    4. Comprobaciones
      A partir de este momento, cualquier alerta que salte y coincida con la condición de la alerta ahora configurada se enviará al Twitter.
      Si vamos a "Administration/Notifications", podremos ver la cantidad de mensajes enviados.
      Si vamos a Twitter, también se podrá ver cómo efectivamente llegan los mensajes.


6 comentarios :

  1. Tengo una pregunta... ya que tengo todo esto configurado.. cuando pruebo el script me aparece:
    File "./twitter.py", line 13, in
    api.update_status(sys.argv[2])
    IndexError: list index out of range
    ¿Cómo puedo solucionar esto?

    ResponderEliminar
  2. Es un problema a la hora de pasarle los argumentos. Quizás sólo el estés pasando 1 argumento y por lo tanto tengas que probar con ...(sys.argv[1]).
    Si copiaste el código tal cual, cuando configuras la acción, en Default subject, yo tengo "{TRIGGER.STATUS}: {TRIGGER.NAME}" (comillas incluidas). Así a la hora de llamar al script, el argv[1] es la dirección del medio del usuario (un mail, por ejemplo) y argv[2] el default subject, es decir, el error.

    A ver si así se te soluciona...

    ResponderEliminar
  3. Gracias... pero si le paso 2 valores me muestra:

    Traceback (most recent call last):
    File "./twitter.py", line 13, in
    api.update_status(sys.argv[2])
    File "/usr/lib/python2.5/site-packages/binder.py", line 184, in _call
    return method.execute()
    File "/usr/lib/python2.5/site-packages/binder.py", line 148, in execute
    raise TweepError('Failed to send request: %s' % e)
    tweepy.error.TweepError: Failed to send request: (-2, 'Name or service not known')

    ResponderEliminar
  4. Uff... eso suena a un problema en la instalación de la librería tweepy o un fallo al obtener una respuesta de Twitter.
    Mírate esto a ver si te puede ayudar: http://nullege.com/codes/search/tweepy.error.TweepError

    ResponderEliminar
  5. Bueno javier te informo que a mi si me funciono =). muchas gracias. y pues para los que quieran probarlo desde su terminal.se ejecuta asi

    #/home/zabbix/bin/twitter.py 'algo' 'Este Texto se twittea'

    Nota:
    el zabbix ejecuta de esta manera por lo que vi
    #/home/zabbix/bin/twitter.py 'medio' 'default subject' 'default message'

    en mi caso use el sys.argv[3] que es 'default message'

    ResponderEliminar
  6. Sugestão de alteração no arquivo twitter.py pois não funcionou se não fosse assim




    #!/usr/bin/python

    import sys
    import tweepy

    CONSUMER_KEY = 'RZ5Xxxxxxxxxxxxxxxxxxx'
    CONSUMER_SECRET = '35YRxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ACCESS_KEY = '4610xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    ACCESS_SECRET = 'SoBexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    stats=sys.argv[2]

    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
    api = tweepy.API(auth)
    api.update_status(status=stats)

    ResponderEliminar

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios