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.
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)
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
Med de innhentede dataene kan du bygge følgende
dashbord: (et par bilder)
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:
Kilde: www.habr.com