Splunk është një nga produkte më të njohura komerciale për grumbullimin dhe analizimin e logeve. Edhe tani, kur shitjet në Rusi nuk kryhen më, kjo nuk është një arsye për të mos shkruar udhëzime/si të bëni për këtë produkt.
Detyra: grumbullimin e logeve sistematike nga nodet docker në Splunk pa ndryshuar konfigurimin e host-it.
Dëshiroj të filloj me qasjen zyrtare, e cila duket e çuditshme kur përdoret me docker.
Cfarë kemi:
1. Të marrim imazhin
$ docker pull splunk/universalforwarder:latest2. Të nisim kontejnerin me parametrat përkatës
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Të hyjmë në kontejner
docker exec -it /bin/bashPastaj na kërkohet të kalojmë në adresën e njohur në dokumentacion.
Dhe të konfigurojmë kontejnerin pas nisjes së tij:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Pritini. Çfarë?
Por surprizat nuk mbarojnë këtu. Nëse nisni kontejnerin nga imazhi zyrtar në modalitet interaktiv, do të shihni këtë:
Pak zhgënjim
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
LUJTA [Run default Splunk provisioning] *******************************************************************************************************************************************************************************************************
E martë 09 Prill 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
TASK [Marrja e Fakteve] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
E martë 09 Prill 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
TASK [Merr emrin aktual të host-it] *******************************************************************************************************************************************************************************************************************
ndryshuar: [localhost]
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
E martë 09 Prill 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
E martë 09 Prill 2019 13:40:41 +0000 (0:00:00.216) 0:00:02.798 *********
inkluar: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml për localhost
E martë 09 Prill 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
TASK [splunk_common : Përditëso pronarin e dosjes Splunk] *****************************************************************************************************************************************************************************************
ok: [localhost]
E martë 09 Prill 2019 13:40:41 +0000 (0:00:00.324) 0:00:03.210 *********
inkluar: /opt/ansible/roles/splunk_common/tasks/get_facts.yml për localhost
E martë 09 Prill 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
dhe kështu me radhë...
Shkëlqyer. Në imazhin nuk ka asnjë artefakt. Kjo do të thotë se çdo herë që e nisni, do të humbni kohë për të shkarkuar arkivin me binaret, për t'i nxjerrë ato dhe për t'i konfiguruar.
Po si ndodhet docker-way dhe gjithçka tjetër?
Jo, faleminderit. Ne do të shkojmë një rrugë tjetër. Çfarë nëse të gjitha këto operacione i bëjmë në fazën e ndërtimit? Atëherë, le të fillojmë!
Për të mos e zgjatur, do t'ju tregoj menjëherë imazhin përfundimtar:
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" ]Dhe kështu, çfarë përmban
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 eofNë nisjen e parë, Splunk kërkon të vendosni një emër përdoruesi/faqe, POR këto të dhëna përdoren të për kryerjen e commands administrative të kësaj instalimi të veçantë, dmth, brenda enës. Në rastin tonë, ne thjesht dëshirojmë të nisni kontejnerin, në mënyrë që gjithçka të funksionojë dhe log-ët të rrjedhin pa ndalim. Sigurisht, kjo është hardcode, por nuk kam gjetur mënyra të tjera.
Në vijim të skenarit ekzekutohet
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Ky është një skedar kredie për Splunk Universal Forwarder, i cili mund të shkarkohet nga ndërfaqja e internetit.
Ku të klikoni për të shkarkuar (në figura)
Ky është një arkiv i zakonshëm, i cili mund të shkarkohet. Brenda tij janë certifikatat dhe fjalëkalimi për t'u lidhur me SplunkCloud tonë dhe outputs.conf me listën e instancave tona të inputeve. Ky skedar do të jetë i vlefshëm deri në momentin që do të riinstaloni instalimin tuaj të Splunk ose do të shtoni nodet e inputeve, nëse instalimi është on-premise. Prandaj, nuk ka asgjë të keqe ta shtoni brenda enës.
Dhe e fundit — restart. Po, për të aplikuar ndryshimet, duhet ta restartoni.
Në inputs.conf shtojmë loget që duam të dërgojmë në Splunk. Nuk është e nevojshme ta shtoni këtë skedar në imazh, nëse, për shembull, jeni duke shpërndarë konfigurimet përmes puppet. E rëndësishme është që Forwarder të shohë konfigurimet kur fillon demoni, përndryshe do të nevojitet .\/splunk restart.
Çfarë skenari docker stats janë? Në Github ka një zgjidhje të vjetër nga , skenaret janë marrë nga aty dhe janë përmirësuar për të punuar me versionet aktuale të Docker (ce-17.*) dhe Splunk (7.*).
Me të dhënat e marra, mund të ndërtohen
dashboard-e: (disa figura)
Kodi burimor i dashboard-eve ndodhet në repo-n e përmendur në fund të artikullit. Kushtojini vëmendje se atje ka dy fusha seleksioni: 1 — seleksioni i indeksit (kërkohet sipas maskës), seleksioni i hostit/container-it. Maska e indeksit ndoshta do t'ju duhet ta azhurnoni, në varësi të emrave që po përdorni.
Në përfundim, dëshiroj të theksoj funksionin start() në
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
}Në rastin tim, për çdo mjedis dhe për çdo entitet të veçantë, qoftë aplikacion në enë apo makinë host, ne përdorim një indeks të veçantë. Kështu nuk do të vuajë shpejtësia e kërkimit në rast akumulimi të rëndësishëm të të dhënave. Për emërtimin e indekseve përdoret një rregull i thjeshtë: _. Prandaj, për ta bërë enën universale, para se të fillojmë demonin, ne zëvendësojmë sed-in wildcard me emrin e mjedisit. Një variabël me emrin e mjedisit dërgohet përmes variablave të mjedisit. Duket qesharake.
Gjithashtu, merret parasysh se për një arsye, prania e parametrave docker nuk ndikon në Splunk. hostnameAi prapë do të dërgojë loge me identitetin e kontejnerit të tij në fushën host. Si një zgjidhje, mund të montoni /etc/hostname nga makina host dhe, gjatë nisjes, të bëni një zëvendësim të ngjashëm me emrat e indekseve.
Shembuj 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:roPërfundimi
Po, ndoshta zgjidhja nuk është perfekte dhe sigurisht nuk është universale për të gjithë, pasi ka shumë «hardcode». Por, bazuar në të, çdo kush mund të ndërtosh imazhin e tij dhe ta vendosë atë në artifaktin privat, nëse, ndodhi që ju nevojitet Splunk Forwarder pikërisht në docker.
Lidhjet:
Burimi: habr.com
