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.
O que nós temos:
1. Imagem Pullim
$ docker pull splunk/universalforwarder:latest2. 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:latest3. Entramos no contêiner
docker exec -it <container-id> /bin/bashA 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 eofNa 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:changemesplunkclouduf.spl — Este é um arquivo de credenciais do Splunk Universal Forwarder, que pode ser baixado da interface da web.
Onde clicar para baixar (em fotos)
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 , 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)
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:roTotal
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:
Fonte: habr.com
