- Splunk Distributed Architecture
-
Tener instalado Vagrant (instrucciones).
-
Instalar el provider de Docker Compose para Vagrant.
vagrant plugin install vagrant-docker-compose
-
Tener instalado VirtualBox con la version igual o mayor 7.0.
Los servidores que se especifican no tienen instalado el software de Splunk, lo que tienen es corriendo un contenedor Docker en modo host con Splunk (salvo los forwarders que tiene un arquitectura mas compleja). Es decir, salvo los forwarders, cada servidor creado con Vagrant compuesta por un contenedor Docker donde se ejecuta una instancia de Splunk con la configuración especifica y necesaria para la función que realiza dentro de la arquitectura. En próximas secciones se enseñara como levantar esta arquitectura.
.
├── common # Archivos comunes
├── images # Imágenes para el README
├── lb # Balanceador de carga
├── splunk-enterprise # Core
├── universal-forwarder # Forwarders
-
common
Ficheros comunes utilizados en resto del proyecto. -
images
Imágenes utilizadas para crear e README. -
lb (192.168.56.4:80)
Balanceador de carga para los search heads de producción. -
splunk-enterprise
En este directorio tenemos el Vagrantfile que crea las siguientes piezas de la arquitectura:- Master -> 192.168.56.2
- Deployer -> 192.168.56.2
- Deployment Server -> 192.168.56.2
- Indexador de desarrollo -> 192.168.56.5
- Search head de desarrollo -> 192.168.56.6
- Heavy Forwarder -> 192.168.56.3
- Indexadores de producción -> (192.168.56.21 y 192.168.56.22)
- Search heads de producción -> (192.168.56.11 y 192.168.56.12)
-
universal-forwarder
Forwarder1 -> 192.168.56.31
-
Descargar el paquete con el producto de Splunk. El paquete debe ser un TGZ para Linux.
-
Splunk Enterprise: Para descarga el Splunk Enterprise deberemos ir a las siguientes URL's:
- Ultima versión: https://download.splunk.com/products/splunk/releases/
- Versiones previas: https://www.splunk.com/en_us/download/previous-releases.html
El comprimido lo deberemos llamar
splunk-enterprise.tgz
. -
Splunk Universal Forwarder: Para descarga el Universal Forwarder deberemos ir a las siguientes URL's:
- Ultima version: https://www.splunk.com/en_us/download/universal-forwarder.html
- Versiones previas: https://www.splunk.com/en_us/download/previous-releases-universal-forwarder.html
El comprimido lo deberemos llamar
universalforwarder.tgz
.
Para descargar los comprimidos con Wget, cURL o cualquier otra herramienta para hacer peticiones, debemos usar la URL https://download.splunk.com/products/splunk/releases/ seguida de la parte variable para cada version y pieza (Universal Forwarder, Splunk Enterprise). Si no la sabes, en el repositorio hay un fichero llamado
urls.txt
dentro de las carpetasuniversal-forwarder
ysplunk-enterprise
con la parte variable de algunas versiones para cada pieza. Debemos escoger la parte variable de la URL del archivourls.txt
de una carpeta u otra dependiendo que pieza nos queramos descargar de Splunk. Si la version de Splunk Enterprise o Splunk Universal Forwarder que buscas no esta en el archivourls.txt
correspondiente, crea una Pull Request para incluirla.El comprimido con el Universal Forwarder o el Splunk Enterprise deberá estar situados dentro de la carpeta
common/downloads
. -
-
Splunk Enterprise
- Configurar imagen base de los contenedores que se crean con el Vagrantfile que hay dentro de la carpeta
splunk-enterprise
. Para configurar la imagen base a partir de la cual se deben crear los contenedores, debemos ir al archivosplunk-enterprise/env.rb
que hemos creado anteriormente y rellenar la variableDOCKER_FROM
con la imagen base de Docker que deseemos. - Configurar los comandos que queramos que se hagan durante la creación de la imagen para los contenedores que se crean con el Vagrantfile que hay dentro de la carpeta
splunk-enterprise
salvo para el Heavy Forwarder (se explica mas tarde como hacer la configuración para esta pieza). Para ello debemos ir al archivosplunk-enterprise/env.rb
y rellenar la variableCONTAINER_RUN
con los comandos que queramos que se ejecuten en la construcción de la imagen. Esto es util si por ejemplo necesitamos que en el contenedor este instalado PHP, si la imagen base fuera la de Ubuntu, lo rellenaríamos conapt install php
. Es importante que los comandos que queramos ejecutar sean compatibles con el OS de la imagen base que hemos elegido. Si no se quiere especificar ninguno dejar el contenido que hay por defecto. - Configurar los comandos que queremos que se hagan durante la creación de la imagen para el Heavy Forwarder. Para ello debemos ir al archivo
splunk-enterprise/env.rb
y rellenar la variableCONTAINER_RUN_HF
con los comandos que queramos que se ejecuten en la construcción de la imagen. Esto es util si por ejemplo necesitamos que en el contenedor este instalado PHP, si la imagen base fuera la de Ubuntu, lo rellenaríamos conapt install php
. Es importante que los comandos que queramos ejecutar sean compatibles con el OS de la imagen base que hemos elegido. Si no se quiere especificar ninguno dejar el contenido que hay por defecto.
- Configurar imagen base de los contenedores que se crean con el Vagrantfile que hay dentro de la carpeta
-
Universal Forwarder
- Configurar imagen base del contenedor del Universal Forwarder. Para ello debemos ir al archivo
universal-forwarder/forwarder-compose.yml
y cambiar el valor para el argumentoDOCKER_FROM
del serviciouf
. - Configurar los comandos que queremos que se hagan durante la creación de la imagen para el Universal Forwarder. Para ello debemos ir al archivo
universal-forwarder/forwarder-compose.yml
y cambiar el valor para el argumentoCONTAINER_RUN
del serviciouf
. Si no se quiere especificar ninguno dejar el contenido que hay por defecto.
- Configurar imagen base del contenedor del Universal Forwarder. Para ello debemos ir al archivo
Por defecto todas las instancias de Splunk han sido iniciadas con el usuario admin
y la contraseña admin1234
. Si se quiere cambiar las credenciales, se deberá modificar el archivo user-seed.conf
. También se deberán recrear aquellos servidores con instancias de Splunk afectadas.\
Para manejar los servidores aprovisionados/as con Vagrant revisar la documentación referida a continuación:
- Iniciar un entorno: https://developer.hashicorp.com/vagrant/tutorials/getting-started/getting-started-up
- Recrear un entorno: https://developer.hashicorp.com/vagrant/tutorials/getting-started/getting-started-rebuild
- Derribar un entorno: https://developer.hashicorp.com/vagrant/tutorials/getting-started/getting-started-teardown
NOTA: Los comandos de Vagrant siempre se deben realizar en el directorio donde se encuentra el Vagranfile. Dependiendo de que parte queramos manejar deberemos realizarlo sobre una carpeta de la raíz del proyecto u otra. Ver estructura de directorios
Para manejar los contenedores dentro de los servidores utilizaremos los comandos habituales de Docker.
En la mayoría de servidores, si ejecutamos docker ps
solo vamos un contenedor con una instancia de Splunk Enterprise corriendo configurada para operar según su función (ver arquitectura por defecto).
En el caso de los forwarders, tendremos tres contenedores corriendo tal y como se explica en la sección Arquitectura universal forwarders.
Servidor | Comando | Directorio donde realizarlo |
---|---|---|
Manager | vagrant up manager | splunk-enterprise |
Search head desarrollo | vagrant up test_sh | splunk-enterprise |
Indexador desarrollo | vagrant up test_idx | splunk-enterprise |
Heavy Forwarder | vagrant up hf | splunk-enterprise |
Balanceador de carga | vagrant up lb | lb |
Universal Forwarders especifico | vagrant up uf[num] | universal-forwarder |
Universal Forwarders todos los configurados Ver como | vagrant up | universal-forwarder |
Search head producción | vagrant up sh[num] | splunk-enterprise |
Indexador producción | vagrant up idx[num] | splunk-enterprise |
Para añadir un indexador al cluster de indexadores de producción debemos modificar el fichero indexers.txt
que esta presente en la carpeta files
dentro de la carpeta common
. Deberemos añadir a este fichero una línea por cada indexador que queramos añadir al cluster. Este línea debe contener exclusivamente la IP del servidor que debe contener el indexador, precedida por :
. Para levantar la maquina virtual con el contenedor Docker que contiene el indexador que acabamos de añadir, deberemos ejecutar el comando vagrant up idx<numero de linea donde se encuentra la IP>
sobre la carpeta splunk-enterprise
.
Para añadir un search head al cluster de search heads de producción debemos modificar el fichero shcluster_members.txt
que esta presente en la carpeta files
dentro de la carpeta common
. Deberemos añadir a este fichero una línea por cada search head que queramos añadir al cluster. Este línea debe contener exclusivamente la IP del servidor que debe contener el search head, precedida por :
. Para levantar la maquina virtual con el contenedor Docker que contiene el searchhead que acabamos de añadir, deberemos ejecutar el comando vagrant up sh<numero de linea donde se encuentra la IP>
sobre la carpeta splunk-enterprise
.
Para añadir un forwarder debemos modificar el fichero forwarders.txt
que esta presente en la carpeta files
dentro de la carpeta common
. Deberemos añadir a este fichero una línea por cada forwarder que queramos añadir. Este línea debe contener exclusivamente la IP del servidor que debe contener el forwarder, precedida por :
. Para levantar la maquina virtual con el contenedor Docker que contiene el universal forwarder que acabamos de añadir, deberemos ejecutar el comando vagrant up uf<numero de linea donde se encuentra la IP>
sobre la carpeta universal-forwarder
.
Por defecto el search head de desarrollo solo busca en el indexador de desarrollo. Si queremos añadir los indexadores de producción deberemos seguir los siguientes pasos:
-
Arrancar los indexadores de producción.
-
Acceder al search head de desarrollo.
-
Ir al directorio bin de Splunk.
-
Ejecutar el siguiente comando por cada indexador que queramos añadir como peer al search head de desarrollo:
./splunk add search-server https://<IP-del-indexador>:8089 -auth admin:admin1234 -remoteUsername admin -remotePassword admin1234
También podemos modificar el archivo distsearch.conf
que se encuentra en la carpeta splunk-enterprise/configs/sh/distsearch.conf
. Tendremos que añadir en el parámetro servers
de la stanza distributedSearch
las IPs de los indexadores donde queramos buscar separadas por comas sin espacios. Por defecto esta añadida la IP del indexador de desarrollo.
Para eliminar un servidor primero debemos ejecutar vagrant destroy
del servidor y luego borrar la IP del servidor en el archivo .txt correspondiente.
Según que servidor se elimine habrá que recrear los siguientes servidores:
Servidor eliminado | Servidores a recrear |
---|---|
Search head de producción | Recrear load balancer y todos los demás search heads de producción |
Indexador de producción | Recrear forwarders y heavy forwarder |
Indexador | Borrar IP del archivo distsearch.conf si estuviera |
Para enviar eventos al servidor RabbitMQ de los forwarders tenemos dos opciones:
-
Enviar eventos manualmente a el servidor RabbitMQ. Cuando digo "manualmente" me refiero usando cURL, un script custom, cualquier software, ...
-
Utilizar el script que se proporciona en este repositorio. Este script esta en la carpeta
rabbitmq
dentro de la carpetascripts
, dentro de la carpetauniversal-forwarder
. Antes de ejecutar este script debemos cumplir los siguientes requisitos:-
Renombrar el archivo
.env.example
a.env
y rellenar la variableRABBITMQ_SERVER
con la IP del forwarder donde esta ubicado el broker RabbitMQ a donde queremos enviar los eventos generados con el script. -
Tener instalado en Python 3.
-
Instalar las librerías utilizadas. Para instalar las librerías debemos ejecutar
pip install -r requirements.txt
. Podemos instalar estas librerías y usar la version de Python 3 que tengamos instalada de manera global en el ordenador o crear un entorno virtual. La forma recomendad es crear un entorno virtual. Para crear un entorno virtual en Python podemos utilizar virtualenv (Documentación).
Nota: Si se utiliza un entorno virtual, antes de lanzar el comando para ejecutar el script, habrá que activarlo.
Una vez cumplidos los requisitos para ejecutar el script simplemente debemos invocarlo con el comando
python send.py
. Al lanzar el comando, el script nos pregunta laexchange
a la que queremos enviar el mensaje y el propio mensaje que queremos enviar. Si le damos enter a cualquiera de las dos pregunta se aplicaran el valor por defecto para laexchange
(my_exchange
) y se genera un mensaje con la estructura por defecto con contenido aleatorio. -
Para indexar los eventos que enviamos debemos configurar una Serverclass
con una aplicación que contenga un monitor hacia el archivo con el nombre de la exchange con los mensajes que queramos indexar. Este archivo tiene la extension .log
y se encontrara en la carpeta /tmp
. Ademas deberemos añadir a la Serverclass
los forwarders a los que queramos desplegar la aplicación, es decir, a los clientes de los que queremos indexar datos.
Para definir la Serverclass
deberemos ir al master node que se encuentra en el servidor con IP 192.168.56.2
y puerto 8000
.
Para enviar datos a producción o desarrollo, ver la sección siguiente.
Para enviar datos a producción debemos configurar el parámetro _TCP_ROUTING
con el valor pr_group
para cada stanza que queramos que envié los datos los indexadores de producción.
Para enviar datos a desarrollo debemos configurar el parámetro _TCP_ROUTING
con el valor de_group
o no configurarlo para cada stanza que queramos que envié los datos al indexador de desarrollo. Por defecto los datos se envían al indexador de desarrollo a no ser que se especifique otra cosa.
Los alias están definidos dentro de las carpetas splunk-enterprise
y universal-forwarder
en un fichero con el nombre .aliases
. En este fichero están definidos aliases para ejecutar en la terminal con el objetivo de simplificar algunas tareas. Para cargar los aliases ejecutar el siguiente comando:
source .aliases
Los aliases disponibles son los siguientes:
- splunk-enterprise
- launch_dev: Levanta el servidor con el manager, el servidor con el searchead de desarrollo y el servidor con el indexador de desarrollo.
Para añadir una pregunta nueva crea una issue.
No hay preguntas de momento
- Optimizaciones de código
- Mejoras en el manejo de la arquitectura
- Solución a errores a la hora de utilizarla
- Errores o mejoras en el README
- Traducciones en el README
- Mejoras que hagan que a los usuarios les resulte mas fácil utilizar este proyecto
- Actualización de los archivos
urls.txt
con nueva versiones
- Cambios que modifiquen la arquitectura por defecto del proyecto
- Cambios que incluyan información sensible
- Cambios que modifiquen el sentido del proyecto
- Cambios no inclusivos con el usuario de los demás usuarios
- Hacer fork del proyecto.
- Crear rama con el nombre del cambio.
- Hacer pull request con el cambio desde la rama que hemos creado a la rama main de este repositorio.