Splunk Universal Forwarder yn docker as in systeem log samler

Splunk Universal Forwarder yn docker as in systeem log samler

Splunk is ien fan ferskate fan 'e meast werkenbere kommersjele log kolleksje en analyse produkten. Sels no, as ferkeap net mear wurdt makke yn Ruslân, is dit gjin reden om gjin ynstruksjes / how-to foar dit produkt te skriuwen.

Objective: sammelje systeemlogboeken fan dockerknooppunten yn Splunk sûnder de konfiguraasje fan 'e hostmasjine te feroarjen

Ik wol graach begjinne mei de offisjele oanpak, dy't in bytsje frjemd sjocht by it brûken fan Docker.
Link nei Docker-hub
Wat hawwe wy:

1. Pullim ôfbylding

$ docker pull splunk/universalforwarder:latest

2. Begjin de kontener mei de nedige parameters

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

3. Wy geane yn 'e kontener

docker exec -it <container-id> /bin/bash

Dêrnei wurde wy frege om te gean nei in bekend adres yn 'e dokumintaasje.

En konfigurearje de kontener nei't it begjint:


./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart

Wachtsje. Wat?

Mar de ferrassingen einigje dêr net. As jo ​​​​de kontener útfiere fan 'e offisjele ôfbylding yn ynteraktive modus, sille jo it folgjende sjen:

In bytsje teloarstelling


$ 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 *********

ну и так далее...

Grut. De ôfbylding befettet net iens in artefakt. Dat is, elke kear as jo begjinne, sil it tiid nimme om it argyf te downloaden mei binaries, útpakke en konfigurearje.
Hoe sit it mei docker-way en dat alles?

Nee tank. Wy sille in oare rûte nimme. Wat as wy al dizze operaasjes útfiere yn 'e assemblagestadium? Dan gean wy!

Om net te lang te fertrage, sil ik jo de lêste ôfbylding direkt sjen litte:

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" ]

Dus wat is befette yn

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

By de earste start freget Splunk jo om it in oanmelding / wachtwurd te jaan, MAAR dizze gegevens wurde brûkt allinnich om bestjoerlike kommando's út te fieren foar dy bepaalde ynstallaasje, dat is binnen de kontener. Yn ús gefal wolle wy gewoan de kontener lansearje sadat alles wurket en de logs as in rivier streame. Fansels is dit hardcode, mar ik haw gjin oare manieren fûn.

Fierder neffens it skript wurdt útfierd

/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme

splunkclouduf.spl - Dit is in bewiisbrieven foar Splunk Universal Forwarder, dat kin wurde downloade fan 'e webynterface.

Wêr te klikken om te downloaden (yn ôfbyldings)Splunk Universal Forwarder yn docker as in systeem log samler

Splunk Universal Forwarder yn docker as in systeem log samler
Dit is in gewoan argyf dat útpakt wurde kin. Binnen binne sertifikaten en in wachtwurd foar ferbining mei ús SplunkCloud en outputs.conf mei in list fan ús ynfier-eksimplaren. Dit bestân sil relevant wêze oant jo jo Splunk-ynstallaasje opnij ynstalleare of in ynfierknooppunt tafoegje as de ynstallaasje on-premise is. Dêrom is der neat mis mei it tafoegjen fan it yn 'e kontener.

En it lêste ding is opnij starte. Ja, om de wizigingen oan te passen, moatte jo it opnij starte.

Yn ús inputs.conf wy foegje de logs ta dy't wy wolle stjoere nei Splunk. It is net nedich om dizze triem oan 'e ôfbylding ta te foegjen as jo bygelyks konfiguraasjes fia puppet distribuearje. It ienige ding is dat Forwarder de konfiguraasjes sjocht as de daemon begjint, oars sil it nedich wêze ./splunk opnij starte.

Hokker soarte fan docker stats-skripts binne it? D'r is in âlde oplossing op Github fan outcoldman, de skripts waarden dêrwei helle en oanpast om te wurkjen mei aktuele ferzjes fan Docker (ce-17.*) en Splunk (7.*).

Mei de krigen gegevens kinne jo it folgjende bouwe

dashboards: (in pear foto's)Splunk Universal Forwarder yn docker as in systeem log samler

Splunk Universal Forwarder yn docker as in systeem log samler
De boarnekoade foar streepkes is yn 'e keppeling oan' e ein fan it artikel. Tink derom dat d'r 2 selekteare fjilden binne: 1 - yndekseleksje (socht troch masker), seleksje fan host / kontener. Jo sille wierskynlik it yndeksmasker moatte bywurkje, ôfhinklik fan 'e nammen dy't jo brûke.

Ta beslút wol ik jo oandacht freegje foar de funksje 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
}

Yn myn gefal, foar elke omjouwing en elke yndividuele entiteit, oft it in applikaasje is yn in kontener as in hostmasine, brûke wy in aparte yndeks. Op dizze manier sil de syksnelheid net lije as d'r in signifikante accumulation fan gegevens is. In ienfâldige regel wurdt brûkt om yndeksen te neamen: _. Dêrom, om de kontener universeel te wêzen, foardat de daemon sels lanseart, ferfange wy sed-th jokerteken oan 'e namme fan' e omjouwing. De omjouwingsnammefariabele wurdt trochjûn troch omjouwingsfariabelen. Klinkt grappich.

It is ek de muoite wurdich op te merken dat Splunk om ien of oare reden net wurdt beynfloede troch de oanwêzigens fan 'e docker-parameter hostnamme. Hy sil noch koppich logs stjoere mei de id fan syn kontener yn it hostfjild. As oplossing kinne jo mount / etc / hostnamme fan de host masine en by it opstarten meitsje ferfangings fergelykber mei yndeks nammen.

Foarbyld 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

It resultaat

Ja, miskien is de oplossing net ideaal en wis net universeel foar elkenien, om't d'r in protte binne "hardcode". Mar op grûn dêrfan kin elkenien har eigen ôfbylding bouwe en it yn har privee artifactory pleatse, as jo, lykas it bart, Splunk Forwarder yn Docker nedich binne.

Ferwizings:

Oplossing út it artikel
In oplossing fan outcoldman dy't ús ynspirearre om wat fan 'e funksjonaliteit opnij te brûken
Fan. dokumintaasje foar it ynstellen fan Universal Forwarder

Boarne: www.habr.com

Add a comment