Splunk er et af de mest kendte kommercielle produkter til indsamling og analyse af logs. Selvom der ikke længere sælges i Rusland, er det stadig relevant at skrive instruktioner/how-to om dette produkt.
Regler for godkendelse af merge-requests: at indsamle systemlogs fra Docker-noder i Splunk uden at ændre host-maskinens konfiguration
Lad os starte med den officielle tilgang, som virker lidt underlig, når man bruger Docker.
Hvad har vi så:
1. Hent billedet
$ docker pull splunk/universalforwarder:latest2. Start containeren med de nødvendige parametre
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Gå ind i containeren
docker exec -it /bin/bashDerefter bliver vi bedt om at besøge den kendte adresse i dokumentationen.
Og konfigurere containeren efter opstart:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Vent. Hvad?
Men overraskelserne stopper ikke her. Hvis du kører containeren fra det officielle billede i interaktiv tilstand, vil du se følgende:
Lidt skuffelse
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
PLAY [Kør standard Splunk provisioning] *******************************************************************************************************************************************************************************************************
Tirsdag 09 April 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
TASK [Indsamling af fakta] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Tirsdag 09 April 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
TASK [Hent aktuel værtsnavn] *******************************************************************************************************************************************************************************************************************
ændret: [localhost]
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
Tirsdag 09 April 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
Tirsdag 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
Tirsdag 09 April 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
TASK [splunk_common : Opdater Splunk katalog ejer] *****************************************************************************************************************************************************************************************
ok: [localhost]
Tirsdag 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
Tirsdag 09 April 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
og så videre...
Fremragende. Der er endda ikke noget artefakt i billedet. Det vil sige, hver gang vi starter, vil der blive brugt tid på at downloade en arkiv med binære filer, udpakke og konfigurere.
Men hvad med docker-way og alt det der?
Nej tak. Vi vil vælge en anden vej. Hvad hvis vi udfører alle disse operationer på byggefasen? Så lad os komme i gang!
For ikke at trække det ud, så viser jeg straks det endelige billede:
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å hvad indeholder
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 eofVed første start beder Splunk om at oprette brugernavn/adgangskode, MEN disse oplysninger bruges kun til at udføre administrative kommandoer for denne specifikke installation, altså inden i containeren. I vores tilfælde ønsker vi blot at starte containeren, så alt fungerer, og loggene strømmer i store mængder. Selvfølgelig er det hardkodet, men jeg har ikke fundet andre løsninger.
Derefter fortsætter scenariet med at udføre
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Dette er en credentials-fil til Splunk Universal Forwarder, som kan downloades via webgrænsefladen.
Hvor skal man klikke for at downloade (i billeder)
Dette er et almindeligt arkiv, som kan udpakkes. Inden i findes der certifikater og en adgangskode til at forbinde til vores SplunkCloud og outputs.conf med en liste over vores input-instanser. Denne fil vil være aktuel, indtil du geninstallerer din Splunk-installation eller tilføjer input-noder, hvis installationen er on-premise. Så der er ikke noget at bekymre sig om ved at tilføje den ind i containeren.
Og sidst men ikke mindst — genstart. Ja, for at anvende ændringerne skal den genstartes.
I vores inputs.conf tilføjer vi de logs, vi ønsker at sende til Splunk. Det er ikke nødvendigt at tilføje denne fil til billedet, hvis du for eksempel distribuerer konfigurationer via puppet. Det vigtigste er, at Forwarder kan se konfigurationerne, når daemonen starter, ellers vil der være behov for .\/splunk restart.
Hvad er docker stats scripts? Der er en gammel løsning på GitHub fra , scripts der er taget derfra og tilpasset til at arbejde med de aktuelle versioner af Docker (ce-17.*) og Splunk (7.*).
Med de indsamlede data kan man lave sådanne
dashboards: (et par billeder)
Kildekoden til dashboards ligger i det repo, der er angivet i slutningen af artiklen. Bemærk, at der er to select-felter: 1 — valg af indeks (søgning efter maske), valg af host/container. Du skal sandsynligvis opdatere indeksets maske afhængigt af de navne, du bruger.
Som en afslutning vil jeg gerne påpege funktionen start() i
entrypoint.sh
start() {
trap teardown EXIT
if [ -z $SPLUNK_INDEX ]; then
echo "'SPLUNK_INDEX' miljøvariabel er tom eller ikke defineret. Skal være '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 'starter' > /tmp/splunk-container.state"
${SPLUNK_HOME}/bin/splunk start
watch_for_failure
}I mit tilfælde bruger vi en separat indeks for hvert miljø og hver enkelt enhed, hvad enten det er en applikation i en container eller en værtsmaskine. Således vil søgeresultaterne ikke lide, når der er betydelig akkumulering af data. En enkel regel bruges til navngivning af indekser: _. Derfor, for at gøre containeren universel, erstatter vi, før vi direkte starter daemonen, sed-med wildcard på navnet på miljøet. Variablen med navnet på miljøet overføres via miljøvariabler. Det 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. Den vil stadig insistere på at sende logs med id fra sin container til feltet host. Som en løsning kan man montere /etc/hostname fra værtmaskinen og ved start udføre en udskiftning, der ligner indeksnavnene.
Eksempel 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:roResultat
Ja, det er muligt, at løsningen ikke er ideel og bestemt ikke universel for alle, da der er meget «hardcode». Men på baggrund af det kan enhver samle sit eget billede og lægge det i sin private artefaktlager, hvis det skulle ske, at du har brug for Splunk Forwarder specifikt i Docker.
Links:
Kilde: habr.com
