Splunk Universal Forwarder në docker si mbledhës i log-eve sistemore

Splunk Universal Forwarder në docker si mbledhës i log-eve sistemore

Splunk është një nga disa produktet komerciale më të njohura për mbledhjen dhe analizimin e logeve. Edhe tani, kur shitjet në Rusi nuk bëhen më, kjo nuk është një arsye për të mos shkruar udhëzime/si të bëni për këtë produkt.

Detyra: mbledhja e logeve të sistemit nga nodet docker në Splunk pa ndërruar konfigurimin e host-it.

Dëshiroj të filloj me qasjen zyrtare, e cila duket disi e çuditshme kur përdoret me docker.
Linku në Docker hub
Çfarë kemi:

1. Shkarkojmë imazhin

$ docker pull splunk/universalforwarder:latest

2. Aktivizojmë kontejnerin me parametrat e nevojshëm

$ docker run -d  -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest

3. Hyjmë në kontejner

docker exec -it  /bin/bash

Më pas na kërkohet të kalojmë në adresën e njohur në dokumentacion.

Dhe të konfiguroni kontejnerin pas aktivizimit të tij:


./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart

Pritni. Çfarë?

Por surprizat nuk përfundojnë këtu. Nëse e aktivizoni kontejnerin nga imazhi zyrtar në modin 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

PLAY [Run default Splunk provisioning] *******************************************************************************************************************************************************************************************************
E martë 09 Prill 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
E martë 09 Prill 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TASK [Get actual hostname] *******************************************************************************************************************************************************************************************************************
ndryshuat: [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 *********
perfshi: /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 : Update Splunk directory owner] *****************************************************************************************************************************************************************************************
ok: [localhost]
E martë 09 Prill 2019  13:40:41 +0000 (0:00:00.324)       0:00:03.210 *********
perfshi: /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ë...

Shumë mirë. Në imazh nuk ka asnjë artefakt. Do të thotë, çdo herë kur ndizet, do të humbasim kohë për të shkarkuar arkivimin me binarët, për të shkarkuar dhe konfiguruar.
Po si me docker-way dhe të gjitha ato?

Jo, faleminderit. Ne do të shkojmë në një tjetër rrugë. Çfarë nëse të gjitha këto operacione do t'i realizojmë në fazën e ndërtimit? Atëherë, le të vazhdojmë!

Për të mos u zgjatur, do të 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ë fillim, Splunk kërkon të vendoset një login/katërshe, POR këto të dhëna përdoren vetëm për kryerjen e komandave administrative të kësaj instalimi të veçantë, pra brenda kontejnerit. Në rastin tonë, ne thjesht duam të aktivizojmë kontejnerin, në mënyrë që gjithçka të funksionojë dhe loget të rrjedhin si lumë. Sigurisht, ky është hardcode, por nuk gjeta mënyra të tjera.

Më tej në skenar, ekzekutohet

/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme

splunkclouduf.spl — Ky është skedari i kredencialeve për Splunk Universal Forwarder, të cilat mund të shkarkohen nga ndërfaqja web.

Ku të klikoni për të shkarkuar (në foto)Splunk Universal Forwarder në docker si mbledhës i log-eve sistemore

Splunk Universal Forwarder në docker si mbledhës i log-eve sistemore
Ky është një arkiv i zakonshëm, i cili mund të jetë i shkarkueshëm. Brenda tij - certifikatat dhe fjalëkalimi për t'u lidhur me SplunkCloud tonë dhe outputs.conf me listën e instancave tona input. Ky skedar do të jetë në fuqi derisa të ripërshtatet instalimi juaj Splunk ose të shtoni nodet input, nëse instalimi është on-premise. Prandaj, nuk ka asgjë të keqe për të shtuar atë brenda kontejnerit.

Dhe e fundit - restart. Po, për të aplikuar ndryshimet, duhet ta rinit shtojmë.

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, i shpërndani konfigurimet me puppet. E rëndësishme është që Forwarder të shohë konfigurimet në momentin e aktivizimit të demonit, përndryshe do të nevojitet ./splunk restart.

Po çfarë janë skenaret docker stats? Në GitHub ka një zgjidhje të vjetër nga outcoldman, skenaret janë marrë nga aty dhe modifikuar për t'u punuar me versionet aktuale të Docker (ce-17.*) dhe Splunk (7.*).

Me të dhënat e marra mund të ndërtohen këto

dashboard-e: (një çift fotografish)Splunk Universal Forwarder në docker si mbledhës i log-eve sistemore

Splunk Universal Forwarder në docker si mbledhës i log-eve sistemore
Kodi burimor i dështimeve ndodhet në repo-n e përmendur në fund të artikullit. Kjo është e rëndësishme, pasi ka dy fusha për zgjedhje: 1 — zgjedhja e indeksit (kërkohet përmes maskës), zgjedhja e hostit/kontejnerit. Me siguri do t'ju duhet të azhurnoni maskën e indeksit, në varësi të emrave që përdorni.

Në përfundim, dua të theksoj funksionin start()

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 ambient dhe çdo entitet të veçantë, qofshin ato aplikacione në kontejner apo makina host, ne përdorim një indeks të veçantë. Kështu, nuk do të vuajë shpejtësia e kërkimit me akumulimin e konsiderueshëm të të dhënave. Rregulli për emërtimin e indekseve është i thjeshtë: _. Prandaj, që kontejneri të jetë universale, para se të startojmë drejtorinë e demonit, ne zëvendësojmë sed-in wildcard me emrin e ambientit. Variabla me emrin e ambientit kalon përmes variablave të ambientit. Kjo tingëllon e çuditshme.

Duhet theksuar gjithashtu se për ndonjë arsye, në Splunk nuk ndodhet ndonjë efekt nga prania e parametrave docker hostname. Ai do të dërgojë ende logët me id e kontejnerit në fushën host. Si zgjidhje, mund të montoni /etc/hostname nga makina host dhe gjatë startit të bëni një zëvendësim të ngjashëm, si në emrat e indekseve.

Shembulli 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ë ideale dhe padyshim nuk është universale për të gjithë, pasi ka shumë «hardcode». Por mbi këtë bazë çdo dikush mund të ndërtojë imazhin e vet dhe ta vendosë atë në artifaktin e tij privat, nëse, ndodhi që ju nevojitet Splunk Forwarder më saktësisht në docker.

Linket:

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

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster