Splunk Universal Forwarder i docker som en systemloggsamlare

Splunk Universal Forwarder i docker som en systemloggsamlare

Splunk är en av flera av de mest kända kommersiella stockinsamlings- och analysprodukterna. Inte ens nu, när försäljningen inte längre sker i Ryssland, är detta inte en anledning att inte skriva instruktioner/how-to för denna produkt.

Uppgift: samla in systemloggar från dockarnoder i Splunk utan att ändra värddatorns konfiguration

Jag skulle vilja börja med det officiella tillvägagångssättet, som ser lite konstigt ut när du använder Docker.
Länk till Docker-hubben
Vad har vi:

1. Pullim bild

$ docker pull splunk/universalforwarder:latest

2. Starta behållaren med nödvändiga parametrar

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

3. Vi går in i containern

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

Därefter uppmanas vi att gå till en känd adress i dokumentationen.

Och konfigurera behållaren efter att den startar:


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

Vänta. Vad?

Men överraskningarna slutar inte där. Om du kör behållaren från den officiella bilden i interaktivt läge kommer du att se följande:

Lite besvikelse


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

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

Bra. Bilden innehåller inte ens en artefakt. Det vill säga, varje gång du startar kommer det att ta tid att ladda ner arkivet med binärer, packa upp och konfigurera.
Hur är det med docker-way och allt det där?

Nej tack. Vi tar en annan väg. Vad händer om vi utför alla dessa operationer på monteringsstadiet? Då går vi!

För att inte dröja för länge visar jag den slutliga bilden direkt:

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

Så vad finns i

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

Vid första starten ber Splunk dig att ge den ett inloggning/lösenord, MEN denna data används endast för att utföra administrativa kommandon för just den installationen, det vill säga inuti behållaren. I vårt fall vill vi bara sjösätta containern så att allt fungerar och stockarna flyter som en flod. Naturligtvis är detta hårdkod, men jag har inte hittat några andra sätt.

Vidare enligt skriptet exekveras

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

splunkclouduf.spl — Det här är en referensfil för Splunk Universal Forwarder, som kan laddas ner från webbgränssnittet.

Var man kan klicka för att ladda ner (i bilder)Splunk Universal Forwarder i docker som en systemloggsamlare

Splunk Universal Forwarder i docker som en systemloggsamlare
Detta är ett vanligt arkiv som kan packas upp. Inuti finns certifikat och ett lösenord för att ansluta till vårt SplunkCloud och outputs.conf med en lista över våra indatainstanser. Den här filen kommer att vara relevant tills du installerar om din Splunk-installation eller lägger till en ingångsnod om installationen är lokal. Därför är det inget fel med att lägga det inuti behållaren.

Och det sista är omstart. Ja, för att tillämpa ändringarna måste du starta om den.

I vår inputs.conf vi lägger till loggarna som vi vill skicka till Splunk. Det är inte nödvändigt att lägga till denna fil i bilden om du till exempel distribuerar konfigurationer via marionett. Det enda är att Forwarder ser konfigurationerna när demonen startar, annars kommer den att behöva ./splunk omstart.

Vilken typ av docker-statistikskript är det? Det finns en gammal lösning på Github från outcoldman, skripten togs därifrån och modifierades för att fungera med nuvarande versioner av Docker (ce-17.*) och Splunk (7.*).

Med erhållen data kan du bygga följande

instrumentpaneler: (ett par bilder)Splunk Universal Forwarder i docker som en systemloggsamlare

Splunk Universal Forwarder i docker som en systemloggsamlare
Källkoden för bindestreck finns i länken i slutet av artikeln. Observera att det finns 2 valda fält: 1 - indexval (sökt med mask), val av värd/behållare. Du kommer sannolikt att behöva uppdatera indexmasken, beroende på vilka namn du använder.

Avslutningsvis vill jag uppmärksamma er på funktionen Start() в

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
}

I mitt fall, för varje miljö och varje enskild enhet, vare sig det är en applikation i en container eller en värdmaskin, använder vi ett separat index. På så sätt kommer sökhastigheten inte att lida när det finns en betydande ackumulering av data. En enkel regel används för att namnge index: _. Därför, för att behållaren ska vara universell, innan vi startar själva demonen, ersätter vi törst-th jokertecken till namnet på miljön. Miljönamnsvariabeln skickas genom miljövariabler. Låter roligt.

Det är också värt att notera att Splunk av någon anledning inte påverkas av närvaron av docker-parametern hostname. Han kommer fortfarande envist att skicka loggar med id för sin container i värdfältet. Som lösning kan du montera / Etc / hostname från värddatorn och vid uppstart gör ersättningar som liknar indexnamn.

Exempel 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

Totalt

Ja, lösningen kanske inte är idealisk och absolut inte universell för alla, eftersom det finns många "svår kod". Men baserat på det kan alla bygga sin egen bild och lägga den i sin privata artifactory, om du som det händer behöver Splunk Forwarder i Docker.

Länkar:

Lösning från artikeln
En lösning från outcoldman som inspirerade oss att återanvända en del av funktionaliteten
Av. dokumentation för installation av Universal Forwarder

Källa: will.com

Köp pålitlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster