Splunk Universal Forwarder in Docker as a system log collector

Splunk Universal Forwarder in Docker as a system log collector

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.
Link til Docker hub
Hvad har vi så:

1. Hent billedet

$ docker pull splunk/universalforwarder:latest

2. Start containeren med de nødvendige parametre

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

3. Gå ind i containeren

docker exec -it  /bin/bash

Derefter 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 eof

Ved 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:changeme

splunkclouduf.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)Splunk Universal Forwarder in Docker as a system log collector

Splunk Universal Forwarder in Docker as a system log collector
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 outcoldman, 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)Splunk Universal Forwarder in Docker as a system log collector

Splunk Universal Forwarder in Docker as a system log collector
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:ro

Resultat

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:

Løsningen fra artiklen
Løsningen fra outcoldman, der inspirerede til genbrug af en del af funktionaliteten
Officiel dokumentation til opsætning af Universal Forwarder

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster