Splunk Universal Forwarder në Docker si një mbledhës i logëve sistemore

Splunk Universal Forwarder në Docker si një mbledhës i logëve sistemore

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.
Lidhja në Docker hub
Cfarë kemi:

1. Të marrim imazhin

$ docker pull splunk/universalforwarder:latest

2. 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:latest

3. Të hyjmë në kontejner

docker exec -it  /bin/bash

Pastaj 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 eof

Në 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:changeme

splunkclouduf.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)Splunk Universal Forwarder në Docker si një mbledhës i logëve sistemore

Splunk Universal Forwarder në Docker si një mbledhës i logëve sistemore
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 outcoldman, 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)Splunk Universal Forwarder në Docker si një mbledhës i logëve sistemore

Splunk Universal Forwarder në Docker si një mbledhës i logëve sistemore
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:ro

Pë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:

Zgjidhja nga artikulli
Zgjidhja nga outcoldman që frymëzoi ripërdorimin e pjesës funksionale
Dokumentacioni zyrtar për konfigurimin e Universal Forwarder

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster