Splunk Universal Forwarder no docker como coletor de log do sistema

Splunk Universal Forwarder no docker como coletor de log do sistema

Splunk é um dos vários produtos comerciais de coleta e análise de logs mais reconhecidos. Mesmo agora, quando as vendas não são mais feitas na Rússia, isso não é motivo para não escrever instruções/como fazer para este produto.

Tarefa: colete logs do sistema de nós docker no Splunk sem alterar a configuração da máquina host

Gostaria de começar com a abordagem oficial, que parece um pouco estranha ao usar o Docker.
Link para hub Docker
O que nós temos:

1. Imagem Pullim

$ docker pull splunk/universalforwarder:latest

2. Inicie o contêiner com os parâmetros necessários

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

3. Entramos no contêiner

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

A seguir, somos solicitados a ir a um endereço conhecido na documentação.

E configure o contêiner depois de iniciar:


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

Espere. O que?

Mas as surpresas não param por aí. Se você executar o contêiner a partir da imagem oficial em modo interativo, verá o seguinte:

Um pouco de decepção


$ 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 *********

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

Ótimo. A imagem nem contém um artefato. Ou seja, toda vez que você iniciar levará algum tempo para baixar o arquivo com binários, descompactar e configurar.
E quanto ao docker-way e tudo mais?

Não, obrigado. Faremos um caminho diferente. E se realizarmos todas essas operações na fase de montagem? Então vamos!

Para não demorar muito, vou mostrar logo a imagem 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" ]

Então, o que está contido em

primeiro_start.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

Na primeira inicialização, o Splunk pede que você forneça um login/senha, MAS esses dados são usados apenas para executar comandos administrativos para aquela instalação específica, ou seja, dentro do contêiner. No nosso caso, queremos apenas lançar o container para que tudo funcione e as toras fluam como um rio. Claro, isso é hardcode, mas não encontrei outras maneiras.

Mais de acordo com o script é executado

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

splunkclouduf.spl — Este é um arquivo de credenciais do Splunk Universal Forwarder, que pode ser baixado da interface da web.

Onde clicar para baixar (em fotos)Splunk Universal Forwarder no docker como coletor de log do sistema

Splunk Universal Forwarder no docker como coletor de log do sistema
Este é um arquivo normal que pode ser descompactado. Dentro estão certificados e uma senha para conectar-se ao nosso SplunkCloud e saídas.conf com uma lista de nossas instâncias de entrada. Este arquivo será relevante até você reinstalar a instalação do Splunk ou adicionar um nó de entrada se a instalação for local. Portanto, não há nada de errado em adicioná-lo dentro do contêiner.

E a última coisa é reiniciar. Sim, para aplicar as alterações, é necessário reiniciá-lo.

Na nossa entradas.conf adicionamos os logs que queremos enviar ao Splunk. Não é necessário adicionar este arquivo à imagem se, por exemplo, você distribuir configurações via fantoche. A única coisa é que o Forwarder vê as configurações quando o daemon é iniciado, caso contrário, será necessário ./splunk reiniciar.

Que tipo de scripts de estatísticas do docker são eles? Existe uma solução antiga no Github de homem frio, os scripts foram retirados de lá e modificados para funcionar com as versões atuais do Docker (ce-17.*) e Splunk (7.*).

Com os dados obtidos, você pode construir o seguinte

painéis: (algumas fotos)Splunk Universal Forwarder no docker como coletor de log do sistema

Splunk Universal Forwarder no docker como coletor de log do sistema
O código-fonte dos travessões está no link fornecido no final do artigo. Observe que existem 2 campos de seleção: 1 - seleção de índice (pesquisado por máscara), seleção de host/contêiner. Provavelmente, você precisará atualizar a máscara de índice, dependendo dos nomes usados.

Concluindo, gostaria de chamar sua atenção para a função começar() в

ponto 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 ambiente e cada entidade individual, seja uma aplicação em um contêiner ou uma máquina host, usamos um índice separado. Dessa forma, a velocidade de busca não será prejudicada quando houver um acúmulo significativo de dados. Uma regra simples é usada para nomear índices: _. Portanto, para que o contêiner seja universal, antes de lançar o próprio daemon, substituímos sede-th curinga para o nome do ambiente. A variável de nome de ambiente é passada por variáveis ​​de ambiente. Parece engraçado.

Também é importante notar que, por algum motivo, o Splunk não é afetado pela presença do parâmetro docker hostname. Ele ainda enviará logs teimosamente com o id de seu contêiner no campo host. Como solução, você pode montar / etc / hostname da máquina host e na inicialização faça substituições semelhantes 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

Sim, talvez a solução não seja a ideal e certamente não seja universal para todos, uma vez que existem muitos "Código difícil". Mas com base nisso, todos podem construir sua própria imagem e colocá-la em seu artefato privado, se, por acaso, você precisar do Splunk Forwarder no Docker.

Links:

Solução do artigo
Uma solução da outcoldman que nos inspirou a reutilizar algumas funcionalidades
De. documentação para configurar o Universal Forwarder

Fonte: habr.com

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster