Splunk Universal Forwarder na janela de encaixe como um registrador do sistema



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

Tarefa : coletar logs do sistema de nós do docker no Splunk sem alterar a configuração do host

Gostaria de começar com uma abordagem oficial, que parece estranha ao usar o docker.
Link para o hub do Docker
O que temos:

1. Imagem Pullim

$ docker pull splunk/universalforwarder:latest 

2. Começamos o recipiente 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 

Em seguida, somos solicitados a ir para o endereço conhecido na documentação.

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 

Espere um momento. O que?

Mas as surpresas não param por aí. Se você executar o contêiner a partir da imagem oficial no 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 sequer tem um artefato. Ou seja, toda vez que você iniciar, levará algum tempo para baixar o arquivo com binários, descompactar e configurar.
Mas e quanto ao docker-way e tudo isso?

Não, obrigado. Vamos para o outro lado. E se realizarmos todas essas operações na fase de montagem? Então vamos lá!

Para não puxar por muito tempo, mostrarei imediatamente 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" ] 

E assim, o que está contido em

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 

No primeiro início, o Splunk solicita um nome de usuário / senha, MAS esses dados são usados apenas para executar comandos administrativos dessa instalação específica, ou seja, dentro do contêiner. No nosso caso, queremos apenas lançar o contêiner para que tudo funcione e os logs fluam como água. Obviamente, este é um código fixo, mas não encontrei outras maneiras.

Mais adiante, o script é executado

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

splunkclouduf.spl - Este é um arquivo de créditos para o Splunk Universal Forwarder, que pode ser baixado da interface da web.

Onde clicar para fazer o download (em imagens)



Este é um arquivo comum que você pode descompactar. Inside - certificados e senha para conectar-se ao nosso SplunkCloud e outputs.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 estiver no local. Portanto, não há problema em adicioná-lo dentro do contêiner.

E o último é reiniciar. Sim, para aplicar as alterações, você precisa reiniciá-lo.

Em nosso inputs.conf, adicionamos os logs que queremos enviar ao Splunk. Não é necessário adicionar esse arquivo à imagem se, por exemplo, você dispersar as configurações pelo fantoche. O principal é que o Forwarder vê as configurações quando o daemon é iniciado, caso contrário, será necessário reiniciar ./splunk .

Quais scripts de estatísticas do docker? O github tem uma solução antiga do outcoldman , os scripts são retirados de lá e finalizados para trabalhar com as versões atuais do Docker (ce-17. *) E Splunk (7. *).

Com os dados obtidos, você pode criar tais

painéis: (algumas fotos)



O código fonte das mesas encontra-se no nabo indicado no final do artigo. Observe que existem 2 campos de seleção: 1 - selecione o índice (pesquisado pela máscara), selecione o host / contêiner. Você provavelmente precisará atualizar a máscara de índice, dependendo dos nomes que você usa.

Em conclusão, quero prestar atenção à função start () em

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 cada entidade individual, seja um aplicativo em um contêiner ou uma máquina host, usamos um índice separado. Portanto, a velocidade da pesquisa não sofrerá com um acúmulo significativo de dados. Uma regra simples é usada para nomear índices: < nome do ambiente> _ <serviço / aplicativo / etc> . Portanto, para tornar o contêiner universal, antes de iniciar o daemon diretamente, substituímos o curinga sed pelo nome do ambiente. Uma variável com um nome de ambiente é passada através de variáveis ​​de ambiente. Isso parece engraçado.

Também é importante observar que, por algum motivo, o Splunk não é afetado pelo parâmetro do nome do host do docker. De qualquer forma, ele enviará persistentemente logs do ID do seu contêiner para o campo host. Como solução, você pode montar / etc / hostname na máquina host e, na inicialização, fazer uma substituição semelhante aos nomes de índice.

Exemplo 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 


Sumário

Sim, talvez a solução não seja perfeita e certamente não seja universal para todos, pois há muito "código rígido" . Mas, com base nisso, todos podem coletar sua imagem e colocá-la em seu próprio artefato particular, se, por acaso, você precisar do Splunk Forwarder na janela de encaixe.

Referências:

Solução do artigo
A solução do Outcoldman inspirada para reutilizar parte da funcionalidade
Of. Documentação de configuração do Universal Forwarder

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


All Articles