Splunk Universal Forwarder en el Docker como recopilador de registros del sistema



Splunk es el producto comercial más famoso para reunir y analizar registros. Incluso ahora, cuando Splunk ha dejado de vender en la Federación Rusa. Y esa no es una razón para no escribir los artículos instructivos sobre este producto.

Objetivo : recopilar los registros del sistema de los nodos de Docker sin cambiar la configuración de la máquina del host

Comencemos con la forma oficial que parece extraña con el uso de Docker.
Enlace de Docker Hub

Pasos de configuración:

1. Tire de la imagen

$ docker pull splunk/universalforwarder:latest 

2. Ejecute el contenedor con los parámetros que necesita

 $ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest 

3. Inicie sesión en el contenedor

 docker exec -it <container-id> /bin/bash 

Entonces deberíamos visitar la página de Documentos.

Y configure el contenedor después de que comience:

 ./splunk add forward-server <host name or ip address>:<listening port> ./splunk add monitor /var/log ./splunk restart 

Espera Que?
Pero esta no es la última sorpresa. Si ejecuta el contenedor oficial en el modo interactivo, usted:

Alguna decepción
 $ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest PLAY [Run default Splunk provisioning] ******************************************************************************************************************************************************************************************************* Tuesday 09 April 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 ********* TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 ********* TASK [Get actual hostname] ******************************************************************************************************************************************************************************************************************* changed: [localhost] Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 ********* TASK [set_fact] ****************************************************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 ********* Tuesday 09 April 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 ********* Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.216) 0:00:02.798 ********* included: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml for localhost Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 ********* TASK [splunk_common : Update Splunk directory owner] ***************************************************************************************************************************************************************************************** ok: [localhost] Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.324) 0:00:03.210 ********* included: /opt/ansible/roles/splunk_common/tasks/get_facts.yml for localhost Tuesday 09 April 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 ********* etc... 

Genial La imagen de Docker no contiene artefactos. Por lo tanto, cada vez que ejecute el contenedor, descargará binarios, lo descomprimirá y lo configurará.
¿Qué pasa con Docker-Way? Donde esta

No gracias Elegiremos el camino correcto. ¿Qué pasa si ejecutamos todos los comandos durante la etapa de construcción? ¡Sigamos!

Para saltear la parte aburrida, hay una imagen final:

Dockerfile
 # Depends on your preferences FROM centos:7 # Define env variables only once and don't define it any more ENV SPLUNK_HOME /splunkforwarder ENV SPLUNK_ROLE splunk_heavy_forwarder ENV SPLUNK_PASSWORD changeme ENV SPLUNK_START_ARGS --accept-license # Install required packages # wget - to download artifacts # expect - for the first run step of Splunk for build stage # jq - using in the shell scripts RUN yum install -y epel-release \ && yum install -y wget expect jq # Download, unpack, remove RUN wget -O splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=7.2.4&product=universalforwarder&filename=splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz&wget=true' \ && wget -O docker-18.09.3.tgz 'https://download.docker.com/linux/static/stable/x86_64/docker-18.09.3.tgz' \ && tar -xvf splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz \ && tar -xvf docker-18.09.3.tgz \ && rm -f splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz \ && rm -f docker-18.09.3.tgz # Everything is simple with shell scripts, but inputs.conf, splunkclouduf.spl and first_start.sh should have an explanation. I'll tell more about it below. COPY [ "inputs.conf", "docker-stats/props.conf", "/splunkforwarder/etc/system/local/" ] COPY [ "docker-stats/docker_events.sh", "docker-stats/docker_inspect.sh", "docker-stats/docker_stats.sh", "docker-stats/docker_top.sh", "/splunkforwarder/bin/scripts/" ] COPY splunkclouduf.spl /splunkclouduf.spl COPY first_start.sh /splunkforwarder/bin/ # Grant execute permissions, add user, execute pre-configuration RUN chmod +x /splunkforwarder/bin/scripts/*.sh \ && groupadd -r splunk \ && useradd -r -m -g splunk splunk \ && echo "%sudo ALL=NOPASSWD:ALL" >> /etc/sudoers \ && chown -R splunk:splunk $SPLUNK_HOME \ && /splunkforwarder/bin/first_start.sh \ && /splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme \ && /splunkforwarder/bin/splunk restart # Copy init scripts COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ] # It depends. If you need it locally - go on. VOLUME [ "/splunkforwarder/etc", "/splunkforwarder/var" ] HEALTHCHECK --interval=30s --timeout=30s --start-period=3m --retries=5 CMD /sbin/checkstate.sh || exit 1 ENTRYPOINT [ "/sbin/entrypoint.sh" ] CMD [ "start-service" ] 

