Creando scripts para descubrimientos de Zabbix en Linux

por | 31 marzo, 2023

Hacia tiempo que no escribia sobre Zabbix. En este post veremos las bases para poder crear scripts que nos permitan hacer uso de la capacidad de descubrimiento de Zabbix para la necesidad que tengamos

Antes de empezar este posts, hay algunas cosas que tenemos que tener claras

La primera de ellas, son los caracteres que no están permitidos en Zabbix, esta configuración puede ser modificada en el archivo de configuración de Zabbix, sin embargo yo decidí evitar realizar este cambio

Los caracteres son:

"\, ', ", `, *, ?, [, ], {, }, ~, $, !, &, ;, (, ), <, >, |, #, @, 0x0a"

Lo segundo que hay que tener claro es el formato utilizado, el cual es JSON, donde siempre debe existir el siguiente contenido

{
  "data":[
  {...}
  ]
}

Lo que indicaremos en la parte marcada serán los datos que usaremos tanto para identificar el item como su valor, respetando los corchetes de inicio y fin.

Entrando a esta parte es que viene la parte entretenida, cada objeto está conformado por un nombre y su valor separados entre ellos con «:» como por ejemplo

{"nombre":"Maria"}

En el ejemplo anterior definimos un objeto de un solo par nombre/valor, si queremos agregar mas, solo debemos separar con «,» cada uno de los pares de esta forma

{"nombre":"Maria","apellido":"Fernandez"}

Ahora definimos 2 objetos, el primero de ellos es «nombre» y su valor es «Maria» y el segundo es «apellido» con el valor «Fernandez» y si queremos agregar mas basta con continuar agregando comas «,» al final del ultimo valor.

En Zabbix, el nombre se usa tanto para poder filtrar como para definir los nombres finales, como ejemplo usaremos una regla de descubrimiento que viene por defecto y es el descubrimiento de discos mediante la key «vfs.fs.discovery» (en la versión 3.4). Si aplicamos esta key junto con zabbix-get tenemos una salida de este estilo

$ zabbix_get -s 127.0.0.1 -k vfs.fs.discovery
{"data":[{"{#FSNAME}":"/sys","{#FSTYPE}":"sysfs"},{"{#FSNAME}":"/proc","{#FSTYPE}":"proc"},{"{#FSNAME}":"/dev","{#FSTYPE}":"devtmpfs"},{"{#FSNAME}":"/dev/pts","{#FSTYPE}":"devpts"},{"{#FSNAME}":"/run","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/","{#FSTYPE}":"ext4"},{"{#FSNAME}":"/sys/kernel/security","{#FSTYPE}":"securityfs"},{"{#FSNAME}":"/dev/shm","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/run/lock","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/sys/fs/cgroup","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/sys/fs/cgroup/systemd","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/sys/fs/pstore","{#FSTYPE}":"pstore"},{"{#FSNAME}":"/run/docker/netns/58eb60bb0717","{#FSTYPE}":"nsfs"},{"{#FSNAME}":"/run/docker/netns/7d7a25b63faa","{#FSTYPE}":"nsfs"},{"{#FSNAME}":"/run/user/1002","{#FSTYPE}":"tmpfs"}]}

Se ve un poco desordenado, por lo que lo ordenaré utilizando esta página y vemos algo así

{
   "data":[
      {
         "{#FSNAME}":"/sys",
         "{#FSTYPE}":"sysfs"
      },
      {
         "{#FSNAME}":"/proc",
         "{#FSTYPE}":"proc"
      },
      {
         "{#FSNAME}":"/dev",
         "{#FSTYPE}":"devtmpfs"
      },
      {
         "{#FSNAME}":"/dev/pts",
         "{#FSTYPE}":"devpts"
      },
      {
         "{#FSNAME}":"/run",
         "{#FSTYPE}":"tmpfs"
      },
      {
         "{#FSNAME}":"/",
         "{#FSTYPE}":"ext4"
      },
      {
         "{#FSNAME}":"/sys/kernel/security",
         "{#FSTYPE}":"securityfs"
      },
      {
         "{#FSNAME}":"/dev/shm",
         "{#FSTYPE}":"tmpfs"
      },
      {
         "{#FSNAME}":"/run/lock",
         "{#FSTYPE}":"tmpfs"
      },
      {
         "{#FSNAME}":"/sys/fs/cgroup",
         "{#FSTYPE}":"tmpfs"
      },
      {
         "{#FSNAME}":"/sys/fs/cgroup/systemd",
         "{#FSTYPE}":"cgroup"
      },
      {
         "{#FSNAME}":"/sys/fs/pstore",
         "{#FSTYPE}":"pstore"
      },
      {
         "{#FSNAME}":"/run/docker/netns/58eb60bb0717",
         "{#FSTYPE}":"nsfs"
      },
      {
         "{#FSNAME}":"/run/docker/netns/7d7a25b63faa",
         "{#FSTYPE}":"nsfs"
      },
      {
         "{#FSNAME}":"/run/user/1002",
         "{#FSTYPE}":"tmpfs"
      }
   ]
}

Como ven tenemos dos objetos, {#FSNAME} y {#FSTYPE} pudiendo usar cada uno para una labor distinta desde el Zabbix, como pueden ver en esta captura usamos {#FSNAME} para consultar el estado de la partición y además como identificador de la misma

y el objeto {#FSTYPE} lo usamos, en este caso, para filtrar todos los sistema de archivo que no nos sirvan

Todos los objetos se pueden usar tanto como filtro, o como nombre en la descripción o parte de la key

Teniendo claros estos conceptos podemos empezar a trabajar en crear nuestros propios descubrimientos los cuales los podemos realizar con el lenguaje que nos sintamos más a gusto

Pronto publicare un ejemplo práctico utilizando bash, awk y grep. Así que estén atentos al blog

Fuentes:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *