Splunk Universal Forwarder sa docker bilang isang system log collector

Splunk Universal Forwarder sa docker bilang isang system log collector

Ang Splunk ay isa sa ilan sa mga pinakakilalang komersyal na koleksyon ng log at mga produkto ng pagsusuri. Kahit ngayon, kapag ang mga benta ay hindi na ginawa sa Russia, hindi ito dahilan para hindi magsulat ng mga tagubilin/paano para sa produktong ito.

Gawain: mangolekta ng mga log ng system mula sa mga docker node sa Splunk nang hindi binabago ang configuration ng host machine

Gusto kong magsimula sa opisyal na diskarte, na mukhang kakaiba kapag gumagamit ng Docker.
Mag-link sa Docker hub
Ano ang mayroon tayo:

1. Pullim na imahe

$ docker pull splunk/universalforwarder:latest

2. Simulan ang lalagyan gamit ang mga kinakailangang parameter

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

3. Pumunta kami sa lalagyan

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

Susunod, hinihiling sa amin na pumunta sa isang kilalang address sa dokumentasyon.

At i-configure ang lalagyan pagkatapos nitong magsimula:


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

Teka. Ano?

Ngunit ang mga sorpresa ay hindi nagtatapos doon. Kung patakbuhin mo ang lalagyan mula sa opisyal na larawan sa interactive na mode, makikita mo ang sumusunod:

Medyo disappointment


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

Π½Ρƒ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅...

Malaki. Wala man lang artifact ang larawan. Ibig sabihin, sa tuwing magsisimula ka ay magtatagal upang i-download ang archive gamit ang mga binary, i-unpack at i-configure.
Paano ang docker-way at lahat ng iyon?

Salamat nalang. Magkaibang ruta ang tatahakin natin. Paano kung gagawin natin ang lahat ng mga operasyong ito sa yugto ng pagpupulong? Tapos tayo na!

Upang hindi masyadong maantala, ipapakita ko sa iyo ang huling larawan kaagad:

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

Kaya kung ano ang nakapaloob sa

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

Sa unang pagsisimula, hinihiling sa iyo ng Splunk na bigyan ito ng login/password, PERO ang data na ito ay ginagamit lamang upang magsagawa ng mga administratibong utos para sa partikular na pag-install, iyon ay, sa loob ng lalagyan. Sa aming kaso, gusto lang naming ilunsad ang lalagyan upang gumana ang lahat at ang mga troso ay dumadaloy na parang ilog. Siyempre, ito ay hardcode, ngunit wala akong nakitang iba pang paraan.

Ang karagdagang ayon sa script ay naisakatuparan

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

splunkclouduf.spl β€” Ito ay isang file ng kredensyal para sa Splunk Universal Forwarder, na maaaring ma-download mula sa web interface.

Kung saan i-click para mag-download (sa mga larawan)Splunk Universal Forwarder sa docker bilang isang system log collector

Splunk Universal Forwarder sa docker bilang isang system log collector
Ito ay isang regular na archive na maaaring i-unpack. Nasa loob ang mga sertipiko at isang password para sa pagkonekta sa aming SplunkCloud at mga output.conf na may listahan ng aming mga instance ng input. Magiging may-katuturan ang file na ito hanggang sa muling i-install mo ang iyong Splunk installation o magdagdag ng input node kung nasa lugar ang pag-install. Samakatuwid, walang masama sa pagdaragdag nito sa loob ng lalagyan.

At ang huling bagay ay i-restart. Oo, upang mailapat ang mga pagbabago, kailangan mong i-restart ito.

Sa aming inputs.conf idinagdag namin ang mga log na gusto naming ipadala sa Splunk. Hindi kinakailangang idagdag ang file na ito sa larawan kung, halimbawa, namamahagi ka ng mga config sa pamamagitan ng puppet. Ang tanging bagay ay nakikita ng Forwarder ang mga config kapag nagsimula ang daemon, kung hindi, kakailanganin nito ./splunk restart.

Anong uri ng mga script ng docker stats ang mga ito? Mayroong isang lumang solusyon sa Github mula sa outcoldman, ang mga script ay kinuha mula doon at binago upang gumana sa mga kasalukuyang bersyon ng Docker (ce-17.*) at Splunk (7.*).

Gamit ang data na nakuha, maaari kang bumuo ng mga sumusunod

mga dashboard: (isang pares ng mga larawan)Splunk Universal Forwarder sa docker bilang isang system log collector

Splunk Universal Forwarder sa docker bilang isang system log collector
Ang source code para sa mga gitling ay nasa link na ibinigay sa dulo ng artikulo. Pakitandaan na mayroong 2 piling field: 1 - index selection (hinanap sa pamamagitan ng mask), host/container selection. Malamang na kakailanganin mong i-update ang index mask, depende sa mga pangalan na iyong ginagamit.

Sa konklusyon, nais kong iguhit ang iyong pansin sa pag-andar simulan() Π²

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
}

Sa aking kaso, para sa bawat kapaligiran at bawat indibidwal na entity, maging ito ay isang application sa isang lalagyan o isang host machine, gumagamit kami ng isang hiwalay na index. Sa ganitong paraan, hindi maghihirap ang bilis ng paghahanap kapag may malaking akumulasyon ng data. Ang isang simpleng panuntunan ay ginagamit upang pangalanan ang mga index: _. Samakatuwid, upang maging unibersal ang lalagyan, bago ilunsad ang mismong daemon, papalitan namin uhaw-ika wildcard sa pangalan ng kapaligiran. Ang variable ng pangalan ng kapaligiran ay ipinapasa sa mga variable ng kapaligiran. Parang nakakatawa.

Dapat ding tandaan na sa ilang kadahilanan ay hindi apektado ang Splunk ng pagkakaroon ng parameter ng docker hostname. Magpapadala pa rin siya ng mga log na may id ng kanyang container sa host field. Bilang solusyon, maaari kang mag-mount / etc / hostname mula sa host machine at sa startup ay gumawa ng mga kapalit na katulad ng mga pangalan ng index.

Halimbawa 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

Kabuuan

Oo, marahil ang solusyon ay hindi perpekto at tiyak na hindi pangkalahatan para sa lahat, dahil marami "hardcode". Ngunit batay dito, lahat ay maaaring bumuo ng kanilang sariling imahe at ilagay ito sa kanilang pribadong artifactory, kung, habang nangyayari ito, kailangan mo ng Splunk Forwarder sa Docker.

Link:

Solusyon mula sa artikulo
Isang solusyon mula sa outcoldman na nagbigay inspirasyon sa amin na muling gamitin ang ilan sa mga functionality
Ng. dokumentasyon para sa pag-set up ng Universal Forwarder

Pinagmulan: www.habr.com

Magdagdag ng komento