Splunk hè unu di parechji di i prudutti di cullizzioni di log è di analisi cummerciale più ricunnisciuti. Ancu avà, quandu a vendita ùn hè più fatta in Russia, questu ùn hè micca un mutivu per ùn scrive struzzioni / cumu per stu pruduttu.
Objettivu: raccoglie i logs di u sistema da i nodi docker in Splunk senza cambià a cunfigurazione di a macchina host
Mi piacerebbe principià cù l'approcciu ufficiale, chì pare un pocu stranu quandu si usa Docker.
Chì avemu:
1. Pullim image
$ docker pull splunk/universalforwarder:latest
2. Cumincià u cuntinuu cù i paràmetri necessarii
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
3. Andemu in u cuntinuu
docker exec -it <container-id> /bin/bash
In seguitu, ci hè dumandatu à andà à un indirizzu cunnisciutu in a documentazione.
È cunfigurà u cuntinuu dopu avè principiatu:
./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart
Aspetta. Chì ?
Ma e sorprese ùn finiscinu micca quì. Se eseguite u cuntinuu da l'imagine ufficiale in modu interattivu, vi vede u seguente:
Un pocu di delusione
$ 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 *********
ну и так далее...
Perfettu. L'imaghjini ùn cuntene mancu un artefattu. Questu hè, ogni volta chì avete principiatu, ci volerà tempu per scaricà l'archiviu cù binari, unpack è cunfigurà.
E docker-way è tuttu ciò?
No grazie. Piglieremu una strada diversa. E s'ellu facemu tutte queste operazioni in u stadiu di l'assemblea? Allora andemu !
Per ùn ritardà troppu tempu, vi mustraraghju subitu l'imaghjini finali:
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" ]
Allora ciò chì cuntene
first_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 eof
À u primu principiu, Splunk vi dumanda di dà un login / password, MA sta dati hè utilizatu solu per eseguisce cumandamenti amministrativi per quella installazione particulare, vale à dì, in u cuntinuu. In u nostru casu, vulemu solu lancià u cuntinuu per chì tuttu u travagliu è i ghjurnali scorri cum'è un fiume. Di sicuru, questu hè hardcode, ma ùn aghju micca trovu altre manere.
In più sicondu u script hè eseguitu
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl - Questu hè un schedariu di credenziali per Splunk Universal Forwarder, chì pò esse scaricatu da l'interfaccia web.
Induve cliccate per scaricà (in imagine)
Questu hè un archiviu regulare chì pò esse unpacked. Dentru sò certificati è una password per cunnette à u nostru SplunkCloud è outputs.conf cù una lista di i nostri casi di input. Stu schedariu serà pertinenti finu à chì reinstallate a vostra installazione Splunk o aghjunghje un node di input se l'installazione hè on-premise. Dunque, ùn ci hè nunda di male à aghjunghje in u cuntinuu.
È l'ultima cosa hè riavvia. Iè, per applicà i cambiamenti, avete bisognu di riavvia.
In u nostru inputs.conf aghjunghjemu i logs chì vulemu mandà à Splunk. Ùn hè micca necessariu aghjunghje stu schedariu à l'imaghjini se, per esempiu, distribute cunfigurazioni via puppet. L'unicu cosa hè chì Forwarder vede a cunfigurazione quandu u daemon principia, altrimenti avarà bisognu ./splunk restart.
Chì tippu di script di stats docker sò? Ci hè una vechja suluzione nantu à Github da
Cù i dati ottenuti, pudete custruisce i seguenti
dashboards: (un coppiu di ritratti)
U codice fonte per i trattini hè in u ligame furnitu à a fine di l'articulu. Per piacè nutate chì ci sò 2 campi selezziunati: 1 - selezzione d'indici (cercata per maschera), selezzione di host/container. Puderete bisognu di aghjurnà a maschera d'indici, secondu i nomi chì utilizate.
In cunclusioni, vogliu attirà a vostra attenzione à a funzione principià () в
puntu d'entrata.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
}
In u mo casu, per ogni ambiente è ogni entità individuale, sia una applicazione in un containeru o una macchina d'ospite, usemu un indice separatu. In questu modu, a velocità di ricerca ùn soffre micca quandu ci hè una accumulazione significativa di dati. Una regula simplice hè usata per nome indici: _. Dunque, per chì u cuntinuu sia universale, prima di lancià u daemon stessu, rimpiazzamu sidu-th wildcard à u nome di l'ambiente. A variabile di u nome di l'ambiente hè passatu per e variabili di l'ambiente. Sona divertente.
Hè da nutà ancu chì per una certa ragione Splunk ùn hè micca affettatu da a presenza di u paràmetru docker. nomu di ostinu. Ellu hà sempre stubbornly mandà logs cù l'id di u so cuntinuu in u campu di l'ospiti. Comu suluzione, pudete muntà / etc / hostname da a macchina host è à l'iniziu facenu rimpiazzamenti simili à i nomi d'indici.
Esempiu 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
U risultatu
Iè, forsi a suluzione ùn hè micca ideale è certamente micca universale per tutti, postu chì ci sò assai "hardcode". Ma basatu annantu à questu, ognunu pò custruisce a so propria maghjina è mette in u so artifactory privatu, se, cum'è succede, avete bisognu di Splunk Forwarder in Docker.
Referenze:
Source: www.habr.com