Splunk Universal Forwarder u Dockeru kao sakupljač sustavnih logova

Splunk Universal Forwarder u Dockeru kao sakupljač sustavnih logova

Splunk je jedan od nekoliko najpoznatijih komercijalnih proizvoda za prikupljanje i analizu logova. Čak i sada, kada se prodaja u Rusiji više ne obavlja, to nije razlog da ne pišemo upute/how-to za ovaj proizvod.

Zadatak: prikupljanje sistemskih logova s docker čvorova u Splunk bez mijenjanja konfiguracije host-mašine

Započeti bismo s službenim pristupom, koji izgleda pomalo čudno pri korištenju dockera.
Link na Docker hub
Što imamo:

1. Povlačimo sliku

$ docker pull splunk/universalforwarder:latest

2. Pokrećemo kontejner s potrebnim parametrima

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

3. Ulazimo u kontejner

docker exec -it  /bin/bash

Nakon toga, traži nas da odemo na poznatu adresu u dokumentaciju.

I konfiguriramo kontejner nakon njegovog pokretanja:


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

Čekajte. Što?

No, tu iznenađenja ne završavaju. Ako pokrenete kontejner iz službene slike u interaktivnom režimu, vidjet ćete sljedeće:

Malo razočaranje


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

PLAY [Pokreni zadani Splunk provisioning] *******************************************************************************************************************************************************************************************************
Utorak 09. travnja 2019.  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TASK [Prikupljanje podataka] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorak 09. travnja 2019.  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TASK [Dohvati actual hostname] *******************************************************************************************************************************************************************************************************************
promijenjeno: [localhost]
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
Utorak 09. travnja 2019.  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
Utorak 09. travnja 2019.  13:40:41 +0000 (0:00:00.216)       0:00:02.798 *********
uključeno: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml za localhost
Utorak 09. travnja 2019.  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

TASK [splunk_common : Ažuriraj vlasnika Splunk direktorija] *****************************************************************************************************************************************************************************************
ok: [localhost]
Utorak 09. travnja 2019.  13:40:41 +0000 (0:00:00.324)       0:00:03.210 *********
uključeno: /opt/ansible/roles/splunk_common/tasks/get_facts.yml za localhost
Utorak 09. travnja 2019.  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

i tako dalje...

Odlično. U slici čak nema artefakta. To znači da će svaki put prilikom pokretanja biti potrebno vremena da se preuzme arhiva s binarnim datotekama, raspakira i konfigurira.
A kako je s docker-way i sličnim stvarima?

Ne, hvala. Ići ćemo drugim putem. Što ako sve te operacije izvršimo u fazi izgradnje? Krenimo!

Da ne bi previše odugovlačili, odmah ću pokazati konačnu sliku:

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

Dakle, što se nalazi u

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

Prilikom prvog pokretanja, Splunk traži da postavite korisničko ime/lozinku, NO ti podaci se koriste samo za izvršavanje administrativnih komandi ove konkretne instalacije, dakle, unutar kontejnera. U našem slučaju, samo želimo pokrenuti kontejner tako da sve radi i logovi teku u obilju. Naravno, to je hardkodirano, ali nisam našao druge načine.

Dalje, u scenariju se izvršava

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

splunkclouduf.spl — To je datoteka s vjerodajnicama za Splunk Universal Forwarder koju možete preuzeti putem web sučelja.

Na što kliknuti za preuzimanje (na slikama)Splunk Universal Forwarder u Dockeru kao sakupljač sustavnih logova

Splunk Universal Forwarder u Dockeru kao sakupljač sustavnih logova
To je obična arhiva koju možete raspakirati. Unutra se nalaze certifikati i lozinka za povezivanje s našim SplunkCloudom i outputs.conf popis naših input instanci. Ova datoteka bit će aktualna dok ne reinstalirate svoju instalaciju Splunka ili ne dodate input čvorove ako je instalacija na lokalnom serveru. Stoga nije ništa strašno dodati je unutar kontejnera.

I posljednje — restart. Da, za primjenu promjena, potrebno je restartati.

U naš inputs.conf dodajemo logove koje želimo slati u Splunk. Nije obavezno dodavati ovu datoteku u sliku, ako, na primjer, konfiguracije distribuirate putem puppeta. Važno je samo da Forwarder vidi konfiguracije prilikom pokretanja demona, inače će vam trebati .\/splunk restart.

A što su to docker stats skripte? Na GitHubu postoji staro rješenje od outcoldman, skripte su preuzete odatle i prilagođene za rad s aktualnim verzijama Dockera (ce-17.*) i Splunka (7.*).

S dobivenim podacima možete izraditi takve

nadzorne ploče: (par slika)Splunk Universal Forwarder u Dockeru kao sakupljač sustavnih logova

Splunk Universal Forwarder u Dockeru kao sakupljač sustavnih logova
Izvorni kod nadzora nalazi se u repozitoriju navedenom na kraju članka. Obratite pažnju da postoje 2 select polja: 1 — odabir indeksa (pretražuje se prema maski), odabir hosta/kontejnera. Maska indeksa će vjerojatno trebati ažurirati, ovisno o nazivima koje koristite.

Na kraju, želim skrenuti pozornost na funkciju start() u

entrypoint.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "'SPLUNK_INDEX' varijabla okruženja je prazna ili nije definirana. Trebala bi biti 'dev' ili '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 'pokreće se' > /tmp/splunk-container.state"
	${SPLUNK_HOME}/bin/splunk start
    watch_for_failure
}

U mom slučaju, za svako okruženje i svaku pojedinačnu jedinicu, bilo da se radi o aplikaciji u kontejneru ili host-mašini, koristimo odvojeni indeks. Tako se brzina pretraživanja neće smanjiti prilikom značajnog nakupljanja podataka. Za imenovanje indeksa koristi se jednostavno pravilo: _. Stoga, kako bi kontejner bio univerzalan, prije nego što pokrenemo samog demona, zamjenjujemo sed-om wildcard s imenom okruženja. Varijabla s imenom okruženja proslijeđuje se putem varijabli okruženja. Zvuči zabavno.

Također, valja istaknuti da iz nekog razloga na Splunk ne utječe postojanje docker parametra hostname. On će i dalje slati logove s ID-om svog kontejnere u polje host. Kao rješenje, moguće je montirati /etc/hostname s host-mašine i pri pokretanju izvršiti zamjenu, sličnu imenima indeksa.

Primjer 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

Zaključak

Da, moguće je da rješenje nije idealno i zasigurno nije univerzalno za sve, jer ima puno hardkoda. No, na temelju njega svatko može sastaviti svoj image i staviti ga u svoj privatni artefaktor, ako vam je, tako se dogodilo, potreban Splunk Forwarder baš u dockeru.

Linkovi:

Rješenje iz članka
Rješenje od outcoldmana koje je inspiriralo ponovnu upotrebu dijela funkcionalnosti
Off. dokumentacija za postavljanje Universal Forwarder-a

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster