
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 DockerO 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
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
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árioSim, 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 artigoA solução do Outcoldman inspirada para reutilizar parte da funcionalidadeOf. Documentação de configuração do Universal Forwarder