Splunk Universal Forwarder Dockeris süsteemilogide kogumiseks

Splunk Universal Forwarder Dockeris süsteemilogide kogumiseks

Splunk on üks tuntumaid kommertsprodukte logide kogumiseks ja analüüsimiseks. Isegi praegu, kui Venemaa müügitegevust enam ei toimu, pole see põhjus, et mitte kirjutada selle toote kohta juhiseid/how-to.

Ülesanne: koguda süsteemiloge Docker node'ist Splunki konfigureerimata host-masinat

Alustame ametlikust lähenemisviisist, mis tundub Dockerit kasutades veidi kummaline.
Link Docker hub'i
Mis meil on:

1. Tõmbame pildi

$ docker pull splunk/universalforwarder:latest

2. Käivitame konteineri vajalike parameetritega

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

3. Siseneme konteinerisse

docker exec -it  /bin/bash

Jätkame tuntud aadressile dokumentatsiooni külastamisega.

Ja konfigureerime konteineri pärast selle käivitamist:


./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart

Oota. Mis?

Aga sellega üllatused ei lõpe. Kui käivitate konteineri ametlikust pildist interaktiivses režiimis, näete järgmist:

Veidi pettumust


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

MÄNG [Käivita vaikimisi Splunki ettevalmistamine] *******************************************************************************************************************************************************************************************************
Teisipäev, 09. aprill 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TEGEVUS [Faktide kogumine] ***********************************************************************************************************************************************************************************************************************
oke: [localhost]
Teisipäev, 09. aprill 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TEGEVUS [Hangi tegelik hostinimi] *******************************************************************************************************************************************************************************************************************
muudetud: [localhost]
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

TEGEVUS [set_fact] ******************************************************************************************************************************************************************************************************************************
oke: [localhost]
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
Teisipäev, 09. aprill 2019  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
Teisipäev, 09. aprill 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
Teisipäev, 09. aprill 2019  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

TEGEVUS [splunk_common : Uuenda Splunki kausta omanik] *****************************************************************************************************************************************************************************************
oke: [localhost]
Teisipäev, 09. aprill 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
Teisipäev, 09. aprill 2019  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

ja nii edasi...

Suurepärane. Kujul pole isegi artefakte. See tähendab, et iga kord, kui käivitad, kulub aega, et alla laadida arhiiv binaarfailidega, see lahti pakkida ja seadistada.
Aga kuidas siis docker-way ja kõik muu?

Ei, aitäh. Me läheneme sellele teistmoodi. Mis siis, kui kõik need toimingud teostatakse koostamisetapis? Alustame!

Et aega raiskamata, näitan kohe lõppkuju:

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

Nii et, mis on sees

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

Esimese käivituse ajal palub Splunk sul määrata kasutajanimed/paroolid, KUID neid andmeid kasutatakse ainult administreerimisülesannete täitmiseks antud installeerimises, st konteineris. Meie puhul tahame lihtsalt konteinerit käivitada, et kõik töötaks ja logid voolaksid vabalt. Muidugi on see kõvakooditud, aga ma ei leidnud teisi viise.

Edasi stsenaariumis käiakse läbi

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

splunkclouduf.spl — See on Splunk Universal Forwarderi jaoks mõeldud krediidifail, mille saab laadida alla veebiliidese kaudu.

Kuhu vajutada, et alla laadida (piltidena)Splunk Universal Forwarder Dockeris süsteemilogide kogumiseks

Splunk Universal Forwarder Dockeris süsteemilogide kogumiseks
See on tavaline arhiiv, mille saab lahti pakkida. Sees on sertifikaadid ja parool meie SplunkCloudi ühendamiseks ning outputs.conf ka meie input instantside nimekirjaga. See fail kehtib kuni te ei reinstalleeri oma Splunki installatsiooni või ei lisa input node, kui installatsioon on kohapealne. Seega pole probleemi selle failiga konteinerisse lisada.

Ja viimane asi — restart. Jah, et muudatusi rakendada, tuleb see restartida.

Meie inputs.conf lisame logid, mida soovime Splunkile saata. Pole tingimata vajalik seda faili pildisse lisada, kui näiteks jagate konfigureerimisi läbi puppet'i. Peamine on, et Forwarder näeks konfigureerimisi, kui deemon käivitub, muidu on vajalik ./splunk restart.

Aga mis on docker stats skriptid? GitHubis on vanem lahendus outcoldman, skriptid on sealt võetud ja kohandatud, et töötada aktuaalsete versioonidega Docker (ce-17.*) ja Splunk (7.*).

Saadud andmete põhjal saab luua selliseid

dashboard'e: (paar pilti)Splunk Universal Forwarder Dockeris süsteemilogide kogumiseks

Splunk Universal Forwarder Dockeris süsteemilogide kogumiseks
Dashboardi allikakood asub artikli lõpus näidatud repos. Pange tähele, et seal on 2 select välja: 1 — indeksi valik (otsitakse maski järgi), hosti/konteineri valik. Indeksi maski tuleb tõenäoliselt teil uuendada, sõltuvalt nimedest, mida te kasutate.

Lõpetuseks soovin juhtida tähelepanu funktsioonile start() ühes

entrypoint.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "'SPLUNK_INDEX' keskkonna muutuja on tühi või määramata. Peaks olema 'dev' või '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
}

Minu puhul, iga keskkonna ja iga eraldi üksuse, olgu see rakendus konteineris või host-masin, jaoks kasutame eraldi indeksit. Nii ei kannata otsingu kiirus märkimisväärse andmete kogunemise korral. Indeksite nimetamiseks kasutatakse lihtsat reeglit: _. Seega, et konteiner oleks universaalne, asendame enne demoni käivitamist sed-iga wildcard keskkonna nimega. Keskkonna nimetus edastatakse keskkonna muutuja kaudu. See kõlab naljakalt.

Samuti tasub märkida, et mingil põhjusel ei mõjuta Splunki olemasolu docker parameeter hostname. See saadab endiselt logisid oma konteineri ID-ga väljale host. Lahenduseks on võimalik montida /etc/hostname host-masinilt, kui käivitate, teha asendusi, mis on sarnased indeksite nimedele.

Näide 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

Kokkuvõte

Jah, lahendus ei pruugi olla ideaalne ja kindlasti ei ole see universaalne kõikidele, kuna on palju „hardcode'i“. Kuid selle põhjal võib igaüks koguda oma pildi ja panna selle oma privaatseks artefaktooriumiks, juhul kui teil on vaja Splunk Forwarderit just dockeris.

Lingid:

Artiklis esitatud lahendus
Lahendus outcoldmanilt, mis inspireeris uuesti kasutada osa funktsionaalsusest
Ametlik dokumentatsioon Universal Forwarderi seadistamiseks

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster