Splunk Universal Forwarder Dockeris kui süsteemilogide kogujana

Splunk Universal Forwarder Dockeris kui süsteemilogide kogujana

Splunk on üks väheseid enim tuntud kommertstooteid logide kogumiseks ja analüüsimiseks. Isegi nüüd, kui Venemaal enam müüki ei toimu, ei ole see põhjus mitte kirjutada selle toote jaoks juhendeid/õpetusi.

Ülesanne: koguda süsteemi logisid docker node'idest Splunk'i ilma host-masina konfiguratsiooni muutmata

Alustaksin ametliku lähenemisega, mis dockerit kasutades tundub veidi kummaline.
Link Docker hub'i
Mida 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

Edasi palutakse meil minna tuntud aadressile dokumentatsiooni.

Ja konfigureerida konteiner 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äitate konteinerit 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 vaike Splunki seadistus] *******************************************************************************************************************************************************************************************************
Teisipäev, 09. aprill 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

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

ÜLESANNE [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 *********

ÜLESANNE [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [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 *********

ÜLESANNE [splunk_common : Uuenda Splunki kaustade omanik] *****************************************************************************************************************************************************************************************
ok: [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. Pildil ei ole isegi artefakte. See tähendab, et iga kord, kui alustate, kulub aega arhivi allalaadimiseks, faili dekompresseerimiseks ja seadistamiseks.
Aga kuidas on docker-way ja kõik muu?

Ei, aitäh. Me läheme teist teed. Mis siis, kui teeme kõik need toimingud ehitusetapis? Siis lähme!

Et mitte aega raisata, näitan kohe lõplikku pilti:

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, 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äivitamise korral palub Splunk seadistada kasutajanime/parooli, KUID neid andmeid kasutatakse seda selle konkreetse installatsiooni halduskäskude täitmiseks, st konteineri sees. Meie juhul tahame lihtsalt konteinerit käivitada, et kõik töötaks ja logid voolaksid. Muidugi on see hardcode, aga ma ei leidnud muid võimalusi.

Tüübi kohaselt jätkatakse

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

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

Kuhu klõpsata, et alla laadida (piltidel)Splunk Universal Forwarder Dockeris kui süsteemilogide kogujana

Splunk Universal Forwarder Dockeris kui süsteemilogide kogujana
See on tavaline arhiiv, mille saab lahti pakkida. Sees on sertifikaadid ja parool meie SplunkCloudi ühendamiseks ja outputs.conf meie input-instantide nimekirjaga. See fail on kehtiv seni, kuni te ei reinstalli oma Splunki või ei lisa input-nodesid, juhul kui installatsioon on kohaliku serveri peal. Seega ei ole midagi hullu selles, et lisada see konteinerisse.

Ja viimane — restart. Jah, muudatuste rakendamiseks tuleb see taaskäivitada.

Meie inputs.conf lisame logid, mida soovime Splunkisse edastada. Ei ole kohustuslik seda faili pildile lisada, kui näiteks jagate konfigureerimist puppet'i kaudu. Peamine on, et Forwarder näeks konfigureerimist, kui daemon käivitub, vastasel juhul on vajalik .\/splunk restart.

Mis skriptid on docker stats? Githubis on olemas vana lahendus outcoldman, need skriptid on sealt võetud ja kohandatud, et töötada uusimate versioonidega Docker (ce-17.*) ja Splunk (7.*).

Saadud andmete põhjal saab luua selliseid

juhtpaneele: (paar pilti)Splunk Universal Forwarder Dockeris kui süsteemilogide kogujana

Splunk Universal Forwarder Dockeris kui süsteemilogide kogujana
Algsed koodid juhte jaoks on salvestatud artikli lõpus märgitud repo's. Pange tähele, et seal on 2 valikuvälja: 1 — indeksi valik (otsitakse mustri järgi), hosti/konteineri valik. Indeksi mustrit tuleb tõenäoliselt uuendada, sõltuvalt nimedest, mida kasutate.

Kokkuvõtteks tahan tähelepanu juhtida funktsioonile start() ja

entrypoint.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "'SPLUNK_INDEX' keskkonna muutuja on tühi või pole määratud. 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 kasutame iga keskkonna ja iga eraldi üksuse jaoks, olgu see rakendus konteineris või host-masin, eraldi indeksit. See ei hävita otsingu kiirus, kui andmeid koguneb. Indeksite nimetamiseks kasutatakse lihtsat reeglit: <environment_name>_<service/application/etc>. Seega, et konteiner oleks universaalne, asendame enne deemonit käivitamist sed- wildcardi keskkonna nimega. Muutujat keskkonna nime kohta edastatakse keskkonna muutujate kaudu. Kõlab lõbusalt.

Samuti tasub märkida, et mingil põhjusel ei mõjuta Splunkile docker parameetri olemasolu hostname. See saadab ikkagi jõhkralt oma konteineri id logisid välja valdkonnas host. Lahenduseks võib olla /etc/hostname konteinerite hostmasinast mount'imine ja käivitamisel sarnaste nimede asendamine, sarnaselt indikaatorite nimetusele.

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 mitte universaalne, kuna olemas on palju "karmkoodi". Kuid selle põhjal võib igaüks luua oma pildi ja salvestada selle oma privaatse artefakti ehk, kui just juhtumisi on teil vaja Splunk Forwarderit Dockeris.

Lingid:

Artiklis esitletud lahendus
Outcoldmani lahendus, mis inspireeris osa funktsionaalsuse taaskasutusest
Ametlik dokumentatsioon Universal Forwarderi seadistamiseks

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster