Splunk Universal Forwarder en Docker como recopilador de registros del sistema

Splunk Universal Forwarder en Docker como recopilador de registros del sistema

Splunk es uno de los productos comerciales de recopilación y análisis de registros más reconocidos. Incluso ahora, cuando ya no se venden en Rusia, esto no es motivo para no escribir instrucciones/procedimientos para este producto.

Tarea: recopile registros del sistema de los nodos acoplables en Splunk sin cambiar la configuración de la máquina host

Me gustaría comenzar con el enfoque oficial, que parece un poco extraño cuando se usa Docker.
Enlace al centro Docker
Que tenemos:

1. Imagen pullim

$ docker pull splunk/universalforwarder:latest

2. Inicie el contenedor con los parámetros necesarios.

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

3. Nos metemos en el contenedor.

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

A continuación, se nos pide que vayamos a una dirección conocida en la documentación.

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

Esperar. ¿Qué?

Pero las sorpresas no terminan ahí. Si ejecuta el contenedor desde la imagen oficial en modo interactivo, verá lo siguiente:

un poco de 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 *********

ну и так далее...

Excelente. La imagen ni siquiera contiene un artefacto. Es decir, cada vez que inicie, llevará tiempo descargar el archivo con los binarios, descomprimirlo y configurarlo.
¿Qué pasa con Docker-way y todo eso?

No, gracias. Tomaremos una ruta diferente. ¿Qué pasa si realizamos todas estas operaciones en la etapa de montaje? ¡Entonces vamos!

Para no demorarme mucho, enseguida os enseño la imagen final:

Dockerfile

# Тут у кого какие предпочтения
FROM centos:7

# Задаём переменные, чтобы каждый раз при старте не указывать их
ENV SPLUNK_HOME /splunkforwarder
ENV SPLUNK_ROLE splunk_heavy_forwarder
ENV SPLUNK_PASSWORD changeme
ENV SPLUNK_START_ARGS --accept-license

# Ставим пакеты
# wget - чтобы скачать артефакты
# expect - понадобится для первоначального запуска Splunk на этапе сборки
# jq - используется в скриптах, которые собирают статистику докера
RUN yum install -y epel-release 
    && yum install -y wget expect jq

# Качаем, распаковываем, удаляем
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

# С shell скриптами всё понятно, а вот inputs.conf, splunkclouduf.spl и first_start.sh нуждаются в пояснении. Об этом расскажу после source тэга.
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/

#  Даём права на исполнение, добавляем пользователя и выполняем первоначальную настройку
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/entrypoint.sh", "init/checkstate.sh", "/sbin/" ]

# По желанию. Кому нужно локально иметь конфиги/логи, кому нет.
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, ¿qué está contenido en

primer_inicio.sh

#!/usr/bin/expect -f
set timeout -1
spawn /splunkforwarder/bin/splunk start --accept-license
expect "Please enter an administrator username: "
send -- "adminr"
expect "Please enter a new password: "
send -- "changemer"
expect "Please confirm new password: "
send -- "changemer"
expect eof

En el primer inicio, Splunk le pide que le proporcione un nombre de usuario/contraseña, PERO estos datos se utilizan sólo para ejecutar comandos administrativos para esa instalación en particular, es decir, dentro del contenedor. En nuestro caso solo queremos lanzar el contenedor para que todo funcione y los troncos fluyan como un río. Por supuesto, esto es código rígido, pero no he encontrado otras formas.

Además, según el script se ejecuta.

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

splunkclouduf.spl — Este es un archivo de credenciales para Splunk Universal Forwarder, que se puede descargar desde la interfaz web.

Dónde hacer clic para descargar (en imágenes)Splunk Universal Forwarder en Docker como recopilador de registros del sistema

Splunk Universal Forwarder en Docker como recopilador de registros del sistema
Este es un archivo normal que se puede descomprimir. En el interior hay certificados y una contraseña para conectarse a nuestro SplunkCloud y salidas.conf con una lista de nuestras instancias de entrada. Este archivo será relevante hasta que reinstale su instalación de Splunk o agregue un nodo de entrada si la instalación es local. Por tanto, no tiene nada de malo añadirlo dentro del recipiente.

Y lo último es reiniciar. Sí, para aplicar los cambios es necesario reiniciarlo.

En nuestro entradas.conf Agregamos los registros que queremos enviar a Splunk. No es necesario agregar este archivo a la imagen si, por ejemplo, distribuye configuraciones a través de Puppet. Lo único es que Forwarder ve las configuraciones cuando se inicia el demonio; de lo contrario, necesitará ./splunk reiniciar.

¿Qué tipo de scripts de estadísticas de Docker son? Hay una solución antigua en Github de superado, los scripts se tomaron de allí y se modificaron para que funcionen con las versiones actuales de Docker (ce-17.*) y Splunk (7.*).

Con los datos obtenidos se puede construir lo siguiente

Cuadros de mando: (un par de fotos)Splunk Universal Forwarder en Docker como recopilador de registros del sistema

Splunk Universal Forwarder en Docker como recopilador de registros del sistema
El código fuente de los guiones se encuentra en el enlace que se proporciona al final del artículo. Tenga en cuenta que hay 2 campos de selección: 1 - selección de índice (buscada por máscara), selección de host/contenedor. Probablemente necesitarás actualizar la máscara de índice, según los nombres que utilices.

En conclusión, me gustaría llamar su atención sobre la función. comienzo() в

punto de entrada.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 cada entidad individual, ya sea una aplicación en un contenedor o una máquina host, utilizamos un índice separado. De esta forma, la velocidad de búsqueda no se verá afectada cuando haya una acumulación importante de datos. Se utiliza una regla simple para nombrar índices: _. Por lo tanto, para que el contenedor sea universal, antes de iniciar el demonio, reemplazamos SED-ésimo comodín para el nombre del entorno. La variable de nombre de entorno se pasa a través de variables de entorno. Sonidos graciosos.

También vale la pena señalar que, por alguna razón, Splunk no se ve afectado por la presencia del parámetro Docker. hostname. Todavía enviará obstinadamente registros con la identificación de su contenedor en el campo host. Como solución, puedes montar / etc / hostname desde la máquina host y al inicio realice reemplazos similares a los nombres de índice.

Ejemplo 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

Total

Sí, tal vez la solución no sea ideal y ciertamente no universal para todos, ya que hay muchos "Código difícil". Pero basándose en ello, cada uno puede crear su propia imagen y colocarla en su artefacto privado, si resulta que necesita Splunk Forwarder en Docker.

Enlaces:

Solución del artículo.
Una solución de outcoldman que nos inspiró a reutilizar algunas de las funciones.
De. documentación para configurar Universal Forwarder

Fuente: habr.com

Añadir un comentario