Splunk Universal Forwarder v dockeri ako zberač systémových protokolov

Splunk Universal Forwarder v dockeri ako zberač systémových protokolov

Splunk je jedným z niekoľkých najznámejších komerčných produktov na zber a analýzu protokolov. Ani teraz, keď sa už v Rusku nepredáva, to nie je dôvod nenapísať návod/ako na tento produkt.

Úloha: zhromažďovanie systémových protokolov z uzlov doku v Splunk bez zmeny konfigurácie hostiteľského počítača

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

1. Pullim obrázok

$ docker pull splunk/universalforwarder:latest

2. Spustite nádobu s potrebnými parametrami

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

3. Ideme do nádoby

docker exec -it <container-id> /bin/bash

Ďalej sme požiadaní, aby sme zašli na známu adresu v dokumentácii.

A nakonfigurujte kontajner po jeho spustení:


./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart

počkaj. Čo?

Tým však prekvapenia nekončia. Ak spustíte kontajner z oficiálneho obrázka v interaktívnom režime, uvidíte nasledovné:

Trochu sklamanie


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

PLAY [Run default Splunk provisioning] *******************************************************************************************************************************************************************************************************
Tuesday 09 April 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Tuesday 09 April 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TASK [Get actual hostname] *******************************************************************************************************************************************************************************************************************
changed: [localhost]
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
Tuesday 09 April 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
Tuesday 09 April 2019  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

TASK [splunk_common : Update Splunk directory owner] *****************************************************************************************************************************************************************************************
ok: [localhost]
Tuesday 09 April 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
Tuesday 09 April 2019  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

ну и так далее...

Skvelé. Obraz neobsahuje ani artefakt. To znamená, že pri každom spustení bude sťahovanie archívu s binárnymi súbormi, rozbalenie a konfigurácia chvíľu trvať.
A čo docker-way a všetko ostatné?

Nie ďakujem. Pôjdeme inou cestou. Čo ak všetky tieto operácie vykonáme vo fáze montáže? Tak poďme na to!

Aby som príliš neotáľal, hneď vám ukážem finálny obrázok:

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

Čo je teda obsiahnuté v

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í vás Splunk požiada, aby ste mu dali prihlasovacie meno/heslo, ALE tieto údaje sa používajú iba na vykonanie administratívnych príkazov pre túto konkrétnu inštaláciu, to znamená vo vnútri kontajnera. V našom prípade chceme kontajner len spustiť, aby všetko fungovalo a polená tiekli ako rieka. Samozrejme, toto je pevný kód, ale nenašiel som žiadne iné spôsoby.

Ďalej sa vykoná podľa skriptu

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

splunkclouduf.spl — Toto je súbor poverení pre Splunk Universal Forwarder, ktorý je možné stiahnuť z webového rozhrania.

Kde kliknúť na stiahnutie (na obrázkoch)Splunk Universal Forwarder v dockeri ako zberač systémových protokolov

Splunk Universal Forwarder v dockeri ako zberač systémových protokolov
Toto je bežný archív, ktorý je možné rozbaliť. Vnútri sú certifikáty a heslo na pripojenie k nášmu SplunkCloud a výstupy.conf so zoznamom našich vstupných inštancií. Tento súbor bude relevantný, kým nepreinštalujete inštaláciu Splunk alebo nepridáte vstupný uzol, ak je inštalácia lokálna. Preto nie je nič zlé, ak ho pridáte do nádoby.

A posledná vec je reštart. Áno, ak chcete použiť zmeny, musíte ho reštartovať.

V našom vstupy.konf pridáme logy, ktoré chceme poslať do Splunku. Tento súbor nie je potrebné pridávať do obrazu, ak napríklad distribuujete konfigurácie cez bábku. Jediná vec je, že Forwarder vidí konfigurácie pri spustení démona, inak bude potrebovať ./splunk reštart.

Aké sú to skripty štatistiky docker? Na Githube je staré riešenie z nadvláda, skripty boli prevzaté odtiaľ a upravené tak, aby fungovali s aktuálnymi verziami Docker (ce-17.*) a Splunk (7.*).

So získanými údajmi môžete zostaviť nasledujúce

palubné dosky: (pár obrázkov)Splunk Universal Forwarder v dockeri ako zberač systémových protokolov

Splunk Universal Forwarder v dockeri ako zberač systémových protokolov
Zdrojový kód pomlčiek je v odkaze uvedenom na konci článku. Upozorňujeme, že existujú 2 polia výberu: 1 - výber indexu (vyhľadávanie podľa masky), výber hostiteľa/kontajnera. Pravdepodobne budete musieť aktualizovať masku indexu v závislosti od mien, ktoré používate.

Na záver by som chcel upozorniť na funkciu začať() в

vstupný bod.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ú jednotlivú entitu, či už ide o aplikáciu v kontajneri alebo hostiteľský stroj, používame samostatný index. Rýchlosť vyhľadávania tak neutrpí pri výraznej akumulácii údajov. Na pomenovanie indexov sa používa jednoduché pravidlo: _. Preto, aby bol kontajner univerzálny, pred spustením samotného démona vymeníme smäd-tý zástupný znak k názvu prostredia. Premenná názvu prostredia prechádza cez premenné prostredia. Znie to smiešne.

Za zmienku tiež stojí, že z nejakého dôvodu nie je Splunk ovplyvnený prítomnosťou parametra docker hostname. Stále bude tvrdohlavo posielať protokoly s ID svojho kontajnera v poli hostiteľa. Ako riešenie môžete namontovať / Etc / hostname z hostiteľského počítača a pri spustení vykonajte náhrady podobné názvom 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

Celkový

Áno, riešenie možno nie je ideálne a určite nie univerzálne pre každého, keďže ich je veľa "pevný kód". Ale na základe toho si každý môže vytvoriť svoj vlastný imidž a vložiť ho do svojej súkromnej artefakty, ak, ako sa to stáva, potrebujete Splunk Forwarder v Dockeri.

odkazy:

Riešenie z článku
Riešenie od outcoldmana, ktoré nás inšpirovalo k opätovnému použitiu niektorých funkcií
z. dokumentáciu na nastavenie Universal Forwarder

Zdroj: hab.com

Pridať komentár