Splunk Universal Forwarder v dockeri ako zberateľ systémových logov

Splunk Universal Forwarder v dockeri ako zberateľ systémových logov

Splunk je jedným z niekoľkých najrozpoznateľnejších komerčných produktov na zber a analýzu logov. Aj dnes, keď sa v Rusku už nepredávajú, nie je dôvod nepisovať manuály / návody na tento produkt.

Úloha: zbierať systémové logy z docker nod v Splunk bez zmeny konfigurácie hostiteľského stroja

Chcel by som začať oficiálnym prístupom, ktorý vyzerá trochu divne pri používaní Dockera.
Odkaz na Docker hub
Čo teda máme:

1. Stiahneme obraz

$ docker pull splunk/universalforwarder:latest

2. Spustíme kontajner s potrebnými parametrami

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

3. Vstúpime do kontajnera

docker exec -it  /bin/bash

Ďalej nás vyzývajú prejsť na známy odkaz v dokumentácii.

A nakonfigurovať kontajner po jeho spustení:


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

Počkajte. Čo?

Ale to nie je všetko. Ak spustíte kontajner z oficiálneho obrazu v interaktívnom režime, uvidíte nasledovné:

Trochu sklamania


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

HRA [Spustenie predvoleného nastavenia Splunk] ****************************************************************************************************************************************************************************************************************************
Utorok 09. apríla 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

ÚLOHA [Zbieranie faktov] ******************************************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorok 09. apríla 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

ÚLOHA [Získať aktuálne hostname] *********************************************************************************************************************************************************************************************************************************
changed: [localhost]
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

ÚLOHA [set_fact] **************************************************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
Utorok 09. apríla 2019  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
Utorok 09. apríla 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
Utorok 09. apríla 2019  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

ÚLOHA [splunk_common : Aktualizujte vlastníka adresára Splunk] ************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorok 09. apríla 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
Utorok 09. apríla 2019  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

a tak ďalej...

Super. V obraze nie je ani artefakt. To znamená, že každý raz pri spustení sa stratí čas na sťahovanie archívu s binárkami, ich rozbalenie a nastavenie.
A čo docker-way a všetko to ostatné?

Nie, ďakujem. Pôjdeme inou cestou. Čo ak všetky tieto operácie vykonáme na etape zostavenia? Tak poďme!

Aby som to nepredlžoval, ukážem rovno konečný obraz:

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

A čo teda obsahuje

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

Pri prvom spustení, Splunk žiada zadať prihlásenie/heslo, ALE tieto údaje sa používajú iba na vykonávanie administratívnych príkazov tejto konkrétnej inštalácie, teda vo vnútri kontajnera. V našom prípade sa len chceme spustiť kontajner, aby všetko fungovalo a logy prúdili hojne. Samozrejme, je to hardcode, ale nenarazil som na iné spôsoby.

Ďalej podľa scenára sa vykonáva

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

splunkclouduf.spl — Toto je súbor kreditu pre Splunk Universal Forwarder, ktorý si môžete stiahnuť z webového rozhrania.

Kam kliknúť, aby ste si ho stiahli (na obrázkoch)Splunk Universal Forwarder v dockeri ako zberateľ systémových logov

Splunk Universal Forwarder v dockeri ako zberateľ systémových logov
Je to bežný archív, ktorý možno rozbaliť. Vo vnútri sú certifikáty a heslo na pripojenie k nášmu SplunkCloud a outputs.conf so zoznamom našich input inštancií. Tento súbor bude aktuálny, kým nepreinštalujete svoju inštaláciu Splunk alebo nepridáte input uzly, ak je inštalácia on-premise. Preto nie je nič zlé na tom, pridať ho dovnútra kontajnera.

A nakoniec — reštart. Áno, na aplikovanie zmien je potrebné ho reštartovať.

Do nášho inputs.conf pridávame logy, ktoré chceme posielať do Splunk. Nie je nutné pridávať tento súbor do obrazu, ak napríklad rozptyľujete konfigurácie cez puppet. Dôležité je, aby Forwarder videl konfigurácie pri štarte démona, inak bude potrebné ./splunk restart.

A čo sú to skripty docker stats? Na GitHube je staré riešenie od outcoldman, skripty sú prevzaté odtiaľ a upravené na prácu s aktuálnymi verziami Docker (ce-17.*) a Splunk (7.*).

S získanými dátami môžete vytvárať také

dashboardy: (pár obrázkov)Splunk Universal Forwarder v dockeri ako zberateľ systémových logov

Splunk Universal Forwarder v dockeri ako zberateľ systémových logov
Zdrojový kód dashboardov je v repozitári uvedenom na konci článku. Upozorňujeme, že tam sú prítomné 2 výberové polia: 1 — výber indexu (hľadá sa podľa masky), výber hostiteľa/kontajnera. Maska indexu bude pravdepodobne potrebné aktualizovať, v závislosti od mien, ktoré používate.

Na záver by som chcel upozorniť na funkciu start() v

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
}

V mojom prípade pre každé prostredie a každú samostatnú entitu, nech je to aplikácia v kontajneri alebo hostiteľský stroj, používame samostatný index. Tak nebude trpieť rýchlosť vyhľadávania pri značnej akumulácii dát. Na pomenovanie indexov sa používa jednoduché pravidlo: _. Preto, aby bol kontajner univerzálny, nahrádzame pred spustením démona sed-om wildcard názvom prostredia. Premenná s názvom prostredia sa prenáša cez premenné prostredia. Znie to vtipne.

Je dôležité poznamenať, že z nejakého dôvodu nie je na Splunk ovplyvnený prítomnosťou parametru docker hostname. Aj tak bude neustále zasielať logy s ID svojho kontajnera do poľa host. Ako riešenie je možné pripojiť /etc/hostname z hostiteľskej mašiny a pri štarte vykonať zmenu, podobnú menám indexov.

Príklad 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

Záver

Áno, možno, riešenie nie je ideálne a určite nie univerzálne pre všetkých, pretože obsahuje veľa „hardcodovania“. Ale na jeho základe si každý môže zostaviť svoju vlastnú podobu a uložiť ju do svojho súkromného archívu, ak náhodou potrebujete, aby Splunk Forwarder bol práve v dockeri.

Odkazy:

Riešenie z článku
Riešenie od outcoldman, ktoré inšpirovalo opätovné použitie časti funkčnosti
Oficiálna dokumentácia k nastaveniu Universal Forwarder

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster