Splunk Universal Forwarder i docker som systemlogopsamler

Splunk Universal Forwarder i docker som systemlogopsamler

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.
Link til Docker-hub
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)Splunk Universal Forwarder i docker som systemlogopsamler

Splunk Universal Forwarder i docker som systemlogopsamler
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 outcoldman, scripts blev taget derfra og modificeret til at fungere med nuværende versioner af Docker (ce-17.*) og Splunk (7.*).

Med de opnåede data kan du bygge følgende

dashboards: (et par billeder)Splunk Universal Forwarder i docker som systemlogopsamler

Splunk Universal Forwarder i docker som systemlogopsamler
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:

Løsning fra artiklen
En løsning fra outcoldman, der inspirerede os til at genbruge noget af funktionaliteten
Af. dokumentation for opsætning af Universal Forwarder

Kilde: www.habr.com

Tilføj en kommentar