Splunk Universal Forwarder en docker como un recopilador de rexistros do sistema

Splunk Universal Forwarder en docker como un recopilador de rexistros do sistema

Splunk é un dos varios dos produtos de análise e recollida de rexistros comerciais máis recoñecibles. Mesmo agora, cando as vendas xa non se fan en Rusia, esta non é unha razón para non escribir instrucións ou instrucións para este produto.

Tarefa: recolle rexistros do sistema dos nodos docker en Splunk sen cambiar a configuración da máquina host

Gustaríame comezar co enfoque oficial, que parece un pouco estraño cando se usa Docker.
Ligazón a Docker hub
Que temos:

1. Imaxe Pullim

$ docker pull splunk/universalforwarder:latest

2. Iniciar o recipiente cos parámetros necesarios

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

3. Entramos no recipiente

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

A continuación, pídesnos que vaiamos a un enderezo coñecido na documentación.

E configura o contedor despois de que se inicie:


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

Agarda. Que?

Pero as sorpresas non rematan aí. Se executas o contedor desde a imaxe oficial en modo interactivo, verás o seguinte:

Un pouco 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 *********

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

Genial. A imaxe nin sequera contén un artefacto. É dicir, cada vez que se inicie tardará en descargar o arquivo con binarios, desempaquetar e configurar.
Que pasa con docker-way e todo iso?

Non, grazas. Tomaremos unha ruta diferente. E se realizamos todas estas operacións na fase de montaxe? Entón imos!

Para non demorar moito, mostrareiche a imaxe final de inmediato:

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" ]

Entón, o que está contido

primeiro_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

No primeiro inicio, Splunk pídelle que lle des un inicio de sesión/contrasinal, PERO estes datos úsanse para executar comandos administrativos para esa instalación concreta, é dicir, dentro do contedor. No noso caso, só queremos lanzar o colector para que todo funcione e os troncos corran coma un río. Por suposto, este é un código duro, pero non atopei ningún outro xeito.

Ademais, segundo o script é executado

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

splunkclouduf.spl — Este é un ficheiro de credenciais para Splunk Universal Forwarder, que se pode descargar desde a interface web.

Onde facer clic para descargar (en imaxes)Splunk Universal Forwarder en docker como un recopilador de rexistros do sistema

Splunk Universal Forwarder en docker como un recopilador de rexistros do sistema
Este é un arquivo normal que se pode desempaquetar. No seu interior hai certificados e un contrasinal para conectarse ao noso SplunkCloud e saídas.conf cunha lista das nosas instancias de entrada. Este ficheiro será relevante ata que reinstales a túa instalación de Splunk ou engadas un nodo de entrada se a instalación é local. Polo tanto, non hai nada de malo en engadilo dentro do recipiente.

E o último é reiniciar. Si, para aplicar os cambios, cómpre reinicialo.

No noso entradas.conf engadimos os rexistros que queremos enviar a Splunk. Non é necesario engadir este ficheiro á imaxe se, por exemplo, distribúes as configuracións a través de títeres. O único é que Forwarder ve as configuracións cando se inicia o daemon, se non, necesitará ./splunk reiniciar.

Que tipo de scripts de estatísticas docker son? Hai unha solución antiga en Github de outcoldman, os scripts foron tomados de alí e modificáronse para funcionar coas versións actuais de Docker (ce-17.*) e Splunk (7.*).

Cos datos obtidos, pode construír o seguinte

paneis: (un par de imaxes)Splunk Universal Forwarder en docker como un recopilador de rexistros do sistema

Splunk Universal Forwarder en docker como un recopilador de rexistros do sistema
O código fonte dos trazos está na ligazón que se proporciona ao final do artigo. Teña en conta que hai 2 campos de selección: 1 - selección de índice (buscado por máscara), selección de host/contedor. Probablemente teña que actualizar a máscara de índice, dependendo dos nomes que use.

En conclusión, gustaríame chamar a súa atención sobre a función comezar () в

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
}

No meu caso, para cada entorno e cada entidade individual, xa sexa unha aplicación nun contedor ou unha máquina host, utilizamos un índice separado. Deste xeito, a velocidade de busca non sufrirá cando hai unha acumulación importante de datos. Para nomear índices úsase unha regra sinxela: _. Polo tanto, para que o contedor sexa universal, antes de lanzar o propio daemon, substituímos sed-ésimo comodín ao nome do contorno. A variable do nome de ambiente pásase a través de variables de ambiente. Parece divertido.

Tamén vale a pena sinalar que por algún motivo Splunk non se ve afectado pola presenza do parámetro docker nome do servidor. Aínda teimudamente enviará rexistros co ID do seu recipiente no campo de acollida. Como solución, pode montar / etc / hostname desde a máquina host e ao inicio realice substitucións semellantes aos nomes de índice.

Exemplo 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

Si, quizais a solución non sexa a ideal e seguramente non sexa universal para todos, xa que hai moitas "código duro". Pero en función del, cada un pode construír a súa propia imaxe e poñela no seu artefacto privado, se, como ocorre, precisa de Splunk Forwarder en Docker.

Referencias:

Solución do artigo
Unha solución de outcoldman que nos inspirou a reutilizar parte da funcionalidade
De. documentación para configurar Universal Forwarder

Fonte: www.habr.com

Engadir un comentario