Splunk er et af flere af de mest genkendelige kommercielle logindsamlings- og analyseprodukter. Selv nu, hvor der ikke længere sælges i Rusland, er dette ikke en grund til ikke at skrive instruktioner/how-to til dette produkt.
Opgave: Indsaml systemlogfiler fra docker-noder i Splunk uden at ændre værtsmaskinens konfiguration
Jeg vil gerne starte med den officielle tilgang, som ser lidt mærkelig ud, når du bruger Docker.
Hvad har vi:
1. Pullim billede
$ docker pull splunk/universalforwarder:latest
2. Start beholderen med de nødvendige parametre
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
3. Vi går ind i containeren
docker exec -it <container-id> /bin/bash
Dernæst bliver vi bedt om at gå til en kendt adresse i dokumentationen.
Og konfigurer beholderen, efter den er startet:
./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart
Vente. Hvad?
Men overraskelserne slutter ikke der. Hvis du kører containeren fra det officielle billede i interaktiv tilstand, vil du se følgende:
En smule 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 *********
ну и так далее...
Store. Billedet indeholder ikke engang en artefakt. Det vil sige, at hver gang du starter vil det tage tid at downloade arkivet med binære filer, udpakke og konfigurere.
Hvad med docker-way og alt det der?
Nej tak. Vi tager en anden vej. Hvad hvis vi udfører alle disse operationer på montagestadiet? Så lad os gå!
For ikke at forsinke for længe, vil jeg vise dig det endelige billede med det samme:
Dockerfil
# Тут у кого какие предпочтения
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å hvad er indeholdt 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 beder Splunk dig om at give den et login/adgangskode, MEN disse data bruges kun at udføre administrative kommandoer for den pågældende installation, det vil sige inde i containeren. I vores tilfælde vil vi bare lancere containeren, så alt fungerer, og stammerne flyder som en flod. Selvfølgelig er dette hardcode, men jeg har ikke fundet andre måder.
Yderligere i henhold til scriptet udføres
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl — Dette er en legitimationsfil til Splunk Universal Forwarder, som kan downloades fra webgrænsefladen.
Hvor skal man klikke for at downloade (i billeder)
Dette er et almindeligt arkiv, der kan pakkes ud. Indeni er certifikater og en adgangskode til at oprette forbindelse til vores SplunkCloud og outputs.conf med en liste over vores inputforekomster. Denne fil vil være relevant, indtil du geninstallerer din Splunk-installation eller tilføjer en inputnode, hvis installationen er på stedet. Derfor er der ikke noget i vejen med at tilføje det inde i beholderen.
Og den sidste ting er genstart. Ja, for at anvende ændringerne skal du genstarte den.
I vores inputs.conf vi tilføjer de logfiler, som vi vil sende til Splunk. Det er ikke nødvendigt at tilføje denne fil til billedet, hvis du for eksempel distribuerer configs via dukke. Det eneste er, at Forwarder ser konfigurationerne, når dæmonen starter, ellers får den brug for ./splunk genstart.
Hvilken slags docker stats-scripts er det? Der er en gammel løsning på Github fra
Med de opnåede data kan du bygge følgende
dashboards: (et par billeder)
Kildekoden til bindestreger findes i linket i slutningen af artiklen. Bemærk venligst, at der er 2 udvalgte felter: 1 - indeksvalg (søgt med maske), valg af vært/container. Du bliver sandsynligvis nødt til at opdatere indeksmasken, afhængigt af de navne, du bruger.
Afslutningsvis vil jeg gerne henlede din opmærksomhed 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 mit tilfælde, for hvert miljø og hver enkelt enhed, hvad enten det er en applikation i en container eller en værtsmaskine, bruger vi et separat indeks. På denne måde vil søgehastigheden ikke lide, når der er en betydelig ophobning af data. En simpel regel bruges til at navngive indekser: _. Derfor, for at beholderen skal være universel, før lancering af selve dæmonen, erstatter vi sed-th jokertegn til navnet på miljøet. Miljønavnsvariablen sendes gennem miljøvariabler. Lyder sjovt.
Det er også værd at bemærke, at Splunk af en eller anden grund ikke påvirkes af tilstedeværelsen af docker-parameteren hostname. Han vil stadig stædigt sende logfiler med id'et for sin container i værtsfeltet. Som en løsning kan du montere / Etc / værtsnavn fra værtsmaskinen og ved opstart foretage udskiftninger svarende til indeksnavne.
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, måske er løsningen ikke ideel og bestemt ikke universel for alle, da der er mange "hardcode". Men baseret på det kan alle bygge deres eget billede og lægge det i deres private artifactory, hvis du som det sker, har brug for Splunk Forwarder i Docker.
referencer:
Kilde: www.habr.com