Advertising:

Zabbix de 0 a 100: Difference between revisions

From Zabbix-ES
Jump to navigation Jump to search
(Blanked the page)
Tag: Blanking
 
(13 intermediate revisions by the same user not shown)
Line 1: Line 1:
=Seccion=
==Introducción==
===Presentación===
Mi nombre es Mariano Obarrio Miles, soy Lic. en Informática y desde hace varios años estoy trabajando con Zabbix, cuento con las certificaciones de Zabbix Certified Professional y Expert.
Actualmente trabajo como Administrador de sistemas y soy responsable de la administración y monitorización de toda la infraestructura Hardware y Software en mi actual trabajo.


[[File:Perfil.png|200px||left]]
'''Nombre  :''' '''Mariano J. Obarrio Miles'''
'''Estudios:''' Licenciado en Informática
          Universidad Argentina de la Empresa
          Zabbix Certified Professional
          Zabbix Certified Specialist
'''LinkedIn:''' https://www.linkedin.com/in/mobarrio
'''Twitter :''' https://twitter.com/mariano_obarrio
===Objetivo del Curso===
El objetivo de este curso es introducirnos en Zabbix que es una herramienta de monitorizacion de nivel empresarial, esto quiere decir que cumple con los niveles de excelencia que son requeridos dentro de una organización es robusto, flexible y muy fiable.
Al finalizar el curso obtendréis los conocimientos necesarios para poder instalar y administrar Zabbix, conocer su arquitectura y las características que ofrece y explotarlas de la mejor forma posible.
La modalidad del curso es generalmente practica, realizaremos instalaciones, configuraciones y laboratorios donde aplicaremos los conocimientos adquiridos.
===Herramientas necesarias===
Bueno para poder realizar esta formación será necesario contar con conocimientos básicos de Linux, ya que editaremos ficheros o reiniciaremos servicios desde línea de comando, no so preocupeis que todo es muy fácil.
Otro requisito es tener un ordenador con acceso a Internet para poder descargar las imágenes de Vagrant y un cliente ssh tipo Putty o SecureCRT para poder acceder a ellas.
En el siguiente MAPY os muestro la infraestructura que desplegará Vagrant y como nos conectaremos a ella.
[[File:Infraestructura-Vagrant-01.png|600px|thumb|center|MAPY de Infraestructura]]
Trabajaremos con 3 maquinas virtuales que se desplegaran con Vagrant sobre Virtualbox, no es necesario grandes conocimientos de Vagrant o de Virtualbox para poder preparar el entorno, pero si os interesa, hay un curso en OpenWebinars muy bueno y rápido de realizar impartido por '''Alberto Molina''' se llama '''Curso Online de Vagrant'''.
Ahora os explicaré para qué utilizaremos estas máquinas:
  - La primer máquina la utilizaremos para para instalar y configurar Zabbix Server, PostgreSQL y Zabbix Frontend.
  - La segunda la utilizaremos para monitorizarla, hacer pruebas y también probar algunas características avanzadas que comentaremos más adelante como el Auto-Registration.
  - La tercera máquina la utilizaremos para ver como instalar y configurar un Zabbix Proxy.
Aquí debajo os dejo los links para poder poder descargar todo el software necesario:
  - Cliente SSH tipo Putty o SecureCRT (https://www.putty.org/)
  '''Nota:''' Si utilkizmos putty podemos tambien bajarnos el software [http://ttyplus.com/downloads.html TTYPlus]
 
  - Virtualbox + Extension Pack (https://www.virtualbox.org/wiki/Downloads)
    '''Nota:''' Importante Virtualbox no funciona si tenemos habilitada la característica de windows de Hyper-V, hay que deshabilitarla.
    '''Nota: La última versión de Vagrant 2.2.6 al momento del curso solo funciona con VirtualBox 5.2.36 (released January 14 2020)
 
  - Vagrant  (https://www.vagrantup.com/downloads.html)
===Descarga material necesario===
[https://www.putty.org/ Download Putty]
[https://www.vagrantup.com/downloads.html Download Vagrant]
'''- Ficheros de Vagrant para crear la infraestructura'''
# git clone https://bitbucket.org/mobarrio/zabbix-infraestructure.git
=Seccion=
==Despliegue y Conectividad==
===Despliegue de la infraestructura===
Clonaremos el repositorio desde BitBucket para poder crear la infraestructura.
# git clone https://bitbucket.org/mobarrio/zabbix-infraestructure.git
  '''- Vagrantfile'''        <- Vagrantfile con los datos necesarios para el despliegue de la infraestructura.
  '''- provisioning.sh'''    <- Archivo para provisionar las máquinas virtuales.
  '''- Vagrant-Help.txt'''    <- Pequeña ayuda con comandos de Vagrant útiles.
  '''- ResponseTimeCURL.sh''' <- Script para tomar tiempos de acceso a una WEB
  '''- update-motd.sh'''      <- Script para personalizar el MOTD 
'''Importante:''' Dentro del Vagrantfile está comentada la definición del plugin para conectarnos a través de un proxy.
Si este es el caso, descomentamos esas líneas y definimos el proxy correctamente.
Bueno vamos a comenzar con el despliegue. Abrimos una terminal con CMD y nos posicionamos en el directorio donde estén los ficheros.
'''D:\>cd zabbix-infraestructure'''
[[File:CEV01.png|420px|thumb|center]]
- Ejecutamos el comando '''vagrant up''' para desplegar el entorno del curso.
'''D:\Temp\Curso-Zabbix-Vagrantfiles>vagrant up'''
[[File:CEV02.png|420px|thumb|center]]
===Configurar la conexión al entorno===
====Vía Vagrant====
C:> vagrant ssh zbxsrv01
C:> vagrant ssh zbxclient01
====Vía Putty====
[[File:Ow_putty01.png|800px|thumb|center|Configuramos la conexión con el Zabbix Server]]
[[File:Ow_putty02.png|800px|thumb|center|Configuramos la conexión con un Client Linux]]
[[File:Ow_putty03.png|800px|thumb|center|Aceptamos la clave]]
[[File:Ow_putty04.png|800px|thumb|center|'''Usuario:''' root - '''Password:''' vagrant]]
===Solución de problemas===
====Reset de password en PostgreSQL si la perdimos====
# sudo -u postgres psql zabbix
> ALTER USER zabbix WITH PASSWORD 'Z4bb1x';
====Desactivar Hiper-V para utilizar VirtualBox====
=====Opción vía CMD=====
'''Abrir un CMD como Administrador'''
C:> bcdedit /set hypervisorlaunchtype off
The operation completed successfully.
'''Nota:''' También tiene que estar activo en la BIOS las opciones de virtualizacion ver: '''[https://aketdoy.es/vt-x-is-disabled-al-iniciar-virtual-box-o-vmware-en-windows-10/ VT-x is disabled]'''
'''Nota:''' Para activarlo nuevamente ejecutamos '''bcdedit /set hypervisorlaunchtype auto'''
====Desactivar la Feature SANDBOX de Windows 10 para poder utilizar VirtualBox====
=====Opción vía Powershell=====
'''Desde un PowerShell (Admin)'''
PS C:\windows\system32> Disable-WindowsOptionalFeature –FeatureName "Containers-DisposableClientVM" -Online
'''Nota:''' Para activarlo nuevamente ejecutamos '''Enable-WindowsOptionalFeature –FeatureName "Containers-DisposableClientVM" -All -Online'''
=====Opción vía CMD=====
'''Abrir un CMD como Administrador'''
C:> Dism /online /Disable-Feature /FeatureName:"Containers-DisposableClientVM"
'''Nota:''' Para activarlo nuevamente ejecutamos '''Dism /online /Enable-Feature /FeatureName:"Containers-DisposableClientVM" -All'''
=Seccion=
==Un poco de historia y conceptos generales==
===¿Que es Zabbix?===
Zabbix es una herramienta de software pensada para la empresa y diseñada para monitorizar en tiempo real millones de métricas y recolectar datos de decenas de miles de dispositivos como pueden ser:
[[File:Metric collection.svg|640px|thumb|center|[https://www.zabbix.com/features Fuente Zabbix SIA]]]
  Zabbix es Open Source, no tiene coste ni limite de dispositivos a monitorizar, esta desarrollado principalmente en C y utiliza la licencia GNU GPL version 2.
[[File:Zabbix Professional Services.png|640px|thumb|center|[https://www.zabbix.com/services Zabbix Professional Services]]]
===Un poco de historia antes de ponernos a trabajar===
ZABBIX es un software que fue desarrollado por Alexei Vladishev en el año 1998 y en el año 2001 fue liberado para el publico después de 3 años en el 2004 se obtuvo la primera versión estable. Ya pasaron mas de 15 años y a día de hoy van por la versión 4.4. Con esto podemos decir que es un software muy maduro.
  [[File:History-Wikipedia.png|800px|thumb|center|[https://en.wikipedia.org/wiki/Zabbix Fuente Wikipedia]]]
ZABBIX suele lanzar versiones LTS (Long Term Support) que son todas las terminadas en .0 y versiones intermedias que cuentan con 6 meses de soporte y estas son las versiones .2 y .4. Como comente antes actualmente liberaron la versión 4.4 que es una versión intermedia, se supone que es la anterior a que liberen la versión 5.0 que está prevista para Marzo del 2020.
  [[File:ZBXRoadmap01.png|800px|thumb|center|[https://www.zabbix.com/roadmap Road Map]]]
===¿Por qué usar Zabbix?===
- Es flexible, permite interactuar con todo tipo de elementos, a los cuales puede monitorizar vía agentes (multi-plataforma), HTTP, SNMP, JMX, IPMI o con custom scripts.
- Es Open Source y sin coste.
- No tiene límites en los elementos a monitorizar.
- Reduce el OPEX (Costos de operación) ya que con la detección pronta de problemas, el escalado de los mismos o la auto resolución de ellos, minimizamos el impacto reduciendo el tiempo de inactividad en entornos críticos.
- El acceso es vía una interfaz es web desarrollada en PHP.
- Podemos visualizar los datos monitorizados en tiempo real.
===¿Quienes son los usuarios de Zabbix?===
[[File:ZBXUsers01.png|640px|thumb|center|[https://www.zabbix.com/users Customers and Users]]]
=Seccion=
==Instalación del servidor de Zabbix==
===Introducción===
ZABBIX es un software modular, se pueden instalar todos sus componentes en un mismo host o por separado. Como vemos en la diapositiva, la solución consta de tres partes principales, el server, el front y la base de datos, adicionalmente tenemos los proxys y los agentes que dan flexibilidad a la monitorizacion ya que incorporan muchas funciones muy útiles.
[[File:MAPY Zabbix Server.png|1024px|thumb|center|Arquitectura de Zabbix]]
===Requerimientos de Hardware===
Los requerimientos de hardware no son grandes, aunque el mayor impacto es sobre la base de datos. Si procesamos miles de valores por segundo, seguramente necesitaremos buenos discos que puedan soportar la alta carga que esto representa.
[[File:Requeriments.png|640px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/installation/requirements Requerimientos]]]
Ahora que ya sabemos como esta compuesto ZABBIX, procederemos a instalar los diferentes componentes. Comenzando por la Base de Datos.
===Instalación de PostgreSQL y Apache===
ZABBIX Soporta diferentes bases de datos como PostgreSQL, MySQL, Oracle, IBM DB2 y SQLite. Particularmente SQLite se utiliza muy a menudo en la configuración de los Proxys. Otro dato importante es que las instalaciones se reparten casi el 99% entre PostgreSQL y MySQL y el 1% restantes en Oracle y DB2.
En este curso nosotros utilizaremos PostgreSQL como motor de base de datos para nuestra instalación.
Para comenzar, nos conectaremos a la máquina de ZBXSRV01 (IP: 10.0.100.100) via Putty o con Vagrant SSH
[[File:PostgreSQL01.png|1024px|thumb|center|[https://www.postgresql.org/download/linux/redhat Download PostgreSQL para Centos/7]]]
# yum install -y httpd
# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# yum install -y postgresql11 postgresql11-server
# /usr/pgsql-11/bin/postgresql-11-setup initdb
'''# vi /var/lib/pgsql/11/data/pg_hba.conf'''
# TYPE  DATABASE        USER            ADDRESS                METHOD
local  all            all                                    trust '''<-- Actualizamos de PEER a TRUST o MD5'''
host    all            all            127.0.0.1/32            trust
host    all            all            ::1/128                trust
# systemctl enable postgresql-11
# systemctl start postgresql-11
# systemctl status postgresql-11
===Instalación de Zabbix Server===
- yum install zabbix-server-'''XXXX''' - Donde XXXX es la DB a la que utilizará para guardar los datos.
# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
# yum clean all
# yum install -y zabbix-server-pgsql zabbix-agent
# yum install -y centos-release-scl
# vi /etc/yum.repos.d/zabbix.repo
  [zabbix-frontend]
  ...
  enabled=1
  ...
# yum install -y zabbix-web-pgsql-scl zabbix-apache-conf-scl
# sudo -u postgres createuser --pwprompt zabbix
could not change directory to "/root": Permission denied
Enter password for new role: '''Z4bb1x'''
Enter it again: '''Z4bb1x'''
# sudo -u postgres createdb -O zabbix zabbix
# zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbix psql zabbix
Paquetes de SQL necesarios para la instalación de la base de datos
- schema.sql
- images.sql
- data.sql
'''Nota:''' Todos incluidos en create.sql.gz
===Conexión con la BBDD desde Zabbix server===
Al instalar el zabbix server se auto-configuran los siguientes parámetros de la base de datos.
'''# vi /etc/zabbix/zabbix_server.conf'''
DBHost=localhost    '''<---- IP del servidor donde esta la base de datos'''
DBName=zabbix      '''<---- Nombre de la base de datos'''
DBUser=zabbix      '''<---- Nombre del Usuario para conectar con la base de datos'''
DBPassword=Z4bb1x  '''<---- Contraseña del usuario para conectarnos a la base de datos'''
===Configuracion zona Horaria en Zabbix 5.X===
'''# vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf'''
php_value[date.timezone] = Europe/Madrid
===Arranque de Zabbix Server, Zabbix FE, HTTPD (Apache) y PHP-fpm===
# systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
# systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
# systemctl status zabbix-server zabbix-agent httpd rh-php72-php-fpm
=Seccion=
==Configuración del Frontend==
===Introducción===
- Es importante destacar que el Zabbix Frontend ataca directamente a la base de datos con lo cual no necesita que el server esté activo salgo para alguna consulta puntual que solo la puede responder el server como el número de ítems procesados.
Paquetes de SQL necesarios para la instalación de la base de datos
'''- zabbix-web-XXXX - Donde XXXX es la DB a la que conectara'''
===Configuración de la zona horaria===
La infraestructura que utilizamos está configurada con la zona horaria de Europa/Madrid, si vosotros estáis en otra zona horaria, con el comando '''timedatectl list-timezones''' podemos ver todas las zonas horarias disponibles y con el comando '''timedatectl set-timezone''' podemos actualizarla.
# timedatectl list-timezones
# timedatectl set-timezone Europe/Madrid
====Zabbix 5.X====
'''# vi /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf'''
php_value[date.timezone] = Europe/Madrid
====Zabbix 4.X y anteriores====
'''# vi /etc/httpd/conf.d/zabbix.conf'''
#
# Zabbix monitoring system php web frontend
#
Alias /zabbix /usr/share/zabbix
<Directory "/usr/share/zabbix">
    Options FollowSymLinks
    AllowOverride None
    Require all granted
    <IfModule mod_php5.c>
        php_value max_execution_time 300
        php_value memory_limit 128M
        php_value post_max_size 16M
        php_value upload_max_filesize 2M
        php_value max_input_time 300
        php_value max_input_vars 10000
        php_value always_populate_raw_post_data -1
        php_value date.timezone Europe/Madrid    '''<--- Descomentar y actualizar'''
    </IfModule>
</Directory>
<Directory "/usr/share/zabbix/conf">
    Require all denied
</Directory>
<Directory "/usr/share/zabbix/app">
    Require all denied
</Directory>
<Directory "/usr/share/zabbix/include">
    Require all denied
</Directory>
<Directory "/usr/share/zabbix/local">
    Require all denied
</Directory>
===Instalación Gráfica del frontend===
'''En el browser abrir la URL de Zabbix:''' http://10.0.100.100/zabbix  <span style="color:red;font-weight:700;font-size:1.3em;"><-- ATENCION</span>
'''[https://www.zabbix.com/documentation/4.4/manual/installation/install#installing_frontend Parametros de PHP]'''  <span style="color:red;font-weight:700;font-size:1.3em;"><-- ATENCION</span>
Una vez instalado el frontend, este conecta directamente contra la base de datos, ya que algunas consultas las realiza sin necesidad de pasar por el Zabbix Server. La configuración de la conexión esta en el fichero '''/etc/zabbix/web/zabbix.conf.php'''
'''# cat /etc/zabbix/web/zabbix.conf.php'''
<?php
// Zabbix GUI configuration file.
global $DB;
$DB['TYPE']    = 'POSTGRESQL';
$DB['SERVER']  = 'localhost'; '''<----- IP donde esta la BBDD instalada'''
$DB['PORT']    = '0';
$DB['DATABASE'] = 'zabbix'; '''<----- Nombre de la base de datos'''
$DB['USER']    = 'zabbix'; '''<----- Nombre del usuario'''
$DB['PASSWORD'] = 'Z4bb1x'; '''<----- Contraseña del usuario'''
$DB['DOUBLE_IEEE754'] = 'true';  '''<----- Contraseña Nuevo parametro de zabbix 5.X importante cuando actualizamos de versiones anteriores.'''
// Schema name. Used for IBM DB2 and PostgreSQL.
$DB['SCHEMA'] = '';
$ZBX_SERVER      = 'localhost'; '''<----- IP del Zabbix Server'''
$ZBX_SERVER_PORT = '10051';    '''<----- Puerto en que escucha'''
$ZBX_SERVER_NAME = 'zbxsrv01';  '''<----- Nombre del Zabbix Server'''
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
===TIP: Re-dirección de la página default===
Para evitar que se muestre la pagina de APACHE cuando entramos en Zabbix sin poner la ruta completa en el navegador, creamos una pagina de inicio que nos redirecciona a la ruta por defecto de zabbix.
Es recomendable no modificar el path que trae zabbix por defecto, ya que algunas aplicaciones externas a Zabbix atacan la URL de la API por defecto y si la cambiamos puede que no funciones.
# cat <<EOF >/var/www/html/index.html
<html>
  <head>
    <title>Zabbix Server</title>
    <meta http-equiv="refresh" content="0; URL=http://10.0.100.100/zabbix">
    <meta name="keywords" content="automatic redirection">
  </head>
  <body></body>
</html>
EOF
===Arranque de Zabbix Server, Zabbix FE, HTTPD (Apache) y PHP-fpm===
# systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
# systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
# systemctl status zabbix-server zabbix-agent httpd rh-php72-php-fpm
===El archivo de configuración '''/etc/zabbix/zabbix_server.conf'''===
[[File:CHCS01.png|1024px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/appendix/config/zabbix_server Descripcion de las opciones del Server]]]
===Tomamos un Snapshot del Server (CMD Vagrant)===
C:\> vagrant snapshot save zbxsrv01 zbxsrv01-snap-0001
=Seccion=
==Entorno gráfico==
===Introducción===
El entorno gráfico está desarrollado en PHP. Generalmente es lo que más cuesta cuando comenzamos a trabajar con ZABBIX, a pesar de que realmente no es complejo tiende a que nos compliquemos y estemos dando vueltas por el, buscando opciones que no encontramos.
Es importante destacar que generalmente se puede llegar a la misma información desde diferentes ángulos, eso hacer que parezca más complicado de lo que es.
 
Una de las cosas que también nos suele dar dolores de cabeza es que hay menús dentro de las opciones que están más escondidos y cuando las buscamos no los encontramos. Estas dos cosas suelen frustrar mucho a la gente que comienza con ZABBIX.
Luego de mucho tiempo de utilizarlo, les aseguro que se pasaran gran parte del tiempo entre 2 y 5 opciones de todas las que tiene y el resto las utilizaran más esporádicamente.
[[File:ZBXDocumentacion01.png|1024px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/web_interface WEB Interface]]]
===Monitoring===
====Dashboard====
En esta opción podemos visualizar información genera del sistema. Podemos personalizar las dashboards o crear nuevas.
Tenemos un conjunto de widgets predefinidos. En esta Dashboard podemos visualizar algunos de ellos como el widget de System Information, el de clock que muestra el reloj que vemos, el  de host availability, el de problems by severity, o el de problems. Pero también podemos incluir Mapas o gráficos
====Problems====
A mi parecer esta opción de menú es la mas importante junto con '''"Latest Data"''', ya que nos muestra todos los triggers que aparecen en nuestro sistema.
Si aplicamos los filtros adecuados, fácilmente podemos ver que esta pasando y así monitorizar mucho mejor nuestra plataforma.
====Overview====
Nos ofrece una visión general del estado de los triggers o realiza una comparación de datos entre varios hosts agregándolos.
Las opciones disponibles son
  - Seleccionar todos los '''hosts''' o un grupo especifico de '''hosts groups''' desde la opción de '''Group dropdown'''
  - Seleccionar que tipo de información vamos a visualizar. (Triggers o datos) en el '''Type dropdown'''
 
  - Seleccionar si la visualización sera horizontal (Left) o vertical (Top) en el '''Host location dropdown'''
====Web====
En esta opción obtenemos información de los '''WEB scenarios'''.  Ya explicaremos mas adelante que son los web scenarios y para que los utilizamos.
Los hosts que están des-habilitados aparecerán en rojo.
====Latest Data====
Esta opción es muy utilizada, ya que podemos ver los últimos valores recolectados por los items y también acceder a gráficos o datos históricos.
Si algun ítem esta fallando, también nos dará información de porque falla y así poder solventar el problema.
====Graphs====
En esta sección podemos visualizar gráficos personalizados para los items que estamos recolectando.
====Screens====
En esta sección podemos configurar, administrar y visualizar los screens globales y los slide shows. Así como asignar los permisos de quien puede o no visualizarlos.
Esencialmente en un screen podemos agrupar información de diferentes fuentes para visualizarla rápidamente. Crear screen no es complicado y suele ser bastante intuitivo. El screen es una tabla y en cada fila o columna podemos definir elementos predefinidos que queremos que se visualicen.
Los Slides Shows son una agrupación de screens que se visualizarán en pantalla con una duración determinada.
[[File:screens1.png|1024px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/web_interface/frontend_sections/monitoring/screens Source: Zabbix SIA]]]
'''NOTA:'''A nivel de Dashbords, Screens y Gráficos en general, Zabbix esta realizando un esfuerzo grande en mejorar, cada año hay nuevas mejoras en estos puntos. Así y todo, es muy recomendable a día de hoy potenciar Zabbix con Grafana que es una herramienta pensada para esto. La visualización de los datos es mucho mas profesional y tiene una gama de plugins que potencia muchísimo esta parte.
====Maps====
En esta sección podemos ver, configurar y administrar mapas de red. Agrupar diferentes componentes de nuestra infraestructura y ver como se están comportando. Un Mapa puede ser incorporado dentro de un Screen.
En el Zabbix Summit 2019, pudimos ver una mapa de red creado por la empresa NTT COM Solutions en 3D, insertado dentro de un Screen que mostraba una infraestructura de comunicaciones en tiempo real, con el trafico entre los nodos que realmente era impresionante.
[[File:NTT COM Solutions.png|640px|thumb|center|[https://www.linkedin.com/posts/mobarrio_zabbixsummit2019-activity-6588729912746627072-laSQ Source: ZabbixSummit2019 NTT COM Solutions]]]
====Discovery====
En esta sección podemos visualizar el resultado de los discoverys realizados. Los mismos son ordenados por las reglas de discovery.
  Si no aplicamos ningún filtro, se visualizaran todos los discoverys habilitados.
Los discoverys los utilizamos para descubrir maquinas o elementos aplicando diferentes patrones o chequeos. El que trae zabbix por default busca en un rango de red especifico las maquinas que tengan un agente de zabbix instalado.
====Services====
Esta sección vemos el estatus de la infraestructura o de los servicios de negocio.
La idea es poder obtener una visión de mas alto nivel (negocio) de la infraestructura que monitorizamos.
A nivel de negocio no suele interesar el detalle de que host esta generando problemas o que componente esta mal, sino si este afecta o no la disponibilidad del servicio, lo que comúnmente llamamos SLA.
[[File:UIS01.png|1024px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/it_services Source: Zabbix Documentation]]]
===Inventory===
'''Inventario:''' Esta opción es muy poco utilizada, Por defecto esta desactivada, pero no se pude
configurar de forma Manual o Automática. Como en nombre lo dice recolecta información y de los hosts y la
almacena dentro del inventario de ZABBIX.
====Overview====
Podemos visualizar por agrupaciones de campos del inventario.
====Hosts====
Visualizamos todos los hosts con su información inventariada y podemos filtrarlos por los campos del inventario.
'''- General para todo el sistema'''
Administration -> General -> Other -> Inventory
'''- Particular para un host'''
Configuration -> Host -> Inventory
'''Manual:''' Lo tenemos que cargar nosotros manualmente.
'''Automático:''' Utiliza la información que recolecta de agentes para popular el dato automáticamente
dentro del inventario.
Cuando definimos Templates, podemos decirle que el item recolectado sea populado dentro del inventario.
Para esto seleccionamos
el item y vamos al campo '''"Populates host inventory field"''' ahi seleccionamos con que campo vamos a
realizar el macheo o emparejamiento y de esta forma cuando recolecte la informacion automaticamente
populara la información dentro del inventario.
'''Nota:''' Los campos dentro del inventario son un poco genéricos y en general poco útiles, podemos ajustar los nombres del inventario a algunos que sean mas representativos para nosotros
'''FILE:''' /usr/share/zabbix/include/hosts.inc.php --> $inventoryFields array donde podemos cambiar los nombres de los campos.
===Reports===
====System information====
====Availability report====
====Triggers top 100====
====Audit====
====Action log====
====Notifications====
===Configuration===
====Host groups====
====Templates====
====Hosts====
====Maintenance====
====Actions====
====Event correlation====
En esta sección los usuarios pueden configurar y mantener las reglas de correlación de los eventos de zabbix.
La correlación de eventos nos permite enfocarnos en la causa raíz del problema y se basa en los TAGS que definimos en los triggers.
Por ejemplo si tenemos una caída de un switch, tendríamos muchos hosts informando por errores de conectividad, con la correlación de eventos podemos determinar que estos errores son producidos por la caída del switch y de esta forma nos centramos solamente en ese problema, ya que el resto se solventara cuando este este OK nuevamente.
====Discovery====
====Services====
===Administration===
====General====
====Proxies====
====Authentication====
====User groups====
====Users====
====Media types====
====Scripts====
[FALTA TERMINAR]
Es el módulo para administrar y mantener el registro de los scripts globales del sistema.
Los script pueden ayudarnos a ejecutar acciones sobre un HOST ya que se pueden invocar desde diferentes partes de la interfaz web: Dashboards, Latest data, Triggers, Eventos o Mapas, tambien pueden ser invocados desde las acciones. De esta forma podemos hacer que dependiendo de una condición predeterminada se ejecute una accion.
TRABAJAR MÁS: Por ejemplo si se detecta un fichero en el server, ejecutamos una actualización de la aplicación.
Estos scripts se pueden ejecutar en el Zabbix Server, en el Zabbix Proxy o en los Zabbix Agents.
====Queue====
=Seccion=
==Que es un Hosts, una Macros y Host groups==
===Introducción===
'''Host:''' Es el dispositivo que queremos monitorizar. Para poder crear un HOST necesitamos como mínimo definir un grupo de atributos, como un Nombre, asignarlo a un grupo y definir al menos una interfaz.
      El tipo de interfaz dependera de como queramos monitorizar el Host y los disponibles son con un Agente de Zabbix, vía SNMP, JMX o IPMI.
      En el siguiente capítulo instalaremos y configuraremos un Zabbix Agent para monitorizar un Host Linux.
'''Templates:''' Aquí enlazamos los templates (plantillas) que este host tendrá. Ya veremos más adelante que son las plantillas y cómo crear una desde cero.
'''IPMI:''' Definiciones para la conexión vía IPMP como Autenticación, Privilegios Usuario y Password.
'''Tags:''' Aquí definimos Tags para el Host en cuestión. Un Tag es una etiqueta que luego podremos utilizar para realizar diferentes acciones como filtrado de problemas por tag, correlación de eventos por tags, etc.
'''Macros:''' Aquí definimos las Macros a nivel de Host que podemos utilizar. La macro no es más que una variable donde almacenamos información que luego utilizaremos. A continuación hablaremos un poco más en detalle sobre las Macros, que tipos hay y donde se definen.
'''Inventory:''' Definimos como trabajara el Host con el inventario.
'''Encryption:''' Definimos los parámetros de encriptación con los que el Zabbix Agent se conectara con el Zabbix Server.
===Macros===
Hay macros de sistema que ya están definidas, macros que se definen y utilizan en los Low Level Discovery y las de Usuario que podemos crear nosotros. Dependiendo del tipo de Macro que sea, tienen un formato diferente:
  '''{MACRO}'''  Macro del sistema, se pueden utilizar en funciones, triggers, etc. [https://www.zabbix.com/documentation/4.4/manual/appendix/macros/supported_by_location Sistema]
  '''{#MACRO}''' Macros de LLD (low-level discovery) Se definen y utilizan en los Low-Level Discoverys [https://www.zabbix.com/documentation/4.4/manual/config/macros/lld_macros LDD Macros]
  '''{$MACRO}''' Macros de Usuario. Estas las definimos nosotros a nivel de Host, Template o Zabbix Server. [https://www.zabbix.com/documentation/4.4/manual/config/macros/usermacros Usuario]
Las '''MACROS de Usuario''' se pueden definir dentro de los '''Hosts''', en los '''templates''' o a nivel '''general''' de Zabbix Server. Dependiendo de donde se definan unas tienen precedencia sobre las otras.
'''- MACROS Generales:'''    Son las de nivel más alto y se definen en '''Administration > General > Macros'''
'''- MACROS de Templates:''' Son las de nivel intermedio, se definen dentro del Template. Ya lo veremos en el próximo capítulo.
'''- MACROS de Host:'''      Son las de nivel más bajo y se definen dentro del Host.
'''Ejemplo:''' Si definimos la macro {$SNMP_COMMUNITY} a nivel de host, en el template y de forma general. Zabbix utilizara la del Host primero, si esta no existe, utilizara la del template y sino la General.
===Host Groups===
Los host groups son una agrupación lógica de hosts. Luego se podrán utilizar en distintas opciones para agrupar o filtrar por ellos.
=Sección=
==Creación de un Host e Instalación del Agente==
===Introducción===
Los Agentes de Zabbix están desarrollados en C++ y una de las mejores cosas que tienen es que el bajo footprint, esto quiere decir que la carga que generan en el sistema es muy baja. Actualmente está en desarrollo una versión 2 del Agente, desarrollada en Go y se espera sea lanzada con Zabbix 5. Los agentes mantienen compatibilidad hacia atrás, es decir podemos utilizar agentes antiguos con versiones de Zabbix más modernas. El problema de esto es que no contaremos con las últimas funciones implementadas en ellos.
Antes de instalar el agente comentaremos los diferentes modos de trabajar que el agente nos ofrece.
====Modos en que trabajan los agentes e Instalación====
=====Pasivo (pull)=====
El '''agente Pasivo''' (PULL) es el más común, está instalado en el host, escucha en el puerto '''10050''' y espera a que el server de Zabbix le solicite algo, cuando llega la petición, la resuelve y contesta el resultado.
  La mayor parte de los templates tienen sus ítems configurados con Agente Pasivo. En este modo es el server quien solicita al agente la información.
Para que funcione correctamente, el agente tiene que apuntar al servidor de Zabbix opción '''Server=''' de su archivo de configuración.
=====Activo (push)=====
El '''agente Activo''' (PUSH), al iniciarse solicita al server que está escuchando en el puerto '''10051''' que tiene que monitorizar, el server le responde y a partir de este momento es totalmente autónomo, enviará la información por su cuenta cada X tiempo, por defecto son 120s, esto se puede modificar con la opción '''RefreshActiveChecks=''' del archivo de configuración del agente.
Configurar un ítem como agente activo es mucho mejor de cara al rendimiento del server ya que lo descarga de la responsabilidad de estar solicitando la información a todos los clientes periódicamente ya que son ellos los que la reportan.
Otro punto importante es que para configurar el agente en modo activo, es necesario definir explícitamente el Hostname, si este no existe en el server de zabbix exactamente con el mismo nombre, este no será capaz de enviar la información de lo que tiene que monitorizar, si el Hostname no existe intentara con el HostnameItem y si este tampoco existe por default utiliza system.hostname (que es un hostname -a).
También es importante configurar cual es el server que escucha en modo activo y esto se realiza ajustando la opción '''ServerActive=''' en el archivo de configuración del agente.
Hay diferentes funciones según se configure el agente (Activo/Pasivo), por ejemplo si queremos analizar un log, en busca de un error y reportarlo si lo encuentra, este ítem se tiene que configurar como Agente Activo.
'''Nota:''' Los problemas generales de comunicación entre agente y server suelen ser por: Firewall, SELinux, o mala definición entre el nombre del host y el definido en el zabbix server, este último se soluciona fácilmente si utilizamos el Auto-discovery.
'''Nota:''' Si el agente está configurado en modo Activo y queremos que vuelva a solicitar la información al server sin esperar el tiempo pre configurado, simplemente tenemos que reiniciar el agente.
'''Nota:''' Comentar los UserParameters que extienden la funcionalidad del agente.
====Instalación del Agente====
# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
# yum clean all
# yum install -y zabbix-agent
# systemctl enable zabbix-agent
====Creamos un SNAP de zbxclient01 (CMD VAGRANT)====
C:\> vagrant snapshot save zbxclient01  zbxclient01-snap-0001
===Laboratorio 1: Configuración Manual del Zabbix Agente===
[root@zbxclient01 ~]# cat <<EOF >/etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=3
Server=10.0.100.100,127.0.0.1
ServerActive=10.0.100.100
Hostname=zbxclient01
Include=/etc/zabbix/zabbix_agentd.d/*.conf
EOF
[root@zbxclient01 ~]# systemctl restart zabbix-agent.service
[root@zbxclient01 ~]# tail -f /var/log/zabbix/zabbix_agentd.log
  12294:20200122:191707.380 TLS support:          YES
  12294:20200122:191707.380 **************************
  12294:20200122:191707.380 using configuration file: /etc/zabbix/zabbix_agentd.conf
  12294:20200122:191707.381 agent #0 started [main process]
  12295:20200122:191707.381 agent #1 started [collector]
  12296:20200122:191707.381 agent #2 started [listener #1]
  12299:20200122:191707.381 agent #5 started [active checks #1]
  12297:20200122:191707.382 agent #3 started [listener #2]
  12298:20200122:191707.384 agent #4 started [listener #3]
  12299:20200122:191707.438 no active checks on server [10.0.100.100:10051]: '''host [zbxclient01] not found'''
  '''Creación manual del Host'''
CONFIGURATION > HOSTS > CREATE HOST
'''Host name            :''' zbxclient01
'''Groups                :''' Linux servers
'''Agent interfaces      :'''
'''  IP Address        :''' 10.0.100.101
'''  Connect to        :''' IP
'''  Port              :''' 10050
[[File:CHCA01.png|1024px|thumb|center|Configuramos Nombre e IP del Agente]]
'''Verificamos si el Agente de zbxclient01 ya puede conectar'''
[root@zbxclient01 ~]# systemctl restart zabbix-agent.service
[root@zbxclient01 ~]# tail -f /var/log/zabbix/zabbix_agentd.log
12325:20200122:192415.833 IPv6 support:          YES
12325:20200122:192415.833 TLS support:          YES
12325:20200122:192415.833 **************************
12325:20200122:192415.833 using configuration file: /etc/zabbix/zabbix_agentd.conf
12325:20200122:192415.833 agent #0 started [main process]
12326:20200122:192415.833 agent #1 started [collector]
12327:20200122:192415.833 agent #2 started [listener #1]
12329:20200122:192415.834 agent #4 started [listener #3]
12328:20200122:192415.835 agent #3 started [listener #2]
12330:20200122:192415.836 agent #5 started [active checks #1]
'''Nota:''' Como vemos ya no sale el mensaje de HOST NOT FOUND
===Laboratorio 2: Configuración Automática del Zabbix Agente===
Antes de ponernos a configurar un Agente, vamos a ver una de las funcionalidades que tiene Zabbix que realmente nos ayuda muchísimo con la gestión de los Agentes.
====Que es la Auto-registracion====
Esta funcionalidad de Auto Registration, en realidad es una acción que se ejecuta cuando un cliente arranca, en el momento informa al server de que está vivo y le pasa información como el nombre, la ip y entre otros datos el '''HostMetadata''' que es lo que utilizaremos para configurar la acción de auto-registracion.
El '''HostMetadata''' no es más que un string de 0-255 caracteres en formato UTF-8. Con lo cual puede ser cualquier tipo de texto, particularmente a mi me gusta usar un hash de tipo MD5 que es único.
'''Antes que nada eliminamos el HOST: zbxclient01 que creamos manualmente'''
CONFIGURATION > HOSTS > Eliminamos zbxclient01
'''Generación del HASH de Auto-Registración'''
[root@zbxsrv01 ~]# echo zabbix2020| md5sum   
'''97d7c2030d2ccf29f059f4c24a8c0796'''  -
Este hash '''97d7c2030d2ccf29f059f4c24a8c0796''' lo utilizaremos tanto en la configuración del zabbix Client para que el lo informe al Zabbix Server y en el Zabbix Server para crear la Acción de Auto Registración.
'''Desde el Zabbix Frontend crearemos una nueva acción de tipo Auto Registración'''
CONFIGURATION > ACTIONS > EVENT SOURCE: Auto Registration -> CREATE ACTION
'''Creamos una nueva acción de tipo Auto-Registration'''
'''Name          :''' Auto-Registration Linux
'''New condition  :''' Host metadata - contains - 97d7c2030d2ccf29f059f4c24a8c0796
[[File:CAAR05.png|1024px|thumb|center]]
'''Operations    :'''
'''  Details    :''' Add to host groups: Discovered hosts
'''  Details    :''' Link to templates: Template Module ICMP Ping
                        Link to templates: Template OS Linux by Zabbix Agent
'''  Details    :''' Set host inventory mode: Automatic
[[File:CAAR06.png|1024px|thumb|center]]
'''Forzamos al server a que relea la configuración'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
====Configuración en el lado del Zabbix Agent====
# cat <<EOF >/etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=3
Server=10.0.100.100,127.0.0.1
ServerActive=10.0.100.100
Hostname=zbxclient01
'''HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796'''
Include=/etc/zabbix/zabbix_agentd.d/*.conf
EOF
# systemctl start zabbix-agent.service
====Creamos un SNAP de zbxclient01 y zbxsrv01 (CMD VAGRANT)====
C:\> vagrant snapshot save zbxclient01 zbxclient01-auto-registration-snap-0002
C:\> vagrant snapshot save zbxsrv01 zbxsrv01-auto-registration-snap-0002
===Laboratorio 3: UserParameters===
====Introduccion====
Algunas veces queremos extender las funcionalidades del agente con chequeos que no esta predefinidos en el propio agente. Para esto tenemos los User Parameters. Estos parámetros se cargan vía la configuración del agente al momento del arranque del mismo.
Hay varias opciones en la configuración del agente que afectan al funcionamiento de la ejecución de los mismos como AllowRoot, UserParameter e Include.
'''AllowRoot''' Permite que el agente se ejecute como ROOT, por defecto esta desactivado y el agente se ejecuta con el usuario zabbix.
'''UserParameter''' Definición del parámetro.
'''Include''' Incluye ficheros individuales o todos los ficheros en un directorio.
Los userparameters se pueden definir directamente en el archivo de configuración del zabbix_agent.conf o podemos crear fichero agrupando userparameters según funcionalidades.
Se recomienda hacer esto último, es decir crear diferentes ficheros dentro del directorio /etc/zabbix/zabbix_agentd.d/ e incluirlos todos via la sentencia include.
====Preparamos el Agente para que cargue los parametros nuevos UserParameters====
# cat <<EOF >/etc/zabbix/zabbix_agentd.conf
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.100.100''',127.0.0.1  <--- Importante Localhost para poder conectarlos localmente con zabbix_get'''
ServerActive=10.0.100.100
Hostname=zbxclient01
HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796
'''Include=/etc/zabbix/zabbix_agentd.d/*.conf'''
EOF
[root@zbxclient01 ~]# systemctl restart zabbix-agent.service
[root@zbxclient01 ~]# systemctl status zabbix-agent.service
====La estructura del fichero de Parámetros====
La estructura
'''UserParameter=<clave>,<comando>'''
'''Clave  :''' Es un identificador único. Puede contener parámetros lo que flexibiliza los mismos. Para que acepte parámetros, creamos la clave y seguidamente incluimos [*]. Cada parámetro se pasará desde el Zabbix Server separado por comas y se utilizan dentro del comando reemplazandolos por las macros $1..$9.
'''Comando :''' Es el comando que el zabbix agent ejecutará.
'''Este ejemplo crea un parámetro llamado clustat que utilizaremos más adelante.'''
[root@zbxclient01]# cat <<EOF >/etc/zabbix/zabbix_agentd.d/userparameter_clustat.conf
UserParameter=clustat[*],echo \$1
EOF
'''El Zabbix Agent ejecutaría el parámetro anterior de la siguiente forma'''
'''Definición:''' UserParameter=clustat[*],echo $1
'''Llamada  :''' clustat["Hola mundo"]
'''Ejecución :''' echo "Hola Mundo"
'''Retorno  :''' Hola Mundo
'''Este ejemplo monitoriza el estado de los Sockets en un Linux'''
[root@zbxclient01]# cat <<EOF >/etc/zabbix/zabbix_agentd.d/userparameter_sockstat.conf
UserParameter=sockstat.sockets,cat /proc/net/sockstat|grep sockets|cut -d' ' -f 3
UserParameter=sockstat.tcp.inuse,cat /proc/net/sockstat|grep TCP|cut -d' ' -f 3
UserParameter=sockstat.tcp.orphan,cat /proc/net/sockstat|grep TCP|cut -d' ' -f 5
UserParameter=sockstat.tcp.timewait,cat /proc/net/sockstat|grep TCP|cut -d' ' -f 7
UserParameter=sockstat.tcp.allocated,cat /proc/net/sockstat|grep TCP|cut -d' ' -f 9
UserParameter=sockstat.tcp.mem,cat /proc/net/sockstat|grep TCP|cut -d' ' -f 11
UserParameter=sockstat.udp.inuse,cat /proc/net/sockstat|grep UDP:|cut -d' ' -f 3
UserParameter=sockstat.udp.mem,cat /proc/net/sockstat|grep UDP:|cut -d' ' -f 5
EOF
'''Este ejemplo monitoriza diferentes opciones como el numero de ficheros abiertos, el numero de procesos, el estado de servicios o el estado del servicio de NTP'''
[root@zbxclient01]# cat <<EOF >/etc/zabbix/zabbix_agentd.d/userparameter_general.conf
UserParameter=linux.openfiles,/usr/sbin/lsof | /usr/bin/wc -l
UserParameter=linux.process,/usr/bin/ps -ef | /usr/bin/wc -l
UserParameter=linux.service.status[*],/usr/bin/systemctl is-active \$1 -q ; echo '{"status":'\$?'}'
UserParameter=linux.ntp.status,(([ -x /usr/bin/chronyc ] && /usr/bin/chronyc tracking | egrep -ic "Leap status.*Normal") || ([ -x /usr/sbin/ntpq ] && /usr/sbin/ntpq -pn 2>/dev/null | egrep -c "^\*") || echo 0 )
EOF
'''Reiniciamos el zabbix_agent para que relea los userparameters.'''
[root@zbxclient01]# systemctl restart zabbix-agent.service
[root@zbxclient01]# systemctl status zabbix-agent.service
====Test====
[root@zbxclient01 ~]# yum install -y zabbix-get '''<- El zabbix_get nos permitirá simular una petición al agente vía línea de comandos.'''
[root@zbxclient01 ~]# zabbix_get -s 127.0.0.1 -k clustat[3]
[root@zbxclient01 ~]# zabbix_get -s 127.0.0.1 -k clustat["Hola Mundo"]
[root@zbxclient01 ~]# zabbix_get -s 127.0.0.1 -k clustat["Hola","Mundo"] '''<- $1: Hola, $2: Mundo'''
[root@zbxclient01 ~]# zabbix_get -s 127.0.0.1 -k linux.process
    '''Comando a ejecutar:''' /usr/bin/ps -ef | /usr/bin/wc -l
[root@zbxclient01 ~]# zabbix_get -s 127.0.0.1 -k linux.openfiles
    '''Comando a ejecutar:''' /usr/sbin/lsof | /usr/bin/wc -l
===Laboratorio 4: Configuración del Agente con Encripción===
====Generación de clave PSK====
# mkdir -p /etc/zabbix/ssl/keys
# openssl rand -hex 32 >/etc/zabbix/ssl/keys/zabbix_psk
# cat /etc/zabbix/ssl/keys/zabbix_psk
====Preparamos el Agente para que se comunique con el server====
# vi /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=3
Server=10.0.100.100''',127.0.0.1  <--- Importante Localhost para poder conectarlos localmente con zabbix_get y probar la Encripción'''
ServerActive=10.0.100.100
Hostname=zbxclient01
'''HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796'''
Include=/etc/zabbix/zabbix_agentd.d/*.conf
TLSConnect=psk                    '''<--- Como conecta el agente con el Zabbix Server.'''
TLSAccept=unencrypted,psk          '''<--- Que tipo de conecciones se aceptan desde el Zabbix server.'''
TLSPSKIdentity=Zabbix2020
TLSPSKFile=/etc/zabbix/ssl/keys/zabbix_psk
# systemctl restart zabbix-agent.service
====La encripción que utilizara el server para conectarse con el Agente/Proxy====
CONFIGURATION > HOSTS > ZBXCLIENT01 > Encryption
Connections to host    : '''PSK'''
Connections from host  : '''PSK'''
PSK identity          : Zabbix2020
PSK                    : 79da666f7eab34055953b3ee48f58a5486fda5a6e8c286452752824c63386c79
'''Hacemos click en UPDATE'''
[[File:Encryption-psk 01.png|1024px|thumb|center|Configuración en el Zabbix Server]]
[[File:Encryption-psk 02.png|1024px|thumb|center|Estado del cliente con la encripcion activa]]
====Test====
# yum install -y zabbix-get
# zabbix_get -s 127.0.0.1 -k agent.ping --tls-connect psk --tls-psk-identity Zabbix2020 --tls-psk-file /etc/zabbix/ssl/keys/zabbix_psk
===El archivo de configuración '''/etc/zabbix/zabbix_agent.conf'''===
[[File:CHCA04.png|1024px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/appendix/config/zabbix_agentd Descripcion de las opciones del Agente]]]
=Sección=
==Instalación de Zabbix Proxy==
===Introducción===
El Zabbix Proxy nos permite escalar horizontalmente la recolección de datos y volcarlos al Zabbix server. Esto nos ayuda mucho cuando tenemos puntos de recolección remotos con muy mala latencia y/o cortes, redes aisladas o lineas de datos con un ancho de banda limitado.
El proxy nos permite recolectar los datos localmente y enviarlo al server periódicamente, si hay un corte en la comunicación con el Zabbix Server, este sigue recolectando la información y cuando vuelve a tener conexión envía los datos acumulados.
El proxy cuenta con la funcionalidad de compresión, lo que nos ayuda con las líneas de datos con ancho de banda limitado.
[[File:CHCP02.png|400px|thumb|center|[https://twitter.com/zabbix/status/1001782409095008256 Reduce x5 el ancho de banda]]]
También cuenta con la funcionalidad de encriptación lo que nos permite conectar los proxys con el server a través de lineas no seguras.
Al recolectar datos en local, es un único punto de interconexión con el server, si en la infraestructura remota tenemos cientos de equipos, solo interconectamos el Zabbix proxy con el Zabbix Server ya que los agentes se conectaran a través de él.
===Modos en que trabaja el proxy e Instalación===
====Configuración del Proxy Pasivo====
Es el Zabbix Server quien se ocupa de solicitar la información al proxy de forma periódica.
'''Parámetro importante del Zabbix proxy'''
  '''ProxyMode''' - Se tiene que configurar a 1 (passive)
'''Parámetros importantes del Zabbix server'''
  '''StartProxyPollers''' - Controla cuantos pollers contactan con el proxy.
  '''ProxyConfigFrequency''' - Cuán a menudo Zabbix server envía los cambios de configuración al proxy.
  '''ProxyDataFrequency''' – Cuán a menudo son requeridos los datos.
====Configuración del Proxy Activo====
Es el propio proxy quien enviará la información al Zabbix Server. Por defecto esta es la configuración predeterminada.
'''ProxyMode''' - Se tiene que configurar a 0 (active) '''MODO POR DEFECTO'''
'''Hostname''' - Debe coincidir con el nombre del proxy configurado en el frontend.
'''ProxyOfflineBuffer''' - Controla cuánto tiempo los datos son almacenados localmente si el proxy no puede contactar con el Server (1H por defecto)
'''ProxyLocalBuffer''' - Permite preservar los datos en la base de datos del proxy para ser procesada más tarde.
'''ConfigFrequency''' - Controla cuán a menudo el proxy solicita al su configuración al Zabbix server.
'''DataSenderFrequency''' - Controla cuán a menudo son enviados los datos recolectados al Zabbix server.
'''HeartbeatFrequency''' - Establece cuán a menudo el proxy contactara con el server aunque no tenga nuevos datos que transmitir.
====TIPs====
'''TIP 1:''' Si se poner un delay antes de enviar la información por ejemplo cada 5s, permite que se acumule la información y la envié toda junta al server.
'''TIP 2:''' El Proxy solo recolecta datos no verifica triggers.
'''TIP 3:''' Se calcula que hasta 500 NVPS una base de datos SQLite lo puede soportar. Si es mas, ya tendremos que pensar en un MySQL o PostgreSQL.
'''TIP 4:''' También se puede utilizar con SQLite DB en Memoria.
'''TIP 5:''' Es muy importante que el Zabbix Proxy tenga la misma versión que el Zabbix Server.
'''TIP 6:''' Si estamos pensando en contratar el soporte directamente con Zabbix, ellos cobran por cara Server y Proxy que tengamos instalados.
'''A continuación realizaremos 2 laboratorios:'''
- El primero será la configuración de un Zabbix Proxy contra el Zabbix Server y de un cliente a través de el.
- El segundo será configurar la encripción entre el Zabbix Proxy y el Zabbix Server.
Pero antes vamos a sanear la infraestructura para evitar arrastrar errores.
===Preparamos los Laboratorios===
'''Vamos a quitar la configuración de encripcion del Zabbix Client y del Zabbix FrontEnd'''
'''En zbxclient01 comentamos las lineas de TLS'''
[root@zbxclient01]# '''vi /etc/zabbix/zabbix_agentd.conf'''                                                   
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=3
Server=10.0.100.100,127.0.0.1
ServerActive=10.0.100.100
Hostname=zbxclient01
HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796
Include=/etc/zabbix/zabbix_agentd.d/*.conf
#TLSConnect=psk
#TLSAccept=unencrypted,psk
#TLSPSKIdentity=OpenWebinars
#TLSPSKFile=/etc/zabbix/ssl/keys/zabbix_psk
[root@zbxclient01]# systemctl restart zabbix-agent.service
'''En Zabbix FrontEnd modificamos los parámetros de Encripcion'''
CONFIGURATION > HOSTS > ZBXCLIENT01 > Encryption
'''Connections to host  :''' No encryption
'''Connections from host:''' No encryption
Como comente anteriormente, en el primer laboratorio vamos a vamos a instalar y configurar una maquina que sera nuestro proxy (zbxprxy01) y un cliente (zbxclient01) el cual lo monitorizaremos vía el proxy.
Como podemos ver en este MAPY, el proxy se comunicara con el Server y el cliente lo realizará vía el proxy.
[[File:Infraestructura-Vagrant-02.png|1024px|thumb|center|MAPY de Infraestructura escenario 2]]
===Instalación de Zabbix Proxy===
'''Nota:''' Se puede elegir el soporte de la base de datos a utilizar por el proxy entre MySQL, PostgreSQL o SQLITE3.
zabbix-proxy-mysql    '''<-- Con soporte para MySQL'''
zabbix-proxy-pgsql    '''<-- Con soporte para PGSQL'''
zabbix-proxy-sqlite3  '''<-- Con soporte para SQLITE3'''
[root@zbxprxy01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
[root@zbxprxy01 ~]# yum clean all
[root@zbxprxy01 ~]# yum install -y zabbix-proxy-sqlite3 zabbix-agent
'''Importamos el esquema inicial de la base de datos'''
[root@zbxprxy01 ~]# mkdir -p /var/zabbix/database
[root@zbxprxy01 ~]# zcat /usr/share/doc/zabbix-proxy-sqlite3*/schema.sql.gz | sqlite3 /var/zabbix/database/zabbix.db
[root@zbxprxy01 ~]# chown -R zabbix:zabbix /var/zabbix
===Laboratorio 1: Configuración básica del Zabbix Proxy===
====Configuración del lado del Zabbix Proxy====
[root@zbxprxy01 ~]# vi /etc/zabbix/zabbix_proxy.conf
'''Server=10.0.100.100'''
'''Hostname=zbxprxy01'''
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
'''DBName=/var/zabbix/database/zabbix.db'''
'''DBUser=zabbix'''
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
[root@zbxprxy01 ~]# systemctl enable zabbix-proxy.service
[root@zbxprxy01 ~]# systemctl start zabbix-proxy.service
[root@zbxprxy01 ~]# systemctl status zabbix-proxy.service
====Generamos un Snapshot desde (CMD Vagrant)====
C:\> vagrant snapshot save zbxprxy01 zbxprxy01-snap-0001
====Configuración del lado del Frontend====
'''Creamos el proxy en Zabbix Server.'''
ADMINISTRATION -> PROXIES -> CREATE PROXY
'''Proxies'''
'''Proxy name          :''' zbxprxy01 '''<- Muy importante que tenga el mismo nombre'''
'''Proxy mode          :''' Active
'''Proxy address      :''' 10.0.100.102
'''Description        :''' Descripción de Zabbix Proxy
[[File:CZP101.png|1024px|thumb|center|Creación Zabbix Proxy en el FrontEnd]]
[[File:CZP102.png|1024px|thumb|center|Configuración Zabbix Proxy en el FrontEnd]]
[[File:CZP103.png|1024px|thumb|center|Estado Zabbix Proxy en el FrontEnd]]
[root@zbxsrv01]# zabbix_server -R config_cache_reload
[root@zbxprxy01]# systemctl restart zabbix-proxy.service
[[File:CZP104.png|1024px|thumb|center|Estado Zabbix Proxy en el FrontEnd]]
====Configuración del Zabbix Agent Local al Zabbix Proxy====
[root@zbxprxy01 ~]# vi /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server='''127.0.0.1'''
ServerActive='''127.0.0.1'''
Hostname='''zbxprxy01'''
HostMetadata='''97d7c2030d2ccf29f059f4c24a8c0796'''
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@zbxprxy01 ~]# systemctl enable zabbix-agent.service
[root@zbxprxy01 ~]# systemctl start zabbix-agent.service
[root@zbxprxy01 ~]# systemctl status zabbix-agent.service
'''Comprobaciones en el Frontend'''
Verificamos que el Host zbxprxy01 se conecta al Zabbix Server via el mismo.
[[File:CZP105.png|1024px|thumb|center|Agentes conectados al Zabbix Proxy]]
Verificamos que el Host zbxprxy01 existe y se registro vía Auto-registracion
[[File:CZP106.png|1024px|thumb|center|Nuevo Host registrado via  Auto-registracion]]
====Configuración de un Zabbix Agent remoto contra el Zabbix Proxy====
'''Reconfiguramos el Zabbix Agent del ZBXCLIENT01 para que acceda via proxy'''
[root@zbxclient01 ~]# systemctl stop zabbix-agent.service
[root@zbxclient01 ~]# vi /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server='''10.0.100.102'''
ServerActive='''10.0.100.102'''
Hostname='''zbxclient01'''
HostMetadata='''97d7c2030d2ccf29f059f4c24a8c0796'''
Include=/etc/zabbix/zabbix_agentd.d/*.conf
'''Eliminamos el zbxclient01 del Zabbix Frontend'''
CONFIGURATION > HOSTS > ZBXCLIENT01 > Delete
'''Arrancamos el Agente'''
[root@zbxclient01 ~]# systemctl start zabbix-agent.service
[root@zbxclient01 ~]# systemctl status zabbix-agent.service
'''Comprobaciones en el Frontend'''
Verificamos que el Host zbxclient01 se conecta al Zabbix Server via el zbxprxy01.
[[File:CZP107.png|1024px|thumb|center|Agentes conectados al Zabbix Proxy]]
Verificamos que el Host zbxclient01 se autoregistro y se monitoriza vía el Proxy.
[[File:CZP108.png|1024px|thumb|center|Nuevo Host registrado via Auto-registracion]]
'''Si vemos que los agentes no se ponen en VERDE reiniciamos el Zabbix Proxy'''
[root@zbxprxy01 ~]# systemctl restart zabbix-proxy.service
'''Nota:''' Esto fuerza a que el proxy solicite los chequeos a realizar al Zabbix Server y envíe todos los datos que tiene acumulados.
[[File:CZP109.png|1024px|thumb|center|Agentes ONLINE conectados al Zabbix Proxy]]
===Laboratorio 2: Configuración avanzada del Zabbix Proxy con Encripción===
En este laboratorio vamos a reconfigurar el proxy que tenemos instalado para que se comunique de forma encriptada con el Zabbix Server.
[[File:Infraestructura-Vagrant-03.png|1024px|thumb|center|MAPY de Conexión Encriptada entre ZBXPRXY01 y ZBXServer01]]
====Generación de clave PSK utilizadas entre zabbix-server y zabbix-proxy====
'''El primer paso sera crear la clave PSK que utilizaremos para encriptar la comunicación.'''
[root@zbxprxy01 ~]# mkdir -p /etc/zabbix/ssl/keys
[root@zbxprxy01 ~]# openssl rand -hex 32 >/etc/zabbix/ssl/keys/zabbix_proxy_psk
[root@zbxprxy01 ~]# cat /etc/zabbix/ssl/keys/zabbix_proxy_psk
<span style='color:red'>174ca9394c1ebd45d099eb4f93861c140fff7d103d55b15a435714da50995ef1</span>
====Configuración básica del zabbix proxy====
[root@zbxprxy01 ~]# vi /etc/zabbix/zabbix_proxy.conf
TLSConnect='''psk'''            # Como debe conectarse el proxy al Zabbix server.
                          # Se utiliza en PROXY Activo, en Proxy Pasivo es ignorada.
TLSAccept='''psk'''            # Que tipo de conexiones entrantes acepta desde el Zabbix server.
                          # Solo se utiliza para modo pasivo, es ignorada en modo Activo.
TLSPSKIdentity='''ZabbixProxy2020'''
TLSPSKFile='''/etc/zabbix/ssl/keys/zabbix_proxy_psk'''
====Configuración en el Frontend====
'''Configuramos los parámetros de encriptación el proxy dentro del Zabbix Frontend.'''
ADMINISTRATION -> PROXIES -> zbxprxy01
'''Proxy                  :'''
'''  Proxy Name          :''' zbxprxy01
'''  Proxy mode          :''' Active
'''  Proxy address      :''' 10.0.100.102
'''  Description        :''' Descripcion del Zabbix Proxy
[[File:CZP102.png|1024px|thumb|center|Configuración Zabbix Proxy en el FrontEnd]]
'''Encryption                :'''
'''  Connections from proxy :''' PSK
'''  PSK identify          :''' ZabbixProxy2020
'''  PSK                    :''' 174ca9394c1ebd45d099eb4f93861c140fff7d103d55b15a435714da50995ef1
[[File:CZP110.png|1024px|thumb|center|Configuración de Encripción del Zabbix Proxy en el FrontEnd]]
'''Reiniciamos el Zabbix Server.'''
[root@zbxsrv01 ~]# systemctl restart zabbix-server
[root@zbxsrv01 ~]# systemctl status zabbix-server
'''Reiniciamos el Zabbix Proxy'''
[root@zbxprxy01 ~]# systemctl restart zabbix-proxy
[root@zbxprxy01 ~]# systemctl status zabbix-proxy
[root@zbxprxy01 ~]# tail -f /var/log/zabbix/zabbix_proxy.log
'''Por ultimo verificamos si la encriptación está activa desde el Frontend'''
[[File:CZP111.png|1024px|thumb|center|Estado de la Encripción del Zabbix Proxy en el FrontEnd]]
===Laboratorio 3: Configurar la encriptación Full de los Agentes vía Proxy===
====Explicación====
En este ejercicio van a tener que configurar la encripción de los Agentes de Host (Zabbix Agent) zbxprxy01 y zbxclient01 contra el Zabbix Server como podemos ver en el siguiente MAPY.
[[File:Infraestructura-Vagrant-04.png|1024px|thumb|center|MAPY que muestra la conexión encriptada de los Agentes con el Zabbix Server]]
Si todo está configurado correctamente, lo podremos confirmar desde el Zabbix Frontend tal cual se ve en la siguiente imagen:
[[File:CZP201.png|1024px|thumb|center|Encripción del Zabbix Proxy habilitada]]
====Resolución====
'''Nota:''' Hay 2 tipos de conexiones encriptadas.
      '''1. Zabbix Server <--> Zabbix Proxy'''
      Esta conexión es entre el Server y el Proxy, se configura la encripción por PSK en el fichero de configuración del Zabbix Proxy (zabbix_proxy.conf) y en el Zabbix Front End dentro de '''Administration -> Proxies -> [Buscamos el Proxy] -> Encryption''' ponemos exactamente la misma información configurada en el zabbix_proxy.conf del Zabbix Proxy.
      '''2. Zabbix Proxy <--> Zabbix Agent'''
      Esta parte es la que puede confundirnos un poco, ya que no configuramos la encripción directamente entre el Zabbix Agente y el Zabbix Proxy, sino que es entre el Zabbix Agent y el Zabbix Front End dentro de '''Administration  -> Hosts -> [Buscamos el Host] -> Encryption''' y ponemos exactamente la misma información configurada en el zabbix_agent.conf del Zabbix Agent. El Zabbix Server enviará las claves PSK cuando le informe su configuración al Zabbix Proxy.
=====Configuración en los Hosts=====
'''Creamos la clave de encripción del Agente en el host zxbclient01'''
[root@zbxclient01 ~]# mkdir -p /etc/zabbix/ssl/keys
[root@zbxclient01 ~]# cat <<EOF >/etc/zabbix/ssl/keys/zabbix_agent_psk
174ca9394c1ebd45d099eb4f93861c140fff7d103d55b15a435714da50995ef1
EOF
[root@zbxclient01 ~]# ls -la /etc/zabbix/ssl/keys
total 8
drwxr-xr-x. 2 root root 48 Jan  9 14:38 .
drwxr-xr-x. 3 root root 18 Jan  9 13:50 ..
-rw-r--r--. 1 root root 65 Jan  9 14:38 zabbix_agent_psk '''<- Clave para la encripción entre el Zabbix Agente y el Zabbix Server'''
-rw-r--r--. 1 root root 65 Jan  9 13:54 zabbix_psk      '''<- Clave para la encripción entre el Zabbix Proxy y el Zabbix Server'''
[root@zbxclient01 ~]# vi /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.100.102
ServerActive=10.0.100.102
HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796
Include=/etc/zabbix/zabbix_agentd.d/*.conf
'''TLSConnect=psk'''
'''TLSAccept=psk'''
'''TLSPSKIdentity=ZabbixAgent2020'''
'''TLSPSKFile=/etc/zabbix/ssl/keys/zabbix_agent_psk'''
[root@zbxclient01 ~]# systemctl restart zabbix-agent.service
[root@zbxclient01 ~]# systemctl status zabbix-agent.service
[root@zbxclient01 ~]# tail -f /var/log/zabbix/zabbix_agentd.log
'''Creamos la clave de encripción del Agente en el host zxbprxy01'''
[root@zbxprxy01 ~]# mkdir -p /etc/zabbix/ssl/keys
[root@zbxprxy01 ~]# cat <<EOF >/etc/zabbix/ssl/keys/zabbix_agent_psk
174ca9394c1ebd45d099eb4f93861c140fff7d103d55b15a435714da50995ef1
EOF
[root@zbxprxy01 ~]# vi /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=127.0.0.1
ServerActive=127.0.0.1
HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796
Include=/etc/zabbix/zabbix_agentd.d/*.conf
'''TLSConnect=psk'''
'''TLSAccept=psk'''
'''TLSPSKIdentity=ZabbixAgent2020'''
'''TLSPSKFile=/etc/zabbix/ssl/keys/zabbix_agent_psk'''
[root@zbxprxy01 ~]# systemctl restart zabbix-agent.service
[root@zbxprxy01 ~]# systemctl status zabbix-agent.service
[root@zbxprxy01 ~]# systemctl restart zabbix-proxy.service
[root@zbxprxy01 ~]# systemctl status zabbix-proxy.service
=====Configuración en el Zabbix Front End=====
'''Configuramos los parámetros de encriptación el proxy dentro del Zabbix Frontend.'''
CONFIGURATION -> HOSTS -> zbxclient01 y zbxprxy01
'''Encryption'''
'''  Connections to host    :''' PSK
'''  Connections from host  :''' PSK
'''  PSK identify          :''' ZabbixAgent2020
'''  PSK                    :''' 174ca9394c1ebd45d099eb4f93861c140fff7d103d55b15a435714da50995ef1
[[File:CZP202.png|1024px|thumb|center|Habilitar la Encripción del Zabbix Agent (zbxclient01)]]
[[File:CZP203.png|1024px|thumb|center|Estado de la Encripción del Zabbix Proxy (zbxprxy01)]]
'''Reiniciamos el Zabbix Server'''
[root@zbxsrv01 ~]# systemctl restart zabbix-server
[root@zbxsrv01 ~]# systemctl status zabbix-server
'''Reiniciamos el Zabbix Proxy'''
[root@zbxprxy01 ~]# systemctl restart zabbix-proxy.service
[root@zbxprxy01 ~]# systemctl status zabbix-proxy.service
[root@zbxprxy01 ~]# tail -f /var/log/zabbix/zabbix_proxy.log
'''Reiniciamos el Zabbix Agent en el Proxy'''
[root@zbxprxy01 ~]# systemctl restart zabbix-agent.service
[root@zbxprxy01 ~]# systemctl status zabbix-agent.service
[root@zbxprxy01 ~]# tail -f /var/log/zabbix/zabbix_agentd.log
'''Si todo está configurado correctamente podemos ver que el agente está conectado y que la encripción del agente está habilitada vía PSK'''
[[File:CZP201.png|1024px|thumb|center|Encripción del Zabbix Proxy habilitada]]
===Limitaciones===
- Los Zabbix Proxys no soportan la ejecución de comandos remotos.
- Auto-creación de la base de datos solo funciona para SQLite.
- No gestiona alertas o triggers, el proxy solo se utiliza para la recolección de datos.
===El archivo de configuración '''/etc/zabbix/zabbix_proxy.conf'''===
[[File:CHCP01.png|1024px|thumb|center|[https://www.zabbix.com/documentation/4.4/manual/appendix/config/zabbix_proxy Descripcion de las opciones del Proxy]]]
=Sección=
==Introducción a la creación y configuración de Items y Triggers==
===Introducción===
Antes de comenzar vamos a ver algunos conceptos a tener en cuenta.
'''Item          :''' Es el elemento que quiero monitorizar. Nos retornará un valor que luego procesaremos y al cual aplicaremos los triggers.
'''Preprocessing :''' Esta funcionalidad nos permite tratar los valores recolectados antes de que sean guardados en la base de datos.
'''Trigger      :''' Es una expresión lógica de un problema y cuando todas sus condiciones retornan VERDADERO es cuando se dispara.
'''Tipos de Ítems:''' Para explicarlos mejor vamos a ir creando cada uno de ellos y veremos sus diferentes funciones.
  * Zabbix Agent
  * Zabbix Agent (Active)
  * Simple Check
  * SNMPv1 agent
  * SNMPv2 agent
  * SNMPv3 agent
  * SNMP Trap
  * Zabbix Internal
  * Zabbix Trapper
  * Zabbix Aggregate
  * External Check
  * Database Monitoring
  * HTTP Agent
  * IPMI Agent
  * SSH Agent
  * TELNET Agent
  * JMX Agent
  * Calculated
  * Dependent Item
'''Preparamos los Labs'''
'''IMPORTANTE: - Antes de comenzar vamos borramos toda la configuración de encripcion en el ZBXCLIENT01 y ZBXPRXY01'''
'''IMPORTANTE: - Antes eliminaremos los templates del Host zbxclient01 desde el Zabbix Frontend para comenzar sin información a monitorizar y reconfiguramos el Zabbix Agent para que se conecte directamente al Server así las pruebas serán mas fluidas.'''
CONFIGURATION > HOSTS > '''ZBXCLIENT01''' > TEMPLATES > Unlink and clear
'''Reconfiguramos el Zabbix Agente del zbxclient01 y zbxprxy01'''
'''zbxclient01'''
[root@zbxclient01]# cat <<EOF >/etc/zabbix/zabbix_agentd.conf     
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=3
Server=10.0.100.100,127.0.0.1
ServerActive=10.0.100.100
Hostname=zbxclient01
HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796
Include=/etc/zabbix/zabbix_agentd.d/*.conf
EOF
'''zbxprxy01'''
[root@zbxprxy01]# cat <<EOF >/etc/zabbix/zabbix_agentd.conf     
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=3
Server=10.0.100.100,127.0.0.1
ServerActive=10.0.100.100
Hostname=zbxprxy01
HostMetadata=97d7c2030d2ccf29f059f4c24a8c0796
Include=/etc/zabbix/zabbix_agentd.d/*.conf
EOF
'''Reconfiguramos los Agentes en Zabbix Frontend'''
CONFIGURATION > HOSTS > '''ZBXCLIENT01''' > Encryption
    '''Connections to host    :''' No encryption
    '''Connections from host  :''' No encryption
    '''UPDATE'''
CONFIGURATION > HOSTS > '''ZBXPRXY01''' > Encryption
    '''Connections to host    :''' No encryption
    '''Connections from host  :''' No encryption
    '''UPDATE'''
'''Reiniciamos todos los servicios'''
[root@zbxsrv01]# systemctl restart zabbix-server
[root@zbxprxy01]# systemctl stop zabbix-proxy.service
[root@zbxprxy01]# systemctl disable zabbix-proxy.service
'''Nota:'''Verificamos en el FrontEnd si el host zbxprxy01 accede por la Interfaz 10.0.100.102
[root@zbxprxy01]# systemctl restart zabbix-agent.service
[root@zbxprxy01]# systemctl status zabbix-agent.service
[root@zbxprxy01]# tail -f /var/log/zabbix/zabbix_agentd.log
[root@zbxclient01]# systemctl restart zabbix-agent.service
[root@zbxclient01]# systemctl status zabbix-agent.service
[root@zbxclient01]# tail -f /var/log/zabbix/zabbix_agentd.log
[root@zbxprxy01 ~]# systemctl restart zabbix-agent.service
===Laboratorio 1: Creación del Ítem===
'''Crearemos un Ítem de CPU Idle utilizando la función del Agente system.cpu.util'''
[[File:CIPT01.png|1024px|thumb|center|Función interna del Zabbix Agente '''systemc.cpu.util''']]
'''Vamos a crear el item de % de Utilizacion de CPU'''
CONFIGURATION -> HOSTS -> ZBXCLIENT01 -> ITEMS -> Create Item
[[File:CIT01.png|1024px|thumb|center]]
'''Name                :''' CPU
'''Type                :''' Zabbix agent
'''Key                :''' system.cpu.util[all,idle,avg1]
'''Type of information :''' Numeric (float)
'''Units              :''' %
'''Update interval    :''' 5s
'''New application    :''' Performance
'''Description        :''' CPU Utilization in percentage
[[File:CIPT02.png|1024px|thumb|center]]
'''Forzamos que Zabbix Server recargue la cache de configuración'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Verificamos en Latest data como se están recolectando las métricas'''
MONITORING -> LATEST DATA -> zbxclient01
[[File:CIPT03.png|1024px|thumb|center]]
===Laboratorio 2: Reglas de Preprocesamiento===
Esto es relativamente nuevo, aparecen en Zabbix 3.4 y desde entonces están evolucionando constantemente.
Las reglas de preprocesamiento ejecutan una transformación al dato recibido antes de almacenarlo en la base de datos.
'''En este ejemplo aplicaremos 2 reglas al valor recuperado.'''
  '''- In Range:''' Validamos que el dato esté dentro del rango establecido
              Aplicaremos la opción de '''Custom on fail''' que nos permite tomar una acción si el valor no esta dentro del rango deseado.
  '''- Discar unchanged with heartbeat:''' Esto descarta los valores iguales y almacena cada X tiempo uno. Si no son iguales los almacena directamente.
'''Creamos las reglas de preprocesamiento para el item de CPU'''
CONFIGURATION -> HOSTS -> ITEMS -> CPU -> PREOPROCESSING -> Preprocessing steps -> Add
'''Preprocessing steps'''
'''In range                        :''' 0    100
'''Discard unchanged with heartbeat:''' 1m
[[File:CIPT04.png|1024px|thumb|center]]
===Laboratorio 3: Creación de Triggers===
[[File:CIPT05.png|1024px|thumb|center]]
'''Creamos un trigger de Warning para el item anterior.'''
'''Name              :''' {HOST.NAME} - % CPU idle es inferior al 60%
'''Operational data  :''' 60% Mdo Normal - Actual: {ITEM.LASTVALUE}
'''Problem expression :''' {zbxclient01:system.cpu.util[all,idle,avg1].last()}<=60
'''OK event generation:''' Expression
'''Allow manual close :''' Check
'''Description        :''' % CPU usage es inferior al 60%
[[File:CIPT06.png|1024px|thumb|center]]
'''Creamos un trigger de High para el item anterior.'''
'''Name              :''' {HOST.NAME} - % CPU idle es inferior al 5%
'''Operational data  :''' >60% Modo Normal - Actual: {ITEM.LASTVALUE}
'''Problem expression :''' {zbxclient01:system.cpu.util[all,idle,avg1].last()}<=5
'''OK event generation:''' Expression
'''Allow manual close :''' Check
'''Description        :''' % CPU usage es superior al 95%
[[File:CIPT07.png|1024px|thumb|center]]
'''Simularemos algo de carga para ver si el trigger de Warning se dispara.'''
[root@zbxclient01 system]# stress -c 1
stress: info: [19754] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
[[File:CIPT08.png|1024px|thumb|center]]
'''Simularemos algo de carga para ver si el trigger de High se dispara.'''
[root@zbxclient01 system]# stress -c 2
stress: info: [19754] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
[[File:CIPT09.png|1024px|thumb|center]]
Vemos que los dos triggers están activos al mismo tiempo. Esto es correcto pero confunde la visualización ya que es obvio que si el de High se dispara el de Warning tambien estara activo. Para solucionar esto podemos utilizar la dependencia entre triggers.
===Laboratorio 4: Dependencia entre triggers===
[[File:CIPT10.png|1024px|thumb|center|Una vez dentro del trigger de Warning seleccionamos de quien depende]]
[[File:CIPT11.png|1024px|thumb|center|Vemos como se visualiza la dependencia]]
[[File:CIPT12.png|1024px|thumb|center|Vemos como se oculta el Trigger de Warning y solo se ve el de High]]
'''Nota:''' No es una buena práctica crear Items y triggers de forma local en los hosts, son muy difíciles de gestionar. Para evitar esta mala práctica, existen los Templates.
=Sección=
==Creación y configuración de Templates==
===Introducción===
Ahora que ya sabemos como crear Items y triggers en un Host, vamos a ver como crearlos en un Template.
Un Template o Plantilla es una agrupación de Aplicaciones, items, triggers, gráficos, screens y discovers. Básicamente definiremos todo lo anterior de la forma más genérica posible y luego lo aplicaremos a un grupo de Hosts.
'''Template  :''' Es una agrupación de Items, Aplicaciones, Triggers, Gráficos, Srceens, Discoverys y Web Scenarios.
'''Aplicación:''' Es una agrupación de Items. Nos resultará útil para filtrar cuando busquemos datos en tiempo real.
'''Item      :''' Es el elemento que quiero monitorizar. Nos retornará un valor que luego procesaremos y al cual aplicaremos los triggers.
'''Trigger  :''' Es una expresión lógica de un problema y cuando todas sus condiciones retornan TRUE es cuando se dispara.
'''Gráficos  :''' Es la representación gráfica del valor recuperado en el tiempo.
'''Screens  :''' Es la visualización de varios gráficos en una sola pantalla.
'''Discovery :''' Nos permite crear items prototypes, triggers prototypes, de forma dinámica. Por ejemplo si vemos los templates de Linux o Windows, estos utilizan discoverys para auto-descubrir los filesystems, crean triggers para cada uno de los ítems descubiertos.
'''Web Scenarios:''' Esta es la forma de crear chequeos WEBs. Por ejemplo si queremos ver si una aplicación web está funcionando o el tiempo en que tarda en cargar, podemos crear un chequeo de este tipo. No es de lo más intuitivo, generalmente lo utilizo para ver si una web está activa, por ejemplo una con IIS y si da error, ejecutó una acción automática que es reiniciar el servicio.
===Laboratorio 1: Template General===
====Introducción====
En el siguiente Lab vamos a crear y probar los principales tipos de ítems que incorpora Zabbix. Para ello crearemos un template donde crearemos estos ítems y los aplicaremos al cliente zbxclient01.
'''Crearemos un template utilizando Zabbix Frontend.'''
CONFIGURATION -> TEMPLATE -> Create Template
'''  Template name          :''' Template App Zabbix-ES Multi-Items
'''  Visible name          :'''
'''  Groups                :''' Templates
'''  Description            :''' Ejemplo de creación de template
====Creación de Ítem tipo SSH agent====
Este tipo de ítem, nos permite ejecutar comandos vía SSH contra el host remoto.
'''Creamos el Ítem de SSH Agent.
'''Name                  :''' FreeMemSSH
'''Type                  :''' SSH agent
'''Key                  :''' ssh.run[free,{HOST.CONN},,] '''<- ssh.run[<unique short description>,<ip>,<port>,<encoding>]'''
'''Authentication method :''' Password
'''User name            :''' root
'''Password              :''' vagrant
'''Executed script      :''' free -b
'''Type of information  :''' Text
'''Update interval      :''' 10s
'''History storage period:''' 90d
'''New application      :''' SSH agent
'''Description          :'''
[[File:LAB01TG03.png|1024px|thumb|center|Creación del Ítem]]
'''Aplicamos el Template al Host zbxclient01'''
CONFIGURATION -> HOSTS -> zbxclient01 -> TEMPLATES -> Linked Templates -> ADD -> Template App Zabbix-ES Multi-Items -> UPDATE
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Retornara'''
[root@zbxclient01 ~]# free -b
              total        used        free      shared  buff/cache  available
Mem:    1039007744  104611840  808525824    20103168  125870080  788234240
Swap:    2147479552          0  2147479552
'''Vamos a ver como esta recolectando los datos'''
MONITORING -> LATEST DATA -> FILTER -> HOSTS -> zbxclient01
====Creación de Ítem tipo Dependent ítem====
Este tipo de ítem depende de otro recolectado anteriormente. Lo bueno es que con una sola llamada podemos crear múltiples items via las reglas de preprocesamiento.
Para este ejemplo utilizaremos el ítem anteriormente creado, pero antes vamos a ajustar el History storage period del Ítem SSH Agent ya que no queremos que guarde nada, simplemente lo utilizaremos como contenedor temporal hasta que lo preprocesemos.
CONFIGURATION > HOSTS > ZBXCLIENT01 > ITEMS > FreeMemSSH
'''History storage period:''' Do not keet history
'''Creamos el item dependiente del Master item (FreeMemSSH)
'''Name                  :''' SwapFree
'''Type                  :''' Dependent item
'''Key                  :''' SwapFree
'''Master item          :''' FreeMemSSH
'''Type of information  :''' Numeric (unsigned)
'''Units                :''' b
'''New application      :''' SSH agent y Dependent item
'''Description          :'''
'''Preprocessing steps'''
'''Regular Expression    :''' Swap:\s+(\d+)\s+(\d+)\s+(\d+)  \3
'''Custom on fail        :''' Set Value to    0
[[File:LAB01TG04.png|1024px|thumb|center|Creación del Ítem de SwapFree]]
[[File:LAB01TG05.png|1024px|thumb|center|Definición de las reglas de preprocesamiento]]
'''Creamos el item dependiente del Master item (FreeMemSSH)
'''Name                  :''' SwapTotal
'''Type                  :''' Dependent item
'''Key                  :''' SwapTotal
'''Master item          :''' FreeMemSSH
'''Type of information  :''' Numeric (unsigned)
'''Units                :''' b
'''New application      :''' SSH agent y Dependent item
'''Description          :'''
'''Preprocessing steps'''
'''Regular Expression    :''' Swap:\s+(\d+)\s+(\d+)\s+(\d+)  \1
'''Custom on fail        :''' Set Value to    1
[[File:LAB01TG06.png|1024px|thumb|center|Creación del Ítem de SwapTotal]]
[[File:LAB01TG07.png|1024px|thumb|center|Definición de las reglas de preprocesamiento]]
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
====Creación de Ítem tipo Calculated====
Este tipo de ítem nos resulta útil cuando queremos calcular valores entre ítems ya se encuentran en la base de datos de zabbix.
'''Creamos el item de tipo calculado para sacar el porcentaje de SWAP libre.'''
'''Name                :''' % Swap Free
'''Type                :''' Calculated
'''Key                :''' SwapFreePercent
'''Formula            :''' 100-(last(SwapFree)/(last(SwapTotal) + count("SwapTotal",#1,0)))
'''Type of information :''' Numeric (float)
'''Units              :''' %
'''Update interval    :''' 10s
'''New application    :''' Calculated
'''Description        :'''
'''Nota:''' Cambia el 0 por 1 pero no cambia nada si el divisor no es 0. Cuenta si el último valor es 0 si encuentra un 0 la cuenta retorna 1 con lo cual al valor del swap que es 0 le suma 1 y si no encuentra un 0 retorna swap + 0 y en ningún caso hay división por 0.
'''Mas Info:''' https://www.zabbix.com/forum/zabbix-help/21474-the-problem-of-division-by-zero
[[File:LAB01TG08.png|1024px|thumb|center|Creación del Ítem calculado de los valores de SwapFree y SwapTotal]]
'''Creamos un trigger de Warning para el item anterior.'''
'''Name              :''' {HOST.NAME} - %Free SWAP es inferior al 80%
'''Operational data  :''' Actual: {ITEM.LASTVALUE}
'''Problem expression :''' {Template App Zabbix-ES Multi-Items:SwapFreePercent.min(#3)}<=80
'''OK event generation:''' Expression
'''Allow manual close :''' Check
'''Description        :'''
[[File:LAB01TG12.png|1024px|thumb|center|Creamos un trigger para el ítem anterior]]
'''Creamos un trigger que se disparara cuando el SWAP sea CERO o esté desactivada.'''
'''Name              :''' {HOST.NAME} - Free SWAP es 0 o esta desactivada.
'''Operational data  :''' Actual: {ITEM.LASTVALUE}
'''Problem expression :''' {Template App Zabbix-ES Multi-Items:SwapFree.min(#3)}=0
'''OK event generation:''' Expression
'''Allow manual close :''' Check
'''Description        :'''
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Probamos el Trigger'''
Vamos al cliente y desactivamos el SWAP
[root@zbxclient01 ~]# swapoff -a
[root@zbxclient01 ~]# free
              total        used        free      shared  buff/cache  available
Mem:        1014656      88304      811704      13380      114648      790876
Swap:            0          0          0
[root@zbxclient01 ~]# swapon -a
====Creación de Ítem tipo Zabbix Aggregated====
Este tipo de ítem nos permite agregar resultados de ítems ya recolectados por Zabbix realizando consultas a la base de datos directamente, trabaja sobre los Hosts dentro de un Host Group y busca claves que coincidan aplicando diferentes funciones como Máximo, Mínimo, Promedio, Contar o Sumar. En mi caso lo utilizo bastante cuando tenemos la misma métrica aplicada a diferentes Hosts y en cada uno puede dar diferentes valores.
Por ejemplo si tenemos un cluster de dos nodos y queremos monitorizar que los recursos del mismo están activos, pero hay recursos que solo pueden estar en uno de los dos nodos al mismo tiempo (Ej. la IP de servicio) y si no están en ninguno o en los dos, se podría considerar un fallo. En estos casos nos ayuda mucho este tipo de Ítems.
Como no tenemos un cluster vamos a simular que los hosts zbxclient01 y zbxprxy01 serán los nodos de nuestro cluster y el recurso será un fichero en el FileSystem, si este fichero existe, el recurso estará activo, de lo contrario se tomará como que no lo está y por consiguiente se considerará un fallo en el cluster.
[[File:ClusterZabbix-ES.png|1024px||center|Arquitectura a simular]]
'''Primero veremos la estructura de la Key del Item'''
groupfunc["host group","item key",itemfunc,timeperiod]
'''groupfunc :''' Define el tipo de agrupamiento que realizará.
          grpavg Valor Promedio
          grpmax Valor Máximo
          grpmin Valor Mínimo
          grpsum Suma de Valores
'''host group:''' Es el host Group donde buscará las coincidencias de las Keys.
'''item key  :''' Es la clave que buscara en los Hosts que están en el Host Group anterior.
'''itemfunc  :''' Es el tipo de función que aplicaremos Promedio, Contar, Último Valor, Máximo, Mínimo o Suma.
'''timeperiod:''' Especifica un periodo de tiempo de la última recolección de valores.
'''Creamos el Ítem que verifica si el fichero existe en disco.'''
'''Name                :''' NodoPrimario
'''Type                :''' Zabbix agent
'''Key                :''' vfs.file.exists[/nodo_activo]
'''Type of information :''' Numeric (unsigned)
'''Units              :'''
'''Update interval    :''' 3s
'''New application    :''' ClusterAPP
'''Description        :''' Checks if file exists. Returns 0 - not found; 1 - regular file or a link (symbolic or hard) to regular file exists
Verifica si existe el fichero /nodo_activo de ser así retorna 1 sino retorma 0.
'''Ahora aplicamos el Template al zbxprxy01 que sera nuestro nodo de respaldo en el cluster.'''
CONFIGURING -> HOSTS -> zbxprxy01 -> Templates -> Add -> Template App Zabbix-ES Multi-Items
Esto simula si un recurso está o no activo en uno de los nodos del cluster.
[[File:LAB01TG14.png|1024px|thumb|center|Creamos el Ítem que verificará el recurso en los Nodos]]
'''Creamos el Host Group y agregamos los 2 (zbxclient01 y zbxprxy01) nodos a él.'''
'''Group Name          :''' Cluster Zabbix-ES
[[File:LAB01TG16.png|1024px|thumb|center|Creamos el Host Group]]
'''Asignamos los hosts al nuevo Grupo'''
[[File:LAB01TG17.png|1024px|thumb|center|Asignar el nodo1 al nuevo HG]]
[[File:LAB01TG18.png|1024px|thumb|center|Asignar el nodo2 al nuevo HG]]
'''Crearemos un template utilizando Zabbix Frontend que verifique y monitorizará los nodos..'''
CONFIGURATION -> TEMPLATE -> Create Template
'''  Template name          :''' Template App Zabbix-ES Cluster
'''  Visible name          :'''
'''  Groups                :''' Templates
'''  Description            :''' Verifica si el recurso de FS esta Activo.
[[File:LAB01TG25.png|1024px|thumb|center|Creamos el Template]]
'''Crearemos el item agregado que verificara si el recurso esta activo en alguno de los nodos'''
CONFIGURATION -> TEMPLATES -> Template App Zabbix-ES Cluster -> ITEMS -> Create Item
'''Name                :''' Cluster Activo
'''Type                :''' Zabbix Aggregate
'''Key                :''' grpsum["Cluster Zabbix-ES","vfs.file.exists[/nodo_activo]",last,0]
'''Type of information :''' Numeric (Unsigned)
'''Update interval    :''' 3s
'''New application    :''' ClusterAPP
'''Description        :'''
[[File:LAB01TG26.png|1024px|thumb|center|Creamos el Item]]
'''Creamos un trigger de High para verificar si el cluster esta activo .'''
'''Name              :''' {HOST.NAME} - Cluster Down
'''Problem expression :''' {Template App Zabbix-ES Cluster:grpsum["Cluster Zabbix-ES","vfs.file.exists[/nodo_activo]",last,0].last(#1)}<1
'''OK event generation:''' Expression
'''Allow manual close :''' Check
'''Description        :''' Verifica si el recurso esta en uno de los nodos del cluster.
[[File:LAB01TG27.png|1024px|thumb|center|Creamos el Trigger]]
'''Creamos un Pseudo-Host que funcionara como nuestro Cluster ficticio.'''
CONFIGURATION -> HOSTS -> Create Host
'''Host name        :''' Cluster Zabbix-ES
'''Group            :''' Pseudo-Hosts
'''Agent interfaces  : 127.0.0.1
TEMPLATES -> Add -> Template App Zabbix-ES Cluster
[[File:LAB01TG21.png|1024px|thumb|center|Creamos el Pseudo-Host]]
[[File:LAB01TG22.png|1024px|thumb|center|Asignamos el Template de Cluster a este Host]]
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Verificamos los valore recolectados por los nodos'''
MONITORING -> LATEST DATA -> Application -> ClusterAPP
'''Si todos están en CERO, el trigger tiene que estar activo'''
MONITORING -> PROBLEMS
  '''Activamos el recurso en uno de los dos nodos zbxclient01 y verificamos si nuestro cluster se recupera.'''
  '''# touch /nodo_activo'''
'''Introducimos un fallo y verificamos como se dispara el Trigger.'''
  '''# rm -f /nodo_activo'''
[[File:LAB01TG23.png|1024px|thumb|center|Comprobamos fallo en el recurso]]
[[File:LAB01TG24.png|1024px|thumb|center|Verificamos que no hay datos en ninguno de los 2 nodos por consiguiente tampoco en el item agregado.]]
====Creación de Ítem tipo External Check====
Este tipo de ítem nos resulta útil cuando no tenemos forma de verificar el dispositivo utilizando los métodos convencionales, para esto tenemos los externals checks, que son básicamente cualquier cosa que podamos ejecutar y luego procesar los resultados.
Es importante entender que todos los scripts que utilicemos tendrán que estar en un PATH determinado ('''/usr/lib/zabbix/externalscripts''') este path se puede modificar cambiando la opción '''ExternalScripts''' en el fichero zabbis_server.conf.
En el host zbxsrv01 dentro del directorio '''/vagran''' tenemos un script llamado '''ResponseTimeCURL.sh''' este script es un bash que básicamente llama a un CURL que se conecta con una WEB y toma unas mediciones, el resultado lo devuelve como un JSON con el siguiente formato:
# /vagrant/ResponseTimeCURL.sh www.google.com | jq
{
  "http_code": 200,
  "size_download": 5918,
  "size_header": 698,
  "size_request": 125,
  "size_upload": 0,
  "speed_download": 54591,
  "speed_upload": 0,
  "connect": 0.037,
  "namelookup": 0.016,
  "starttransfer": 0.108,
  "appconnect": 0,
  "pretransfer": 0.038,
  "redirect": 0,
  "total": 0.108
}
De estos valores nos quedaremos con Total y StartTransfer, el resto os dejo a vosotros que los investigueis.
'''starttransfer:''' Es el tiempo en segundos, desde el inicio de la comunicación hasta que comienza a transferir el primer byte.
'''total        :''' Es el tiempo total en segundos hasta que la operación termina por completo.
'''Copiamos el script dentro del Path indicado para que Zabbix lo pueda utilizar.'''
[root@zbxsrv01 ~]# cp /vagrant/ResponseTimeCURL.sh /usr/lib/zabbix/externalscripts
[root@zbxsrv01 ~]# chmod 755 /usr/lib/zabbix/externalscripts/ResponseTimeCURL.sh
'''Nota:'''Si da error el scrip al ejecutarlo del tipo -bash: /usr/lib/zabbix/externalscripts/ResponseTimeCURL.sh: /bin/bash^M: bad interpreter: No such file or directory es por el retorno de carro, se tiene que ejecutar lo siguiente para solventar el problema:
# dos2unix /usr/lib/zabbix/externalscripts/ResponseTimeCURL.sh
'''Ahora vemos a crear un item que monitorice el tiempo de respuesta de una página web.'''
'''Name                  :''' Google Response Time
'''Type                  :''' External check
'''Key                    :''' ResponseTimeCURL.sh[[http://www.google.com http://www.google.com]]
'''Type of information    :''' Text
'''Update interval        :''' 5s
'''History storage period :''' Do not keep history
'''New application        :''' External check
'''Description            :'''
[[File:LAB01TG28.png|1024px|thumb|center|Creación del Ítem de External Check]]
'''Creación del Ítem Dependiente StartTransferTime'''
'''Name                :''' StartTransferTime
'''Type                :''' Dependent item
'''Key                :''' google.starttransfer
'''Type of information :''' Numeric (float)
'''Units              :''' s
'''New application    :''' Dependent item y External check
'''Description        :'''
'''Preprocessing steps'''
'''JSONPath            :''' $.starttransfer
[[File:LAB01TG29.png|1024px|thumb|center|Creación del Ítem Dependiente StartTransferTime]]
[[File:LAB01TG30.png|1024px|thumb|center|Con las reglas de preprocesamiento extraemos el valor deseado]]
'''Creación del Ítem Dependiente TotalTime'''
'''Name                :''' TotalTime
'''Type                :''' Dependent item
'''Key                :''' google.total
'''Type of information :''' Numeric (float)
'''Units              :''' s
'''New application    :''' Dependent item y External check
'''Description        :'''
'''Preprocessing steps'''
'''JSONPath            :''' $.total
[[File:LAB01TG31.png|1024px|thumb|center|Creación del Ítem Dependiente Total Time]]
[[File:LAB01TG32.png|1024px|thumb|center|Con las reglas de preprocesamiento extraemos el valor deseado]]
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Verificamos que los datos se están recolectando correctamente.'''
MONITORIUNG -> LATEST DATA -> HOST: zbxclient01 -> External check
[[File:LAB01TG33.png|1024px|thumb|center|Con las reglas de preprocesamiento extraemos el valor deseado]]
====Creación de Ítem tipo Simple Check====
Este tipo de ítem se lo utiliza para chequear servicios remotos sin la necesidad de un agente instalado. Es el propio Zabbix Server quien los chequea.
'''Creamos el ítem'''
'''Name                :''' Simple Check TCP Perf - Google.com
'''Type                :''' Simple check
'''Key                :''' net.tcp.service.perf[http,www.google.com]
'''Type of information :''' Numeric (float)
'''Units              :''' s
'''Update interval    :''' 3s
'''New application    :''' Simple check
'''Description        :''' Checks performance of TCP service. Returns 0 - service is down; seconds - the number of seconds spent while connecting to the service
[[File:LAB01TG09.png|1024px|thumb|center|Creación del Ítem]]
'''Creamos un trigger de Warning para el ítem anterior.'''
'''Name              :''' {HOST.NAME} - Conection to www.google.com is very slow
'''Operational data  :''' Actual: {ITEM.LASTVALUE}
'''Problem expression :''' {Template App Zabbix-ES Multi-Items:net.tcp.service.perf[http,www.google.com].max(3)}>=0.05
'''OK event generation:''' Expression
'''Allow manual close :''' Check
'''Description        :'''
[[File:LAB01TG11.png|1024px|thumb|center|Creamos un trigger para el ítem anterior]]
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Verificamos que los datos se están recolectando correctamente.'''
MONITORIUNG -> LATEST DATA -> HOST: zbxclient01 -> Application: Simple check
====Creación de Ítem tipo Zabbix Trapper====
Este tipo de ítem es muy útil ya que no es Zabbix quien tiene que solicitar el dato, sino que está esperando a que se lo envíen.
El Server, Agent y el Proxy tiene un timeout máximo de 30 segundos, esto quiere decir que cualquier ítem a recolectar que tarde mas de ese tiempo es descartado. En algunos casos la recolección de datos dura más de 30 segundos, en este caso podemos utilizar el Zabbix Trapper.
Para poder utilizar esto necesitamos instalar una utilidad que se llama '''zabbix_sender''', esta nos permite enviar traps a un Host específico.
'''Creamos en el Zabbix Server el Ítem tipo Trapper'''
'''Name                :''' Zabbix Trapper
'''Type                :''' Zabbix Trapper
'''Key                :''' zbx.get.trapper
'''Type of information :''' Text
'''Description        :''' Recibe un trap vía Zabbix_sender
[[File:LAB01TG34.png|1024px|thumb|center|Creamos el Ítem de Zabbix Trapper]]
'''Refrescamos la caché en el server'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''En el zbxclient01 instalamos el Zabbix Sender'''
[root@zbxclient01 ~]# yum install -y zabbix-sender
Bueno ya tenemos configurado el Ítem en el Server, en un template que esta linkeado a un host y el cliente tenemos instalado el zabbix_sender, ya estamos listos para hacer una prueba, pero antes de realizarla, vamos a ver algunas de las opciones principales de Zabbix Sender
 
'''-z''' - Especificamos la IP del Zabbix Server
'''-p''' - Especificamos el puerto del Zabbix Server (Por defecto es 10051)
'''-s''' - Especificamos el HOST donde enviaremos el Trap. Importante definir el nombre del host y no el visible.
'''-k''' - Especificamos la Key
'''-o''' - Especificamos el valor a enviar.
[root@zbxclient01 ~]# /usr/bin/zabbix_sender -z 10.0.100.100 -p 10051 -s "zbxclient01" -k zbx.get.trapper -o "Esto es una prueba de trap 1."
Response from "10.0.100.100:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000026"
sent: 1; skipped: 0; total: 1
[root@zbxclient01 ~]# echo "zbxclient01 zbx.get.trapper Esto es una prueba de trap 2." | /usr/bin/zabbix_sender -c /etc/zabbix/zabbix_agentd.conf -i -
Response from "10.0.100.100:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000023"
sent: 1; skipped: 0; total: 1
'''Nota:''' Mas informacion del comando en [https://www.zabbix.com/documentation/4.4/manpages/zabbix_sender Zabbix Docs]
'''En el Server verificamos desde Latest Data si los datos están llegando'''
[[File:LAB01TG35.png|1024px|thumb|center|Latest Data]]
'''Creamos un trigger de Información para verificar si se recibe un trap y que se cierra a los 30 segundos automaticamente.'''
'''Name              :''' {HOST.NAME} - Zabbix Trap Received
'''Problem expression :''' {Template App Zabbix-ES Multi-Items:zbx.get.trapper.nodata(1s)}=0
'''OK event generation:''' Recovery expression
'''Recovery expression:''' {Template App Zabbix-ES Multi-Items:zbx.get.trapper.nodata(30s)}=1
'''Allow manual close :''' Check
'''Description        :''' Detecta si un trap es recibido.
[[File:LAB01TG37.png|1024px|thumb|center|Creamos un Trigger que se cierra automáticamente a los 30 segundos]]
'''Releemos la configuración para que se apliquen los cambio del Template'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Enviamos un Trap desde el zbxclient01'''
[root@zbxclient01 ~]# zabbix_sender -z 10.0.100.100 -s zbxclient01 -k zbx.get.trapper -o "Envio Trap 1"   
Response from "10.0.100.100:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000026"
sent: 1; skipped: 0; total: 1
'''Verificamos si tenemos alguna alarma activa por el trap recibido.'''
MONITORIUNG -> Problems
'''NOTA:''' Como este trigger tiene una recovery expression a los 30s, se recuperara de forma automática.
====Creación de Ítem tipo SNMPv2 Agent====
Este tipo de ítem es el más conocido, se  puede acceder a todos los dispositivos que utilicen SNMP sin necesidad de un Agente en local.
Lo más importante de este ítem es saber la mib que tenemos que llamar, la comunidad y que tipo de dato retorna.
'''''También es muy importante para que funcione correctamente tener creada y configurada la interfaz de SNMP en el Host.'''''
'''Instalamos en zbxclient01 las herramientas de SNMP y arrancamos el servicio de SNMPD'''
[root@zbxclient01]# yum install -y net-snmp net-snmp-utils
[root@zbxclient01]# systemctl enable snmpd
[root@zbxclient01]# systemctl start snmpd
'''Probamos que el agente de SNMP este activo.'''
[root@zbxclient01]# snmpget -On -v 2c -c public 10.0.100.101 .1.3.6.1.2.1.25.1.1.0   
.1.3.6.1.2.1.25.1.1.0 = Timeticks: (1018870) 2:49:48.70
'''En Zabbix Server creamos la interfaz de SNMP en el Host'''
[[File:LAB01TG38.png|1024px|thumb|center|Creamos la interfaz de SNMP en el Host]]
'''En Zabbix Server creamos un ítem de tipo SNMPv2 Agent'''
'''Name                :''' Uptime
'''Type                :''' SNMPv2 agent
'''Key                :''' snmpv2[1.3.6.1.2.1.25.1.1.0]
'''SNMP OID            :''' .1.3.6.1.2.1.25.1.1.0
'''SNMP community      :''' public
'''Type of information :''' Numeric (unsigned)
'''Units              :''' uptime
'''Update interval    :''' 10s
'''New application    :''' SNMPv2 Agent
'''Description        :'''
[[File:LAB01TG39.png|1024px|thumb|center|Creamos un ítem de tipo SNMPv2 Agent]]
'''Preprocessing steps'''
'''Custom Multiplier  :''' 0.01
[[File:LAB01TG40.png|1024px|thumb|center|Preprocesamiento del dato]]
'''Refrescamos la caché en el server'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Verificamos que los datos se están recolectando correctamente.'''
MONITORIUNG -> LATEST DATA -> HOST: zbxclient01 -> Application: SNMPv2 Agent
====Creación de Ítem tipo Zabbix internal====
Este tipo de ítems lee de la base de datos información del zabbix.
'''Creamos el ítem de tipo Zabbix Internal'''
'''Name                :''' Zabbix History
'''Type                :''' Zabbix Internal
'''Key                :''' zabbix[history]
'''Type of information :''' Numeric (unsigned)
'''Units              :'''
'''Update interval    :''' 1m
'''New application    :''' Zabbix Internal
'''Description        :''' Number of values stored in table HISTORY.
[[File:LAB01TG10.png|1024px|thumb|center|Creación del Ítem]]
'''Refrescamos la caché en el server'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
====Creación de Ítem tipo Zabbix agent (pasive)====
'''Creamos un ítem que utiliza una función propia del zabbix agent.'''
'''Name                :''' kernel.maxfiles
'''Type                :''' Zabbix agent
'''Key                :''' kernel.maxfiles
'''Type of information :''' Numeric (unsigned)
'''Update interval    :''' 10s
'''New application    :''' Zabbix agent
'''Description        :''' Maximum number of processes supported by OS. Returns integer
[[File:LAB01TG13.png|1024px|thumb|center|Creación del Ítem]]
'''Refrescamos la caché en el server'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
====Creación de Ítem tipo Zabbix agent (active) - Log file monitoring====
'''Creamos el ítem de tipo zabbix agent active'''
'''Name                :''' ORA-00600
'''Type                :''' Zabbix agent (active)
'''Key                :''' log["/var/log/messages","ORA-00600",,,skip,]
'''Type of information :''' Log
'''Update interval    :''' 30s
'''New application    :''' Zabbix agent (active)
'''Description        :''' This is the generic internal error number for Oracle program exceptions. It indicates that a process has encountered a low-level, unexpected condition.
[[File:LAB01TG01.png|1024px|thumb|center|Creación del Ítem]]
'''Creamos un trigger de High para el ítem anterior.'''
'''Name              :''' {HOST.NAME} - ORA-00600 Error detected
'''Operational data  :''' Actual: {ITEM.LASTVALUE}
'''Problem expression :''' {Template App Zabbix-ES Multi-Items:log["/var/log/messages","ORA-00600",,,skip,].regexp(ORA-00600)}=1
'''OK event generation:''' Expression
'''Description        :''' This is the generic internal error number for Oracle program exceptions. It indicates that a process has encountered a low-level, unexpected condition.
[[File:LAB01TG02.png|1024px|thumb|center|Creación del Trigger]]
'''Refrescamos la caché en el server'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
=====Preparamos el agente y hacemos una prueba=====
'''Asignamos permisos al usuario zabbix para que pueda leer el /var/log/messages'''
[root@zbxclient01 ~]# setfacl -m u:zabbix:r /var/log/messages
'''Nota:''' Hacemos esto ya que el Agente de Zabbix se ejecuta nativamente con el usuario ZABBIX y este no tiene permisos para leer el log. Si no realizamos esto, podemos obtener el error: Cannot open file "/var/log/messages": [13] Permission denied'''
'''Reiniciamos el Agente'''
[root@zbxclient01 ~]# systemctl restart zabbix-agent.service
[root@zbxclient01 ~]# systemctl status zabbix-agent.service
'''Monitorizamos el Log en una ventana'''
[root@zbxclient01 ~]# tail -f /var/log/messages
'''Generamos un evento en otra ventana'''
[root@zbxclient01 ~]# logger "ORA-00600: internal error code, arguments: [2662], [2910], [829087674], [2910], [829528307], [1451708231]"
'''Verificamos que el trigger se dispara (hay que esperar unos 30s)'''
MONITORIUNG -> PROBLEMS
===Laboratorio 2: Low-Level Discovery===
====Introducción====
El Low-level discovery o LLD nos permite crear de forma automática items, triggers y gráficos. Este es el principal beneficio del LLD, que auto descubra los elementos que queremos monitorizar de forma autónoma y cree los ítems y triggers según el elemento sea descubierto.
Por ejemplo Zabbix puede monitorizar Filesystems o Interfaces de red de forma automática, sin tener que crearlas manualmente. También se pueden eliminar entidades auto descubiertas de forma automatica segun los resultados del discovery que se realiza periódicamente. Es decir si eliminamos un filesystems, el autodiscovery periodico ya no lo descubrirá y Zabbix lo eliminara posteriormente.
'''Nota: ''' Desde la versión de Zabbix 4.2 el formato del JSON que acepta el LLD cambio. Ya no espera que contenga el objeto '''data''' como se puede ver en algunos documentos antiguos. Esto es importante de cara al montaje del los LLDs. Los actuales LLDs aceptan un JSON que contenga un array, esto es para poder soportar nuevas funcionalidades como el item value preprocessing y los customs paths para las macros de los LLDs.
'''Formato anterior a Zabbix 4.2'''
{
"data":[
{ "{#FSNAME}":"/",                  "{#FSTYPE}":"rootfs"  },
{ "{#FSNAME}":"/tmp",                "{#FSTYPE}":"ext3"    },
{ "{#FSNAME}":"/var",                "{#FSTYPE}":"ext3"    }
]
}
'''Formato posterior a Zabbix 4.2'''
[
{ "{#FSNAME}":"/",                          "{#FSTYPE}":"rootfs"  },
{ "{#FSNAME}":"/tmp",                        "{#FSTYPE}":"ext3"    },
{ "{#FSNAME}":"/var",                        "{#FSTYPE}":"ext3"    }
]
'''Zabbix trae un conjunto de Discoverys ya implementados como pueden ser:'''
discovery of network interfaces
discovery of CPUs and CPU cores
discovery of SNMP OIDs
discovery of JMX objects
discovery using ODBC SQL queries
discovery of Windows services
discovery of host interfaces in Zabbix
Para mas información ver documentación de Zabbix 4.2 o superior: https://www.zabbix.com/documentation/current/manual/discovery/low_level_discovery
====Low Level Discovery utilizando Zabbix Agent + UserParameter====
'''Preparamos la Regla de Autodiscover en el Zabbix Agent'''
[root@zbxclient01 ~]# vi /etc/zabbix/zabbix_agentd.d/userparameter_lld.conf
UserParameter=lld.disk, /usr/bin/iostat -y 2>/dev/null | /usr/bin/sed -n '/Device/,$p' |  /usr/bin/awk 'BEGIN{sep="";print "["} NR!=1 { if($1) { print sep"{\"{#DEV}\":\""$1"\"}" } sep=","}END{print "]"}'
UserParameter=dev.putilization[*], /usr/bin/iostat -yx 1 2 $1 | /usr/bin/tail -2 | /usr/bin/head -1 | /usr/bin/awk '{print $NF}'
'''Nota:''' Este script genera una salida con el formato en JSON que espera la Discovery Rule.
[root@zbxclient01 ~]# systemctl restart zabbix-agent.service
'''Probamos si funciona el LLD'''
[root@zbxclient01 ~]# zabbix_get -s 127.0.0.1 -k lld.disk
[
  {"{#DEV}":"sda"}
]
'''Creamos la Discovery Rule desde el Zabbix Frontend'''
CONFIGURATION > TEMPLATES > Template App Zabbix-ES Multi-Items >  DISCOVERY RULES > CREATE DISCOVERY RULE
'''Name                      :''' LLD Devices
'''Type                      :''' Zabbix Agent
'''Key                        :''' lld.disk
'''Update interval            :''' 1m
'''Keep lost resources period :''' 30d
'''Creamos el Item prototype desde el Zabbix Frontend'''
CONFIGURATION > TEMPLATES > Template App Zabbix-ES Multi-Items >  DISCOVERY RULES > ITEM PROTOTYPES > CREATE ITEM PROTOTYPE
'''Name                      :''' % {#DEV} Utilization
'''Type                      :''' Zabbix Agent
'''Key                        :''' dev.putilization["{#DEV}"] <- ES LA KEY definida en el userparameter del agente que se le pasa como parámetro la macro del LLD
'''Type of information        :''' Numeric (float)
'''Units                      :''' %
'''Update interval            :''' 3s
'''New application            :''' Discovery rule
'''Creamos un Trigger Prototype desde el Zabbix Frontend'''
CONFIGURATION > TEMPLATES > Template App Zabbix-ES Multi-Items >  DISCOVERY RULES > TRIGGER PROTOTYPES > CREATE TRIGGER PROTOTYPE
'''Name                      :''' {HOST.NAME} - % High disk usage device: {#DEV}
'''Severity                  :''' HIGH
'''Expression                :''' {Template App Zabbix-ES Multi-Items:dev.putilization["{#DEV}"].avg(#3)}>=60
'''Allow manual close        :''' CHECK
'''Recargamos la Cache de configuración desde el Zabbix Server'''
[root@zbxsrv01 ~]# zabbix_server -R config_cache_reload
'''Forzamos el Discovery desde el Zabbix Frontend'''
CONFIGURATION > HOSTS > ZBXCLIENT01> DISCOVERY RULES > Check Now
'''Monitorizamos el disco'''
MONITORING > LATEST DATA > HOSTS: ZBXCLIENT01, APPLICATION: Discovery rule > APPLY
'''Generamos un poco de carga y vemos cómo se comporta el nuevo Trigger'''
[root@zbxclient01 ~]# dd if=/dev/sda of=/dev/null bs=1024
===Laboratorio 3: Integración de Zabbix con Prometheus===
====Introducción====
En el siguiente Lab vamos a ver una de las últimas funcionalidades que incorporó Zabbix, la integración nativa con los exporters de Prometheus.
Prometheus fue fundado por Sound Cloud en el 2012 y se libero el codigo en el 2015. Es bastante nuevo pero esta teniendo muy buena acogida porque es muy simple de instalar, monitorizar y esta soportado por la CNFC (Cloud Native Computing Fundation).
Es importante destacar que no es Prometheus:
  - No es un sistema de almacenamiento de Logs, no hace log tracking con lo que no podemos recolectar logs, eventos de logs o texto.
  - No detecta anomalías automáticamente.
  - No es escalable y no fue desarrollado para mantener un histórico de datos muy grande. Si bien se pueden guardar los datos en InfluxDB no
fue creado para esto.
  - No es una solución Unificada, tiene muchos componentes que interactúan entre si como Prometheus para recolectar, node_exporter para monitorizar, alert manager, cadviser, etc...
Que es prometheus:
  - Es una solución recomendada para monitorizar cloud, SaaS y OpenStack.
Para este laboratorio, no utilizaremos el Agente de Zabbix, sino un item HTTP que se conectara con un exporter de Prometheus. Esta funcionalidad se implementó hace muy poco en Zabbix y nos permite conectarnos a exporters de Prometheus de forma nativa y tratar las métricas obtenidas vía preprocesamiento.
https://openmetrics.io/
'''Incluir Ejemplos tipo:''' https://blog.zabbix.com/zabbix-4-2-prometheus-integration/7558/#08
====Instalación Exporter de Prometheus en zbxclient01====
[root@zbxclient01 system]# useradd -m -s /bin/bash prometheus
[root@zbxclient01 system]# su - prometheus
[prometheus@zbxclient01 ~]$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0-rc.1/node_exporter-0.16.0-rc.1.linux-amd64.tar.gz
[prometheus@zbxclient01 ~]$ tar -xzvf node_exporter-0.16.0-rc.1.linux-amd64.tar.gz
[prometheus@zbxclient01 ~]$ mv node_exporter-0.16.0-rc.1.linux-amd64 node_exporter
[prometheus@zbxclient01 ~]$ exit
[root@zbxclient01 system]# cat <<EOF >/etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
ExecStart=/home/prometheus/node_exporter/node_exporter
[Install]
WantedBy=default.target
EOF
[root@zbxclient01 system]# systemctl daemon-reload
[root@zbxclient01 system]# systemctl enable node_exporter.service
[root@zbxclient01 system]# systemctl start node_exporter.service
'''Acceso via URL:''' http://10.0.100.101:9100/metrics
====Creamos un Template para las pruebas contra Prometheus====
'''Template Name        :''' Template App Zabbix-ES Prometheus
'''Groups                :''' Templates
'''Description          :''' Template basado en un exporter de prometheus
[[File:TZProm01.png|1024px|thumb|center]]
'''Creamos una Macro en la que definimos el port del node_exporter'''
'''Macro                :''' {$NODE_EXPORTER_PORT}
'''Valor                :''' 9100
[[File:TZProm02.png|1024px|thumb|center]]
'''Aplicamos el Template al zbxclient01'''
CONFIGURATION > HOSTS > TEMPLATES > Link new templates
'''Creamos el Master Ítem con todos los datos que retorna el Node_exporter'''
'''Name                  :''' Master Item
'''Type                  :''' HTTP agent
'''Key                  :''' master[node_exporter]
'''URL                  :''' http://{HOST.CONN}:{$NODE_EXPORTER_PORT}/metrics
'''Request type          :''' GET
'''Type of information  :''' Text
'''Update interval      :''' 30s
'''History storage period:''' Do not keep history
'''New application      :''' Prometheus
'''Description          :''' Métricas de Prometheus Node_Exporter
[[File:TZProm03.png|1024px|thumb|center]]
[[File:TZProm04.png|1024px|thumb|center]]
'''Creamos un ítem Dependiente del Master para extraer un valor directamente vía Prometheus Pattern'''
'''Nota:''' Este ejemplo nos muestra cómo podemos acceder a los ítems de Prometheus vía '''Prometheus pattern''' con el parametro go_memstats_heap_inuse_bytes que retorna 4.358144e+06 y aplicando nuevamente preprocesamiento vía Javascript obtenemos 4358144
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
# TYPE go_memstats_heap_inuse_bytes gauge
go_memstats_heap_inuse_bytes 4.358144e+06
'''RETORNA:''' 4358144
'''Name                  :''' Heap InUse
'''Type                  :''' Dependent item
'''Key                  :''' go_memstats_heap_inuse_bytes[node_exporter]
'''URL                  :''' Master Item
'''Type of information  :''' Numeric (float)
'''Units                :''' b
'''New application      :''' Prometheus
'''Description          :''' Number of heap bytes that are in use.
[[File:TZProm05.png|1024px|thumb|center]]
'''Preprocessing steps'''
'''Name                  :''' Prometheus pattern
'''Parameters            :''' go_memstats_heap_inuse_bytes
'''Name                  :''' JavaScript
'''Parameters            :''' return Number(value)
[[File:TZProm06.png|1024px|thumb|center]]
'''Creamos una Discovery Rule y creamos las LDD Macros'''
'''Nota:''' Este ejemplo nos muestra cómo podemos acceder a los ítems de Prometheus vía '''Prometheus to JSON''' aplicando la expresión: node_network_receive_bytes_total{device=~".*"}
'''RETORNA:'''
[
  {
    "name": "node_network_receive_bytes_total",
    "value": "2.48981225e+08",
    "line_raw": "node_network_receive_bytes_total{device=\"eth0\"} 2.48981225e+08",
    "labels": {
      "device": "eth0"
    },
    "type": "counter",
    "help": "Network device statistic receive_bytes."
  },
  {
    "name": "node_network_receive_bytes_total",
    "value": "5.2624563e+07",
    "line_raw": "node_network_receive_bytes_total{device=\"eth1\"} 5.2624563e+07",
    "labels": {
      "device": "eth1"
    },
    "type": "counter",
    "help": "Network device statistic receive_bytes."
  },
  {
    "name": "node_network_receive_bytes_total",
    "value": "1.237289e+06",
    "line_raw": "node_network_receive_bytes_total{device=\"lo\"} 1.237289e+06",
    "labels": {
      "device": "lo"
    },
    "type": "counter",
    "help": "Network device statistic receive_bytes."
  }
]
'''Name                      :''' Low Level Discovery Network Devices
'''Type                      :''' Dependent item
'''Key                      :''' node_network_devices[node_exporter]
'''URL                      :''' Master Item
'''Keep lost resources period:''' 30d
[[File:TZProm07.png|1024px|thumb|center]]
'''Preprocessing steps'''
'''Name                      :''' Prometheus to JSON
'''Parameters                :''' node_network_receive_bytes_total{device=~".*"}
[[File:TZProm08.png|1024px|thumb|center]]
'''De este JSON extraemos las macros que utilizaremos en los Items Prototypes.'''
'''LLD Macros'''
'''Name                      :''' {#DEVICE}
'''Parameters                :''' $.labels.device
'''LLD macro                :''' {#HELP}
'''Parameters                :''' $.help
[[File:TZProm09.png|1024px|thumb|center]]
'''Creamos un item prototype utilizando las LLD Macros'''
'''Name                  :''' Network Total Receive {#DEVICE}
'''Type                  :''' Dependent item
'''Key                  :''' node_network_receive_bytes_total[{#DEVICE}]
'''URL                  :''' Master Item
'''Type of information  :''' Numeric (float)
'''Units                :''' b
'''New application      :''' Prometheus
'''Description          :''' Network device statistic receive_bytes.
[[File:TZProm10.png|1024px|thumb|center]]
[[File:TZProm11.png|1024px|thumb|center]]
'''Preprocessing steps'''
'''Name                      :''' Prometheus pattern
'''Parameters                :''' node_network_receive_bytes_total{device="{#DEVICE}"}
'''Name                      :''' JavaScript
'''Parameters                :''' return Number(value)
[[File:TZProm12.png|1024px|thumb|center]]
'''Más información en la documentación de Zabbix'''
https://www.zabbix.com/documentation/5.0/manual/config/items/itemtypes/prometheus
https://www.zabbix.com/documentation/5.0/manual/discovery/low_level_discovery/prometheus
===Ejercicio práctico: Añadir al host zbxclient01 el de Template OS Linux by Prom y confirmar si recolecta datos===
'''Objetivo:''' En este ejemplo vemos cómo podemos monitorizar un Linux con el Template por defecto que trae Zabbix Server para Prometheus.
====Resolución====
- Seleccionar el Host zbxclient01
- Seleccionar Templates
- Buscamos el template Template OS Linux by Prom y lo incluimos.
- Vamos a Latest Data para ver si se están recolectando los items.
  '''Nota:''' Recordar que para no esperar, debemos reiniciar la configuration Cache en Zabbix Server con el comando: '''zabbix_server -R config_cache_reload'''
'''IMPORTANTE:''' https://share.zabbix.com

Latest revision as of 12:16, 22 August 2020