Splunk Universal Forwarder u dockeru kao sakupljač zapisnika sustava

Splunk Universal Forwarder u dockeru kao sakupljač zapisnika sustava

Splunk je jedan od nekoliko najprepoznatljivijih komercijalnih proizvoda za prikupljanje i analizu trupaca. Čak i sada, kada se više ne prodaje u Rusiji, to nije razlog da ne napišete upute/kako za ovaj proizvod.

Zadatak: prikupite zapisnike sustava s docker čvorova u Splunk bez mijenjanja konfiguracije glavnog stroja

Želio bih započeti sa službenim pristupom, koji izgleda pomalo čudno kada se koristi Docker.
Veza na Docker hub
Što imamo:

1. Pullim slika

$ docker pull splunk/universalforwarder:latest

2. Pokrenite spremnik s potrebnim parametrima

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

3. Idemo u kontejner

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

Zatim se od nas traži da odemo na poznatu adresu u dokumentaciji.

I konfigurirajte spremnik nakon što se pokrene:


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

Čekati. Što?

Ali iznenađenjima tu nije kraj. Ako pokrenete spremnik sa službene slike u interaktivnom načinu, 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 [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 *********

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

Sjajno. Slika čak i ne sadrži artefakt. To jest, svaki put kada pokrenete bit će potrebno vrijeme za preuzimanje arhive s binarnim datotekama, raspakiranje i konfiguriranje.
Što je s docker-wayom i svim tim?

Ne hvala. Ići ćemo drugim putem. Što ako sve te operacije izvedemo u fazi montaže? Onda idemo!

Da ne odugovlačim, odmah ću vam 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, ono što je sadržano u

prvi_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

Pri prvom pokretanju Splunk traži da mu date login/password, ALI ti se podaci koriste samo za izvršavanje administrativnih naredbi za tu određenu instalaciju, odnosno unutar spremnika. U našem slučaju samo želimo pokrenuti kontejner tako da sve radi i da trupci teku kao rijeka. Naravno, ovo je hardcode, ali nisam pronašao druge načine.

Dalje prema skripti se izvršava

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

splunkclouduf.spl — Ovo je datoteka vjerodajnica za Splunk Universal Forwarder, koja se može preuzeti s web sučelja.

Gdje kliknuti za preuzimanje (u slikama)Splunk Universal Forwarder u dockeru kao sakupljač zapisnika sustava

Splunk Universal Forwarder u dockeru kao sakupljač zapisnika sustava
Ovo je obična arhiva koja se može raspakirati. Unutra su certifikati i lozinka za spajanje na naš SplunkCloud i izlazi.konf s popisom naših instanci unosa. Ova će datoteka biti relevantna sve dok ponovno ne instalirate instalaciju Splunka ili dodate ulazni čvor ako je instalacija lokalna. Stoga nema ništa loše u dodavanju unutar spremnika.

I posljednja stvar je ponovno pokretanje. Da, da biste primijenili promjene, morate ga ponovno pokrenuti.

U našem ulazi.konf dodajemo zapise koje želimo poslati u Splunk. Nije potrebno dodati ovu datoteku na sliku ako, na primjer, konfiguracije distribuirate putem lutke. Jedina stvar je da Forwarder vidi konfiguracije kada se demon pokrene, inače će trebati ./splunk ponovno pokretanje.

Kakve su to docker stats skripte? Postoji staro rješenje na Githubu od outcoldman, skripte su preuzete od tamo i modificirane za rad s trenutnim verzijama Dockera (ce-17.*) i Splunka (7.*).

S dobivenim podacima možete izgraditi sljedeće

nadzorne ploče: (par slika)Splunk Universal Forwarder u dockeru kao sakupljač zapisnika sustava

Splunk Universal Forwarder u dockeru kao sakupljač zapisnika sustava
Izvorni kod za crtice nalazi se na poveznici na kraju članka. Imajte na umu da postoje 2 polja za odabir: 1 - odabir indeksa (pretražuje se po maski), odabir hosta/spremnika. Vjerojatno ćete morati ažurirati masku indeksa, ovisno o imenima koja koristite.

Zaključno, želio bih vam skrenuti pozornost na funkciju početak() в

ulazna točka.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
}

U mom slučaju, za svako okruženje i svaki pojedinačni entitet, bilo da se radi o aplikaciji u spremniku ili glavnom računalu, koristimo zaseban indeks. Na taj način brzina pretraživanja neće utjecati na značajnu akumulaciju podataka. Za imenovanje indeksa koristi se jednostavno pravilo: _. Stoga, kako bi spremnik bio univerzalan, prije pokretanja samog daemona, zamijenimo ga žeđ-ti zamjenski znak za naziv okoline. Varijabla imena okruženja se prenosi kroz varijable okruženja. Zvuči smiješno.

Također je vrijedno napomenuti da Splunk iz nekog razloga nije pod utjecajem prisutnosti docker parametra hostname. On će i dalje tvrdoglavo slati zapise s ID-om svog spremnika u polju host. Kao rješenje, možete montirati / Etc / hostname s glavnog stroja i pri pokretanju napravite zamjene slične 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

Ukupan

Da, možda rješenje nije idealno i sigurno nije univerzalno za sve, budući da ih ima mnogo "tvrdi kod". Ali na temelju toga svatko može izgraditi vlastitu sliku i staviti je u svoju privatnu artefakturu, ako vam, slučajno, treba Splunk Forwarder u Dockeru.

reference:

Rješenje iz članka
Outcoldmanovo rješenje koje nas je nadahnulo da ponovno upotrijebimo neke od funkcionalnosti
Od. dokumentacija za postavljanje Universal Forwardera

Izvor: www.habr.com

Dodajte komentar