
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 DockerEtapas 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
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:
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árioSim, 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çãoSolução do outcoldman que me inspirou a reutilizar algumas funcionalidadesPágina de documentação oficial. Configuração do encaminhador universal