Splunk Universal Forwarder i Docker som systemloggsamlaren

Splunk Universal Forwarder i Docker som systemloggsamlaren

Splunk är en av de mest kända kommersiella produkterna för insamling och analys av loggar. Även nu när försäljning i Ryssland inte längre förekommer, är detta ingen anledning att inte skriva instruktioner / how-to för denna produkt.

Uppgift: att samla systemloggar från Docker-noder i Splunk utan att ändra konfigurationen på värdmaskinen

Vi börjar med det officiella tillvägagångssättet, som verkar lite konstigt när man använder Docker.
Länk till Docker hub
Vad har vi här:

1. Dra bilden

$ docker pull splunk/universalforwarder:latest

2. Starta upp containern med rätt parametrar

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

3. Gå in i containern

docker exec -it  /bin/bash

Därefter uppmanas vi att gå till den välkända adressen i dokumentationen.

Och konfigurera containern efter att ha startat den:


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

Vänta. Vad?

Men på detta slutar inte överraskningarna. Om du startar containern 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 [Kör standardkonfiguration för Splunk] *****************************************************************************************************************************************************************************************************
Tisdag 09 April 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TASK [Samlar fakta] *********************************************************************************************************************************************************************************************************************************
ok: [localhost]
Tisdag 09 April 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TASK [Hämta aktuell värdnamn] **********************************************************************************************************************************************************************************************************************
ändrades: [localhost]
Tisdag 09 April 2019  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Tisdag 09 April 2019  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

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

TASK [splunk_common : Uppdatera Splunk katalogägare] *********************************************************************************************************************************************************************************************
ok: [localhost]
Tisdag 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 för localhost
Tisdag 09 April 2019  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

och så vidare...

Utmärkt. Det finns inte ens något artefakt i bilden. Så varje gång vi kör den kommer tid att gå åt för att ladda ner arkivet med binärfiler, packa upp och konfigurera.
Men vad hände med docker-way och allt det där?

Nej, tack. Vi väljer en annan väg. Vad om vi utför alla dessa operationer under byggsteget? Låt oss köra!

För att inte dra ut på tiden, här är den slutliga bilden:

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 om att ange ett användarnamn/lösenord, MEN dessa uppgifter används bara för att utföra administrativa kommandon för just denna installation, det vill säga, inuti containern. I vårt fall vill vi bara starta containern så att allt fungerar och loggarna flödar. Självklart är detta hårdkod, men jag har inte hittat andra sätt.

Därefter i scenariot utförs

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

splunkclouduf.spl — Detta är kredifilen för Splunk Universal Forwarder som kan laddas ner från webbgränssnittet.

Var man trycker för att ladda ner (i bilder)Splunk Universal Forwarder i Docker som systemloggsamlaren

Splunk Universal Forwarder i Docker som systemloggsamlaren
Detta är ett vanligt arkiv som kan packas upp. Inuti finns certifikat och lösenord för att ansluta till vår SplunkCloud och outputs.conf med en lista över våra input-instansar. Denna fil kommer att vara aktuell tills du installerar om din Splunk-installation eller lägger till input-noder, om installationen är on-premise. Så det är inget att oroa sig för att lägga in den i containern.

Och det sista — restart. Ja, för att tillämpa ändringarna måste det startas om.

I vår inputs.conf lägger vi till loggar 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 puppet. Det främsta är att Forwardern ser konfigurationerna vid demonens start, annars kommer det att behövas .\/splunk restart.

Och vad är docker stats-skripten? Det finns en gammal lösning på GitHub från outcoldman, skripten är tagna därifrån och har vidareutvecklats för att fungera med aktuella versioner av Docker (ce-17.*) och Splunk (7.*).

Med de erhållna uppgifterna kan man bygga sådana

dashboardar: (ett par bilder)Splunk Universal Forwarder i Docker som systemloggsamlaren

Splunk Universal Forwarder i Docker som systemloggsamlaren
Källkoden för dashboards ligger i repot som anges i slutet av artikeln. Observera att det finns 2 valfält: 1 — valet av index (de söks efter mönster), valet av värd/container. Mönstret för indexet kommer du troligen att behöva uppdatera, beroende på namnen du använder.

Till sist vill jag påpeka funktionen start() på

entrypoint.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "'SPLUNK_INDEX' miljövariabel är tom eller inte definierad. Ska vara 'dev' eller '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 'startar' > /tmp/splunk-container.state"
	${SPLUNK_HOME}/bin/splunk start
    watch_for_failure
}

I mitt fall använder vi en separat index för varje miljö och varje enskild enhet, oavsett om det är en applikation i containern eller en värdmaskin. Så kommer inte sökhastigheten att påverkas vid betydande datainsamling. För namngivning av index används en enkel regel: _. Så för att containern ska vara universell, ersätter vi innan demon startas sed-wildcard med miljöns namn. Variabeln med miljöns namn överförs via miljövariabler. Det låter roligt.

Det är också värt att notera att av någon anledning påverkas inte Splunk av förekomsten av docker-parametern. hostnameDen kommer fortfarande att skicka loggar med id:t för sin container i fältet host. Som en lösning kan man montera /etc/hostname från värdmaskinen och vid start göra en ersättning, liknande namn på index.

Exempel på 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

Resultat

Ja, det kan hända att lösningen inte är perfekt och definitivt inte universell för alla, eftersom det finns mycket «hård kod». Men baserat på detta kan alla skapa sin egen bild och lagra den i sin privata artifact-repo, ifall ni, av en händelse, behöver Splunk Forwarder just i Docker.

Länkar:

Lösningen i artikeln
Lösningen från outcoldman som inspirerade till att återanvända delar av funktionaliteten
Officiell dokumentation om konfiguration av Universal Forwarder

Källa: habr.com

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