Splunk Universal Forwarder no Docker como um coletor de logs do sistema



Splunk é o produto comercial mais famoso para reunir e analisar logs. Mesmo agora, quando o Splunk parou as vendas na Federação Russa. E esse não é um motivo para não escrever artigos de instruções sobre este produto.

Objetivo : reunir logs do sistema a partir dos nós do Docker sem alterar a configuração da máquina do host

Vamos começar com a maneira oficial que parece estranha com o Docker usando.
Link do hub do Docker

Etapas de configuração:

1. Puxe a imagem

$ docker pull splunk/universalforwarder:latest 

2. Execute 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. Faça logon no contêiner

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

Então devemos visitar a página do Documentos.

E configure o contêiner após o início:

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

Espera O que?
Mas essa não é a última surpresa. Se você executar o contêiner oficial no modo interativo, você:

Alguma 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 ********* etc... 

Ótimo A imagem do Docker não contém artefato. Assim, toda vez que você executa o contêiner, você baixa binários, descompacta e configura.
E o docker-way? Onde fica

Não, obrigado. Vamos escolher o caminho certo. E se executarmos todos os comandos durante o estágio de construção? Vamos continuar!

Para pular a parte chata, há uma imagem 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" ] 

Então, o conteúdo 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 a primeira inicialização, o Splunk solicitará login / senha, mas as credenciais podem ser usadas apenas para a execução dos comandos do administrador nessa instalação específica, dentro do contêiner. No nosso caso, queremos apenas executar o contêiner e tudo deve funcionar sem nenhuma ação. Pode parecer "hardcode", mas não encontrei outras soluções.
O próximo passo da construção é

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

splunkclouduf.spl - Esse é o arquivo de credenciais do Splunk Universal Forwarder, que pode ser baixado via interface do usuário.

Quais botões devo pressionar (fotos)



É um arquivo simples que você pode descompactar facilmente. Ele contém - certificados e senha para conectar-se ao nosso SplunkCloud; outputs.conf com a lista de nós de entrada. Esse arquivo será real, a menos que você reinstale a instalação do Splunk ou adicione novos nós de entrada, se estiver no local. De qualquer forma, nada sério acontecerá se você colocar na imagem.

O último passo - reinicie. Sim, para aplicar a configuração, ela precisa ser reiniciada.

Adicione os logs em inputs.conf que queremos enviar para o Splunk. Se você entregar a configuração via Puppet, não precisará adicionar essa configuração à imagem. Lembre-se de que o arquivo de configuração deve ser montado.

Quais são os scripts estatísticos do docker? Você pode encontrar a solução no Github do outcoldman , eu escolhi scripts de lá e atualizei para deixá-lo funcionar com versões reais do Docker (ce-17. *) E Splunk (7. *).
Você pode criar painéis sofisticados com dados coletados:

Painéis: (fotos)



Você pode encontrar o código-fonte do painel no repositório, que mencionei no final do artigo. Preste atenção ao 1º campo de seleção: escolha índice (pesquise pela máscara). Você precisaria atualizar a máscara. Depende dos nomes de índice que você possui.

No final, quero prestar atenção na função 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 } 

No meu caso, para cada ambiente e para cada serviço, não importa a máquina host ou o aplicativo docker, criamos um índice separado. Impede a redução da velocidade de pesquisa devido à grande quantidade de dados no índice. Usamos uma regra de conversão de nomenclatura simples: <nome do ambiente> _ <serviço / aplicativo / etc> . Assim, para criar um contêiner universal, substituímos o curinga pelo nome do ambiente por sed . A variável de nome do ambiente é herdada pela variável de ambiente. Parece engraçado.

Além disso, quero salientar que, por algum motivo, o Splunk não usa o parâmetro docker hostname como o campo host nos logs. Ele continuará enviando logs com host = <forwarder_container_id>, mesmo se você definir o parâmetro hostname. Solução: você pode montar / etc / hostname na máquina host e substituir o parâmetro host como 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 


Sumário
Sim, talvez, minha solução talvez não seja ideal e não seja exatamente universal para todos, pois contém "hardcode" . Mas pode ser útil para alguém que pode criar sua própria imagem e colocá-la no registro particular. Especialmente se você precisar do Splunk Forwarder no Docker.

Ligações:

Esta solução
Solução do outcoldman que me inspirou a reutilizar algumas funcionalidades
Página de documentação oficial. Configuração do encaminhador universal

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


All Articles