Splunk Universal Forwarder i docker som systemloggsamler

Splunk Universal Forwarder i docker som systemloggsamler

Splunk er et av flere av de mest gjenkjennelige kommersielle produktene for innsamling og analyse av tømmerstokker. Selv nå, når salg ikke lenger foregår i Russland, er ikke dette en grunn til å ikke skrive instruksjoner/veiledning for dette produktet.

Oppgave: samle inn systemlogger fra docker-noder i Splunk uten å endre vertsmaskinens konfigurasjon

Jeg vil gjerne starte med den offisielle tilnærmingen, som ser litt merkelig ut når du bruker Docker.
Link til Docker-hub
Hva har vi:

1. Pullim bilde

$ docker pull splunk/universalforwarder:latest

2. Start beholderen med de nødvendige parameterne

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

3. Vi går inn i containeren

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

Deretter blir vi bedt om å gå til en kjent adresse i dokumentasjonen.

Og konfigurer beholderen etter at den starter:


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

Vente. Hva?

Men overraskelsene slutter ikke der. Hvis du kjører beholderen fra det offisielle bildet i interaktiv modus, vil du se følgende:

Litt skuffelse


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

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

Flott. Bildet inneholder ikke engang en artefakt. Det vil si at hver gang du starter vil det ta tid å laste ned arkivet med binærfiler, pakke ut og konfigurere.
Hva med docker-way og alt det der?

Nei takk. Vi tar en annen vei. Hva om vi utfører alle disse operasjonene på monteringsstadiet? Så la oss gå!

For ikke å utsette for lenge, skal jeg vise deg det endelige bildet med en gang:

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å hva ligger 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

Ved første start ber Splunk deg om å gi den et innlogging/passord, MEN disse dataene brukes bare for å utføre administrative kommandoer for den aktuelle installasjonen, det vil si inne i beholderen. I vårt tilfelle ønsker vi bare å lansere containeren slik at alt fungerer og stokkene flyter som en elv. Selvfølgelig er dette hardcode, men jeg har ikke funnet noen andre måter.

Videre i henhold til skriptet utføres

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

splunkclouduf.spl — Dette er en legitimasjonsfil for Splunk Universal Forwarder, som kan lastes ned fra nettgrensesnittet.

Hvor du kan klikke for å laste ned (i bilder)Splunk Universal Forwarder i docker som systemloggsamler

Splunk Universal Forwarder i docker som systemloggsamler
Dette er et vanlig arkiv som kan pakkes ut. Inne er sertifikater og et passord for å koble til vår SplunkCloud og outputs.conf med en liste over våre inndataforekomster. Denne filen vil være relevant inntil du installerer Splunk-installasjonen på nytt eller legger til en inngangsnode hvis installasjonen er lokalt. Derfor er det ikke noe galt med å legge det inne i beholderen.

Og det siste er omstart. Ja, for å bruke endringene må du starte den på nytt.

I vår inputs.conf vi legger til loggene som vi ønsker å sende til Splunk. Det er ikke nødvendig å legge til denne filen i bildet hvis du for eksempel distribuerer konfigurasjoner via dukke. Det eneste er at Forwarder ser konfigurasjonene når demonen starter, ellers trenger den ./splunk omstart.

Hva slags docker-statistikkskript er det? Det er en gammel løsning på Github fra outcoldman, skriptene ble hentet derfra og modifisert for å fungere med gjeldende versjoner av Docker (ce-17.*) og Splunk (7.*).

Med de innhentede dataene kan du bygge følgende

dashbord: (et par bilder)Splunk Universal Forwarder i docker som systemloggsamler

Splunk Universal Forwarder i docker som systemloggsamler
Kildekoden for bindestreker er i lenken på slutten av artikkelen. Vær oppmerksom på at det er 2 utvalgte felt: 1 - indeksvalg (søkt etter maske), valg av vert/beholder. Du må sannsynligvis oppdatere indeksmasken, avhengig av navnene du bruker.

Avslutningsvis vil jeg gjøre deg oppmerksom på funksjonen start() в

inngangspunkt.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 tilfelle, for hvert miljø og hver enkelt enhet, det være seg en applikasjon i en container eller en vertsmaskin, bruker vi en egen indeks. På denne måten vil søkehastigheten ikke lide når det er en betydelig akkumulering av data. En enkel regel brukes til å navngi indekser: _. Derfor, for at beholderen skal være universell, før vi starter selve daemonen, erstatter vi tørste-th jokertegn til navnet på miljøet. Miljønavnvariabelen sendes gjennom miljøvariabler. Høres morsomt ut.

Det er også verdt å merke seg at Splunk av en eller annen grunn ikke påvirkes av tilstedeværelsen av docker-parameteren vertsnavn. Han vil fortsatt hardnakket sende logger med ID-en til containeren hans i vertsfeltet. Som en løsning kan du montere / Etc / vertsnavn fra vertsmaskinen og ved oppstart foreta erstatninger som ligner på indeksnavn.

Eksempel 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

Total

Ja, kanskje er ikke løsningen ideell og absolutt ikke universell for alle, siden det er mange "hardcode". Men basert på det kan alle bygge sitt eget bilde og legge det i sin private artifactory, hvis du, som det skjer, trenger Splunk Forwarder i Docker.

referanser:

Løsning fra artikkelen
En løsning fra outcoldman som inspirerte oss til å gjenbruke noe av funksjonaliteten
Av. dokumentasjon for oppsett av Universal Forwarder

Kilde: www.habr.com

Legg til en kommentar