Renacimiento del Blog e instalación de Zabbix

Renacimiento del Blog e instalación de Zabbix
Arde Bogotá - Cowboys De La A3

Hace bastante tiempo que no escribo por aquí, pero tras algún cambio de empresa y la adquisición de conocimientos más sólidos de Ansible, Zabbix y Python, incluso un poquito de Go, he decidido que algo me faltaba y era precisamente el placer de escribir por estos lares.

También le he dado una vuelta a la arquitectura del blog en AWS porque por el camino me he certificado como arquitecto asociado y me daba un poco de vergüenza cómo monté el blog en un principio. Ya tengo pendiente algún, o más bien, algunos posts, contando el proceso.

Para retomar el camino he decidido, entre los temas que tenía esbozados, empezar por uno de los que más me interesan, la monitorización y más concretamente, la herramienta de software libre Zabbix.

Llevo casi desde las primeras versiones de esta potente herramienta monitorizando los sistemas que tengo a mi cargo y, además, en mi último trabajo, tuve el placer de trabajar unas jornadas con la gente de Allenta, un saludo para Fernando desde aquí. Ese tiempo, que aún siendo escaso, me ayudó bastante a corregir ciertos defectos que solía cometer porque, seamos sinceros, con la vorágine del día a día nunca te fijas en las buenas prácticas de las soluciones con las que desarrollamos nuestro trabajo.

Mi idea es profundizar un poco, e incluso crear alguna monitorización que nos traiga el mundo real a nuestros paneles de control, pero no adelantemos acontecimientos, vamos con el primer paso, la instalación. Para ello hemos utilizado Ansible y espero poder subir a GitHub, desde mi GitLab privado, los playbooks generados, aunque tengo que limpiar bastantes datos y os lo referenciaré en un post futuro. Aquí vamos a ver los pasos que debemos realizar a mano.

En la página de descarga del proyecto, se puede seleccionar el conjunto de elementos que deseamos que conformen nuestra instalación de Zabbix para encontrar las instrucciones detalladas. Como ya hemos comentado, nosotros elegiremos Ubuntu, en el momento de escribir estas líneas ya han actualizado a la versión 24.04 LTS aunque prácticamente acaban de liberarla. Además la versión 7 de Zabbix todavía estaba en Beta cuando empecé con este post pero se acaba de liberar por lo que me ha tocado ajustar algunos comandos.

Los otros dos componentes a elegir en este formulario sería PostgreSQL y Nginx, y antes de pasar a la instalación del propio Zabbix debemos instalar la base de datos. He elegido esta base de datos porque llevo trabajando con ella desde mis inicios como profesional y, aunque ya sé que la propia Zabbix se desarrolla con MySQL, sé de buena tinta que el soporte de nuestra base de datos preferida también está bien cubierta. Para rizar el rizo vamos a utilizar la extensión de TimeScaleDB que también sé que es una forma de encasillarse en una configuración muy concreta, pero como he dicho, esta base de datos la tengo bastante más controlada que MySQL y además, en mi infraestructura local me sirve para más proyectos. Por último, como servidor web hemos elegido Nginx. Para empezar debemos instalar la base de datos y para ello debemos añadir el repositorio del propio proyecto:

$ curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
$ cat /etc/os-release | grep UBUNTU_CODENAME | cut -d'=' -f2
jammy

Este último valor lo añadiremos en el fichero /etc/apt/sources.list.d/pgdg.list, que crearemos para contener el repositorio en sí:

deb http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main

Y ya podemos actualizar los índices e instalar los paquetes:

$ sudo apt update
$ sudo apt install postgresql python3-psycopg2

El segundo paquete nos servirá para cuando instalemos los servicios mediante Ansible y como estoy siguiendo el playbook paso a paso lo incluyo aquí ya que nos puede ser útil para otros desarrollos.

Ahora debemos permitir los accesos desde Zabbix a la base de datos editando el archivo /etc/postgresql/16/main/pg_hba.conf y modificándolo para asegurarnos de que aparecen estas dos líneas:

[...]
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
[...]

Sí, ya sé que alguno se estará arrancando los ojos con esta muestra extrema de ciberseguridad, pero para una instalación sencilla nos basta con esta configuración, ya dedicaremos algún post a securizar toda nuestra infraestructura, como decimos siempre en nuestro día a día.

Ahora vamos con la instalación de la extensión TimeScaleDB mediante su repositorio, pero como siempre, primero su clave pública:

$ wget --quiet -O - https://packagecloud.io/timescale/timescaledb/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/timescaledb.gpg

Y su repositorio en el fichero /etc/apt/sources.list.d/timescaledb.list:

deb https://packagecloud.io/timescale/timescaledb/ubuntu/ jammy main

Actualizamos índices de paquetes e instalamos los necesarios:

$ sudo apt update
$ sudo apt install timescaledb-2-postgresql-16

En el momento de realizar este post la versión de PostgreSQL es la 16 por lo que hemos añadido este sufijo al nombre del paquete. Al terminar la instalación nos aconsejan ejecutar el siguiente comando:

$ sudo timescaledb-tune --quiet --yes

Una vez concluida su ejecución nos mostrará un resumen de los cambios realizados a la configuración de PostgreSQL para poder activar la extensión e incluso para optimizar la propia base de datos. En el playbook de Ansible tenemos algunas tareas que nos optimizan ya la base de datos pero, de nuevo, para una instalación sencilla nos basta con los valores por defecto. No debemos olvidar el reinicio del servicio de PostgreSQL:

$ sudo systemctl restart postgresql

Ahora creamos la base de datos y el usuario para que Zabbix pueda almacenar los datos:

$ sudo su - postgres
(postgres) $ createuser --pwprompt zabbix
Enter password for new role: ***********
Enter it again: ***********
(postgres) $ createdb -O zabbix zabbix

Antes de crear el esquema que utilizará el servidor debemos instalar los paquetes necesarios. Antes de ellos debemos añadir también el repositorio del proyecto:

$ wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1+ubuntu24.04_all.deb
$ sudo dpkg -i zabbix-release_7.0-1+ubuntu24.04_all.deb
$ sudo apt update

Con todos los repositorios configurados ya podemos instalar el resto de paquetes:

$ sudo apt install zabbix-server-pgsql zabbix-frontend-php php8.3-pgsql php8.3-curl zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2

Según las instrucciones de Zabbix se indica la instalación del agente versión 1, pero yo prefiero isntalar ya directamente la 2 que ya tiene bastante recorrido desde su lanzamiento. Con esta versión, desarrollada en Go incluso se puede incluir en él, código propio a modo de script externo que se solía utilizar para las partes de monitorización que no cubría el agente por defecto.

Si estuviéramos instalando los servicios en máquinas diferentes, como lo hacemos en el playbook de Ansible, ahora sería un buen momento de instalar los repositorios de PostgreSQL en la máquina de Zabbix para poder testear la conexión con la base de datos y la creación de los esquemas en la base de datos. Como no es el caso, el cliente psql se puede instalar directamente si no está instalado ya para poder crear el esquema :

$ sudo apt install postgresql-client-16
$ zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | sudo -u zabbix psql zabbix

Como hemos añadido trust en el fichero de acceso a la base de datos no necesitaremos la contraseña y terminada la ejecución ya tendremos preparada la base de datos de Zabbix. Ahora vamos con la extensión de TimeScaleDB:

$ echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u zabbix psql zabbix
CREATE EXTENSION
$ cat /usr/share/zabbix-sql-scripts/postgresql/timescaledb/schema.sql | sudo -u zabbix psql zabbix

Una vez preparada la base de datos debemos configurar correctamente el servidor de Zabbix mediante la edición del archivo /etc/zabbix/zabbix_server.conf y el cambio de las siguientes variables:

[...]
DBHost=localhost
[...]
DBName=zabbix
[...]
DBUser=zabbix
[...]
DBPassword=*********
[...]

Sólo restaría configurar Nginx, para ello creamos el fichero /etc/nginx/sites-available/zabbix-nginx con el siguiente contenido:

server {
    listen 80;

    root /usr/share/zabbix/;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html index.php;

    server_name zabbix-server;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }
}

Activamos la configuración, desactivamos la que viene por defecto, reiniciamos y activamos los servicios relacionados:

$ sudo ln -s /etc/nginx/sites-available/zabbix-nginx /etc/nginx/sites-enabled/zabbix-nginx
$ sudo rm /etc/nginx/sites-enabled/default
$ sudo systemctl restart zabbix-server.service zabbix-agent2.service nginx.service php8.3-fpm.service 
$ sudo systemctl enable zabbix-server.service zabbix-agent2.service nginx.service php8.3-fpm.service

Una cosa que se me olvidaba, para que Zabbix funcione perfectamente hay que tener muy sincronizados los relojes de todos los elementos que componen el servicio y, tener bien configurada la zona horaria:

$ sudo timedatectl set-timezone Europe/Madrid
$ timedatectl

Seguramente, si estáis configurando Zabbix en contenedores, el servicio systemd-timesyncd no arranque porque depende de la sincronización horaria del anfitrión, pero debéis confirmar que los relojes estén bien sincronizados.

Ahora sí, si visitamos la URL con la ip de la máquina veremos los pasos finales de la instalación:
setup-step01.png
El siguiente paso es un resumen de los requisitos de Zabbix, y si todo se ha instalado correctamente veremos todas las líneas con OK:
setup-step02.png
En el siguiente formulario tendremos que consignar los datos de acceso a la base de datos. Si sólo estamos instalando en un servidor nos bastará con localhost como servidor y el resto de datos de acceso a la base de datos deben coincidir con los que hemos utilizado durante el proceso:
setup-step03.png
El formulario con el nombre del aplicativo y la zona horaria tampoco tiene mucha complicación:
setup-step04.png
Los últimos dos pasos simplemente muestran un resumen con información sobre el proceso:
setup-step05.png

setup-step06.png
Terminado el proceso nos aparecerá el formulario de acceso cuyo usuario por defecto es Admin y la contraseña es zabbix (que habrá que proceder a cambiar tras el primer acceso):
setup-step07.png
Una vez dentro podremos ver el panel por defecto que ha elegido el proyecto para presentarnos la información básica de la instalación:
setup-step08.png

Para animarnos a seguir generando posts y teniendo en cuenta que en el comienzo de la temporada de festivales, hace unas semanas, han estado triunfando en su/mi tierra, en el Warm Up Festival 2024, he elegido a los grandérrimos, y cartageneros, Arde Bogotá y ese trallazo que abre su disco Cowboys De La A3, Los perros.