Entonces, el contenido de

first_start.sh
 #!/usr/bin/expect -f set timeout -1 spawn /splunkforwarder/bin/splunk start --accept-license expect "Please enter an administrator username: " send -- "admin\r" expect "Please enter a new password: " send -- "changeme\r" expect "Please confirm new password: " send -- "changeme\r" expect eof 

Durante el primer inicio, Splunk solicitará nombre de usuario / contraseña, PERO las credenciales solo se pueden usar para la ejecución de comandos del administrador en esta instalación en particular, dentro del contenedor. En nuestro caso, solo queremos ejecutar el contenedor y todo debería funcionar sin ninguna acción. Puede parecer "hardcode", pero no he encontrado ninguna otra solución.
El siguiente paso de construcción es

 /splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme 

splunkclouduf.spl : este es el archivo de credenciales de Splunk Universal Forwarder, que puede descargar a través de la interfaz de usuario.

¿Qué botones debo presionar (fotos)



Es un archivo simple que puede desempaquetar fácilmente. Contiene: certificados y contraseña para conectarse a nuestro SplunkCloud; outputs.conf con la lista de nodos de entrada. Este archivo será real a menos que vuelva a instalar la instalación de Splunk o agregue nuevos nodos de entrada si está en las instalaciones. De todos modos, no pasará nada grave si lo pones en la imagen.

El último paso: reiniciar. Sí, para aplicar la configuración, debe reiniciarse.

Agregue los registros en inputs.conf que queremos enviar a Splunk. Si entrega la configuración a través de Puppet, no necesita agregar esta configuración a la imagen. Solo tenga en cuenta que el archivo de configuración debe estar montado.

¿Cuáles son los scripts de estadísticas de Docker? Puede encontrar la solución en Github de outcoldman , elegí los scripts de allí y los actualicé para que funcione con versiones reales de Docker (ce-17. *) Y Splunk (7. *).
Puede crear cuadros de mando sofisticados con datos recopilados:

Paneles: (fotos)



Puede encontrar el código fuente del tablero en el repositorio, que mencioné al final del artículo. Preste atención al primer campo de selección: elija el índice (busque por la máscara). Tendría que actualizar la máscara. Depende de los nombres de índice que tenga.

Al final, quiero prestar atención a la función start () dentro

entrypoint.sh
 start() { trap teardown EXIT if [ -z $SPLUNK_INDEX ]; then echo "'SPLUNK_INDEX' env variable is empty or not defined. Should be 'dev' or 'prd'." >&2 exit 1 else sed -e "s/@index@/$SPLUNK_INDEX/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf fi sed -e "s/@hostname@/$(cat /etc/hostname)/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf sh -c "echo 'starting' > /tmp/splunk-container.state" ${SPLUNK_HOME}/bin/splunk start watch_for_failure } 

En mi caso, para cada entorno y para cada servicio, no importa la máquina host o la aplicación acoplable, creamos un índice separado. Impide que la velocidad de búsqueda se reduzca por la gran cantidad de datos que hay en el índice. Utilizamos una regla de conversión de nomenclatura simple: <environment_name> _ <service / application / etc> . Por lo tanto, para hacer un contenedor universal, reemplazamos el comodín con el nombre del entorno por sed . La variable de nombre de entorno hereda de la variable de entorno. Suena gracioso

Además, quiero señalar que, por alguna razón, Splunk no utiliza el nombre de host del parámetro docker como el campo de host en los registros. Continuará enviando registros con host = <forwarder_container_id> incluso si define el parámetro hostname. Solución: puede montar / etc / hostname desde la máquina host y reemplazar los parámetros del host como nombres de índice.

Ejemplo de docker-compose.yml
 version: '2' services: splunk-forwarder: image: "${IMAGE_REPO}/docker-stats-splunk-forwarder:${IMAGE_VERSION}" environment: SPLUNK_INDEX: ${ENVIRONMENT} volumes: - /etc/hostname:/etc/hostname:ro - /var/log:/var/log - /var/run/docker.sock:/var/run/docker.sock:ro 


Resumen
Sí, quizás, mi solución podría no ser ideal y no es exactamente universal para todos porque contiene "código duro" . Pero podría ser útil para alguien que pueda construir su propia imagen y colocarla en el registro privado. Especialmente si necesitas Splunk Forwarder en el Docker.

Enlaces:

Esta solución
Solución de outcoldman que me inspiró para reutilizar algunas funciones.
Página de documentación oficial. Configuración de reenviador universal

Source: https://habr.com/ru/post/447532/


All Articles