Splunk Universal Forwarder v Dockeru jako sběrač systémových logů

Splunk Universal Forwarder v Dockeru jako sběrač systémových logů

Splunk je jedním z několika nejznámějších komerčních produktů pro sběr a analýzu logů. I když se nyní prodeje v Rusku již neprovádějí, není to důvod k tomu, abychom nepsali návody/testy k tomuto produktu.

Úkol: sbírat systémové logy z docker uzlů v Splunku, aniž byste měnili konfiguraci hostitelské mašiny

Začneme oficiálním přístupem, který se při použití Dockeru zdá být poněkud zvláštní.
Odkaz na Docker hub
Co máme:

1. Stáhnout obraz

$ docker pull splunk/universalforwarder:latest

2. Spustit kontejner s potřebnými parametry

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

3. Přihlásit se do kontejneru

docker exec -it  /bin/bash

Poté nás požádají, abychom přešli na známou adresu v dokumentaci.

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


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

Počkejte. Co?

Ale tímto překvapení nekončí. Pokud spustíte kontejner z oficiálního obrazu 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

HRÁNÍ [Spuštění výchozího nastavení Splunk] *******************************************************************************************************************************************************************************************************
Úterý 09. dubna 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

ÚKOL [Shromažďování faktů] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Úterý 09. dubna 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

ÚKOL [Získání aktuálního hostname] ***************************************************************************************************************************************************************************************************************
změněno: [localhost]
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

ÚKOL [nastavit_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
Úterý 09. dubna 2019  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
Úterý 09. dubna 2019  13:40:41 +0000 (0:00:00.216)       0:00:02.798 *********
doplněno: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml pro localhost
Úterý 09. dubna 2019  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

ÚKOL [splunk_common : Aktualizace vlastnictví adresáře Splunk] *****************************************************************************************************************************************************************************************
ok: [localhost]
Úterý 09. dubna 2019  13:40:41 +0000 (0:00:00.324)       0:00:03.210 *********
doplněno: /opt/ansible/roles/splunk_common/tasks/get_facts.yml pro localhost
Úterý 09. dubna 2019  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

no a tak dále...

Skvělé. V obrázku není ani artefakt. To znamená, že pokaždé při spuštění bude trvat čas stáhnout archiv s binárními soubory, rozbalit a nastavit.
A co docker-way a vše takové?

Ne, děkuji. Půjdeme jinou cestou. Co kdybychom všechny tyto operace provedli během fáze sestavení? Tak jdeme na to!

Abych to dlouho neprotahoval, hned ukážu konečný 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" ]

A tak, co 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

Při prvním spuštění, Splunk žádá o zadaní uživatelského jména/hesla, ale tyto údaje se používají pouze k provádění administrativních příkazů této konkrétní instalace, tedy uvnitř kontejneru. V našem případě chceme pouze spustit kontejner, aby všechno fungovalo a logy se valily proudem. Samozřejmě, je to hardcode, ale jiné způsoby jsem nenašel.

Další podle scénáře se provádí

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

splunkclouduf.spl — Jedná se o soubor s přihlašovacími údaji pro Splunk Universal Forwarder, který si můžete 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 logů

Splunk Universal Forwarder v Dockeru jako sběrač systémových logů
Toto je běžný archiv, který lze rozbalit. Uvnitř jsou certifikáty a heslo pro připojení k našemu SplunkCloud a outputs.conf se seznamem našich input instancí. Tento soubor bude aktuální, dokud znovu nenainstalujete svou instalaci Splunku nebo nepřidáte input nody, pokud je instalace on-premise. Není tedy nic špatného na tom, že jej přidáte do kontejneru.

A nakonec — restart. Ano, pro aplikaci změn je třeba ho restartovat.

V našem inputs.conf přidáváme logy, které chceme posílat do Splunku. Není nutné přidávat tento soubor do obrazu, pokud například distribuujete konfigurace pomocí puppet. Hlavní je, aby Forwarder viděl konfigurace při startu démona, jinak bude potřeba .\/splunk restart.

A co to jsou skripty docker stats? Na GitHubu existuje staré řešení od outcoldman, skripty byly převzaty odsud a upraveny pro práci s aktuálními verzemi Dockeru (ce-17.*) a Splunku (7.*).

S získanými daty lze vytvářet takové

dashboardy: (pár obrázků)Splunk Universal Forwarder v Dockeru jako sběrač systémových logů

Splunk Universal Forwarder v Dockeru jako sběrač systémových logů
Zdrojový kód dashboardů je v repozitáři uvedeném na konci článku. Všimněte si, že jsou tam dvě výběrová pole: 1 — výběr indexu (hledá se podle masky), výběr hostitele/kontejneru. Maska indexu pravděpodobně budete muset aktualizovat v závislosti na názvech, které používáte.

Na závěr chci upozornit na funkci start() v

entrypoint.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "Proměnná prostředí 'SPLUNK_INDEX' je prázdná nebo není definována. Měla by být 'dev' nebo '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 'spouští se' > /tmp/splunk-container.state"
	${SPLUNK_HOME}/bin/splunk start
    watch_for_failure
}

V mém případě používáme pro každé prostředí a každou jednotlivou entitu, ať už se jedná o aplikaci v kontejneru nebo hostitelskou stroj, samostatný index. Tím nebude trpět rychlost vyhledávání při významném hromadění dat. Pro pojmenovávání indexů používáme jednoduché pravidlo: _. Takže, abychom byl kontejner univerzální, měníme před spuštěním samotného démona sed- wildcard na název prostředí. Proměnná s názvem prostředí se předává prostřednictvím proměnných prostředí. Zní to vtipně.

Je třeba také poznamenat, že na Splunk nemá vliv přítomnost docker parametru z nějakého důvodu. hostnameI tak bude stále posílat logy s ID svého kontejneru do pole host. Jako řešení lze namontovat /etc/hostname z hostitelské mašiny a při startu provést změnu podobnou jménům indexů.

Příklad docker-compose.yml

verze: '2'
služby:
  splunk-forwarder:
    obraz: "${IMAGE_REPO}\/docker-stats-splunk-forwarder:${IMAGE_VERSION}"
    prostředí:
      SPLUNK_INDEX: ${ENVIRONMENT}
    svazky:
    - \/etc\/hostname:\/etc\/hostname:ro
    - \/var\/log:\/var\/log
    - \/var\/run\/docker.sock:\/var\/run\/docker.sock:ro

Výsledek

Ano, je možné, že řešení není ideální a rozhodně není univerzální pro všechny, protože existuje mnoho „hardcodu“. Ale na jeho základě si každý může vytvořit svůj obraz a uložit ho do svého privátního archiváře, pokud, jak se stalo, potřebujete Splunk Forwarder právě v Dockeru.

Odkazy:

Řešení z článku
Řešení od outcoldman, které inspirovalo opětovné využití části funkcionality
Oficiální dokumentace k nastavení Universal Forwarder

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster