Splunk Universal Forwarder v dockeru jako sběrač systémových protokolů

Splunk Universal Forwarder v dockeru jako sběrač systémových protokolů

Splunk je jedním z několika nejznámějších komerčních produktů pro sběr a analýzu protokolů. Ani nyní, kdy se v Rusku již neprodává, to není důvod, proč k tomuto produktu nenapsat návod/jak na to.

Úkol: shromažďovat systémové protokoly z docker uzlů ve Splunk bez změny konfigurace hostitelského počítače

Rád bych začal oficiálním přístupem, který při používání Dockeru vypadá trochu zvláštně.
Odkaz na centrum Docker
Co máme:

1. Pullim obrázek

$ docker pull splunk/universalforwarder:latest

2. Spusťte kontejner s potřebnými parametry

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

3. Jdeme do nádoby

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

Dále jsme požádáni, abychom přešli na známou adresu v dokumentaci.

A nakonfigurujte kontejner po jeho spuštění:


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

Počkejte. Co?

Tím ale překvapení nekončí. Pokud spustíte kontejner z oficiálního obrázku v interaktivním režimu, uvidíte následující:

Trochu zklamání


$ 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 *********

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

Skvělý. Obrázek dokonce neobsahuje artefakt. To znamená, že při každém spuštění bude stažení archivu s binárními soubory, rozbalení a konfigurace nějakou dobu trvat.
A co docker-way a tak?

Ne, díky. Půjdeme jinou cestou. Co když provedeme všechny tyto operace ve fázi montáže? Tak jdeme!

Abyste se příliš nezdržovali, hned vám ukážu finální obrázek:

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

Co je tedy obsaženo 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

Při prvním spuštění vás Splunk požádá o zadání přihlašovacího jména/hesla, ALE tyto údaje jsou použity pouze spouštět administrativní příkazy pro tuto konkrétní instalaci, to znamená uvnitř kontejneru. V našem případě chceme kontejner pouze spustit, aby vše fungovalo a polena tekla jako řeka. Samozřejmě, toto je pevný kód, ale nenašel jsem žádné jiné způsoby.

Dále se provádí podle skriptu

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

splunkclouduf.spl — Toto je soubor přihlašovacích údajů pro Splunk Universal Forwarder, který lze stáhnout z webového rozhraní.

Kde kliknout pro stažení (na obrázcích)Splunk Universal Forwarder v dockeru jako sběrač systémových protokolů

Splunk Universal Forwarder v dockeru jako sběrač systémových protokolů
Toto je běžný archiv, který lze rozbalit. Uvnitř jsou certifikáty a heslo pro připojení k našemu SplunkCloud a výstupy.conf se seznamem našich vstupních instancí. Tento soubor bude relevantní, dokud znovu nenainstalujete instalaci Splunk nebo nepřidáte vstupní uzel, pokud se jedná o místní instalaci. Proto není nic špatného na jeho přidání do nádoby.

A poslední věc je restart. Ano, chcete-li použít změny, musíte jej restartovat.

V našem vstupy.konf přidáme protokoly, které chceme odeslat do Splunku. Tento soubor není nutné přidávat do obrázku, pokud například distribuujete konfigurace přes loutku. Jediná věc je, že Forwarder vidí konfigurace při spuštění démona, jinak bude potřebovat ./splunk restart.

Jaké jsou to skripty statistik dockeru? Na Githubu existuje staré řešení přemožitel, skripty byly odtud převzaty a upraveny tak, aby fungovaly s aktuálními verzemi Docker (ce-17.*) a Splunk (7.*).

Se získanými daty můžete vytvořit následující

palubní desky: (pár obrázků)Splunk Universal Forwarder v dockeru jako sběrač systémových protokolů

Splunk Universal Forwarder v dockeru jako sběrač systémových protokolů
Zdrojový kód pomlček je v odkazu uvedeném na konci článku. Upozorňujeme, že existují 2 vybraná pole: 1 - výběr indexu (vyhledáváno podle masky), výběr hostitele/kontejneru. Pravděpodobně budete muset aktualizovat masku indexu v závislosti na názvech, které používáte.

Na závěr bych vás chtěl upozornit na funkci Start() в

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 mém případě pro každé prostředí a každou jednotlivou entitu, ať už je to aplikace v kontejneru nebo hostitelský stroj, používáme samostatný index. Rychlost vyhledávání tak neutrpí při výrazném nahromadění dat. Pro pojmenování indexů se používá jednoduché pravidlo: _. Proto, aby byl kontejner univerzální, před spuštěním samotného démona vyměníme žízeň-tý zástupný znak k názvu prostředí. Proměnná názvu prostředí se předává prostřednictvím proměnných prostředí. Zní to legračně.

Za zmínku také stojí, že z nějakého důvodu není Splunk ovlivněn přítomností parametru docker hostname. Stále bude tvrdohlavě posílat protokoly s ID svého kontejneru v poli hostitele. Jako řešení můžete namontovat / etc / hostname z hostitelského počítače a při spuštění provádějte náhrady podobné názvům indexů.

Pří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ý

Ano, možná řešení není ideální a rozhodně ne univerzální pro každého, jelikož je jich mnoho "pevný kód". Ale na jeho základě si každý může vytvořit svůj vlastní image a vložit ho do své soukromé artefakty, pokud, jak se to stává, potřebujete Splunk Forwarder v Dockeru.

Odkazy:

Řešení z článku
Řešení od outcoldmana, které nás inspirovalo k opětovnému použití některých funkcí
Z. dokumentaci pro nastavení Universal Forwarder

Zdroj: www.habr.com

Přidat komentář