Splunk Universal Forwarder Dockerben mint a rendszerlogok gyűjtője

Splunk Universal Forwarder Dockerben mint a rendszerlogok gyűjtője

A Splunk egyike a legjobban ismert kereskedelmi termékeknek a naplók gyűjtésére és elemzésére. Még most is, amikor Oroszországban már nem forgalmazzák, ez nem ok arra, hogy ne írjunk útmutatókat e termékhez.

Feladat: rendszernaplók gyűjtése docker node-okról a Splunkban a hosztgép konfigurációjának megváltoztatása nélkül

Kezdeném azzal a hivatalos megközelítéssel, amely a Docker használatakor kissé furcsának tűnik.
Link a Docker hubhoz
Mit is látunk:

1. Letöltjük a képet

$ docker pull splunk/universalforwarder:latest

2. Elindítjuk a konténert a szükséges paraméterekkel

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

3. Belépünk a konténerbe

docker exec -it  /bin/bash

Ezután arra kérnek minket, hogy egy ismert címen átmenjünk a dokumentációra.

És konfigurálnunk kell a konténert a futtatása után:


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

Várj. Mi?

De a meglepetések itt még nem értek véget. Ha interaktív módban indítod el a hivatalos képből a konténert, a következőket látod:

Egy kis csalódás


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

JÁTÉK [Alapértelmezett Splunk előkészítés futtatása] *******************************************************************************************************************************************************************************************************
2019. április 9., kedd  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TASK [Tények összegyűjtése] ***********************************************************************************************************************************************************************************************************************
rendben: [localhost]
2019. április 9., kedd  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TASK [Aktuális hosztnév megszerzése] *******************************************************************************************************************************************************************************************************************
változtatva: [localhost]
2019. április 9., kedd  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
2019. április 9., kedd  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

TASK [tényező beállítása] ******************************************************************************************************************************************************************************************************************************
endben: [localhost]
2019. április 9., kedd  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
2019. április 9., kedd  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
2019. április 9., kedd  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
2019. április 9., kedd  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
2019. április 9., kedd  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
2019. április 9., kedd  13:40:41 +0000 (0:00:00.216)       0:00:02.798 *********
bemutatva: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml localhost számára
2019. április 9., kedd  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

TASK [splunk_common : Splunk könyvtár tulajdonosának frissítése] *****************************************************************************************************************************************************************************************

rendben: [localhost]
2019. április 9., kedd  13:40:41 +0000 (0:00:00.324)       0:00:03.210 *********
bemutatva: /opt/ansible/roles/splunk_common/tasks/get_facts.yml localhost számára
2019. április 9., kedd  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

nos, és így tovább...

Nagyszerű. A képen még artefaktum sincs. Tehát, minden egyes alkalommal, amikor futtatni fogjuk, időt fogunk pazarolni, hogy letöltsük az archívumot a bináris fájlokkal, kicsomagoljuk és beállítjuk.
De mi van a docker-way-jel és hasonlókkal?

Nem, köszönöm. Más úton fogunk haladni. Mi van, ha mindezeket a műveleteket a build szakaszban hajtjuk végre? Akkor lássuk!

Hogy ne húzzuk az időt, azonnal megmutatom a végső képet:

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" ]

Tehát, mi található a

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

Az első indításkor a Splunk megkéri, hogy adjon meg egy felhasználónevet/jelszót, DE ezek az adatok arra szolgálnak a fő DB példányhoz ennek a konkrét telepítésnek az adminisztrációs parancsainak végrehajtására, vagyis a konténeren belül. Az esetünkben csak annyit szeretnénk, hogy elinduljon a konténer és az összes napló folyamatosan áramoljon. Nyilván ez hardcode, de más módszert nem találtam.

A forgatókönyv következő lépése a következő

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

splunkclouduf.spl — Ez a fájl a Splunk Universal Forwarder hitelesítő adatai, amelyeket a webes felületről lehet letölteni.

Hová kell kattintani a letöltéshez (képekben)Splunk Universal Forwarder Dockerben mint a rendszerlogok gyűjtője

Splunk Universal Forwarder Dockerben mint a rendszerlogok gyűjtője
Ez egy normál archívum, amely kicsomagolható. Benne találhatóak a tanúsítványok és a jelszó a SplunkCloudhoz való csatlakozáshoz, valamint outputs.conf a bemeneti példányaink listájával. Ez a fájl érvényes marad, amíg újratelepíti a Splunk telepítését, vagy nem ad hozzá bemeneti csomópontokat, ha a telepítés helyben van. Ezért nem kell megijedni, ha be akarja rakni a konténerbe.

És az utolsó — újraindítás. Igen, a változtatások alkalmazásához újra kell indítani.

A mi inputs.conf fájlunkba hozzáadjuk a naplókat, amelyeket a Splunkba szeretnénk küldeni. Nem szükséges ezt a fájlt a képre tenni, ha például puppet-en keresztül terjeszti a konfigurációkat. Az a fontos, hogy a Forwarder lássa a konfigurációkat, amikor elindul a démon, különben szüksége lesz ./splunk restart.

Mik azok a docker stats szkriptek? A GitHubon van egy régi megoldás outcoldman-tól, a szkriptek onnan lettek véve és átírták, hogy működjenek a legújabb Docker (ce-17.*) és Splunk (7.*) verziókkal.

A megkapott adatokból ilyen

mérőpultokat lehet készíteni: (pár kép)Splunk Universal Forwarder Dockerben mint a rendszerlogok gyűjtője

Splunk Universal Forwarder Dockerben mint a rendszerlogok gyűjtője
A mérőpultok forráskódja a cikk végén megadott repo-ban található. Ne felejtse el, hogy két kiválasztó mező található: 1 — az index kiválasztása (maszk alapján keresnek), a hoszt/konténer kiválasztása. Valószínűleg frissítenie kell az index maszkját a használt nevek függvényében.

Végezetül szeretném felhívni a figyelmet a start() be.

entrypoint.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "'SPLUNK_INDEX' környezeti változó üres vagy nincs definiálva. 'dev' vagy 'prd' kell, hogy legyen." >&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 'indítás' > /tmp/splunk-container.state"
	${SPLUNK_HOME}/bin/splunk start
    watch_for_failure
}

Az én esetemben minden környezethez és minden egyes entitáshoz, legyen az alkalmazás egy konténerben vagy a gazdagép, külön indexet használunk. Így nem szenved a keresési sebesség jelentős adathalmozódás esetén. Az indexek elnevezésében egy egyszerű szabályt alkalmazunk: _. Ezért, hogy a konténer univerzális legyen, a démon közvetlen indítása előtt kicseréljük sed-om wildcard-ot a környezeti névre. A környezeti név változóként van átadva. Érdekesnek hangzik.

Érdemes megjegyezni, hogy valami miatt a Docker paraméter nem befolyásolja a Splunk működését hosztnév. Az továbbra is folyamatosan küldi a konténerének az ID-ját a host mezőbe. Megoldásként lehet csatolni /etc/hostname a gazdagépről, és indításkor egy hasonló nevet cserélni, mint az indexek nevei.

Példa 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

Result

Igen, lehet, hogy a megoldás nem tökéletes, és biztosan nem univerzális mindenki számára, mivel sok „hardcode”. De ezen alapulva mindenki összeállíthatja a saját képmását, és elhelyezheti a saját privát artefaktum tárolójában, ha szükséges a Splunk Forwarder pontosan Dockerben.

Linkek:

A cikkből származó megoldás
Az outcoldman által inspirált megoldás, amely újrafelhasználta a funkciók egy részét
Hivatalos dokumentáció az Universal Forwarder beállításáról

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster