Splunk Universal Forwarder u docker-u kao sakupljač sistemskih dnevnika

Splunk Universal Forwarder u docker-u kao sakupljač sistemskih dnevnika

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

Cilj: prikuplja sistemske zapise sa čvorova za docker u Splunk-u bez promjene konfiguracije glavnog računala

Želio bih početi sa službenim pristupom, koji izgleda pomalo čudno kada se koristi Docker.
Veza do Docker čvorišta
šta imamo:

1. Pullim image

$ docker pull splunk/universalforwarder:latest

2. Pokrenite kontejner sa 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 kontejner nakon što se pokrene:


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

Čekaj. Šta?

Ali iznenađenjima tu nije kraj. Ako pokrenete kontejner sa službene slike u interaktivnom načinu, vidjet ćete sljedeće:

Malo razočarenja


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

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

Odlično. Slika čak ne sadrži artefakt. Odnosno, svaki put kada pokrenete bit će potrebno vrijeme da preuzmete arhivu sa binarnim datotekama, raspakirate i konfigurirate.
Šta je sa docker-way-om i svim tim?

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

Da ne bi odlagali predugo, 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, šta je sadržano 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 od vas da mu date login/lozinku, ALI ovi podaci se koriste samo da izvrši administrativne komande za tu određenu instalaciju, odnosno unutar kontejnera. U našem slučaju, želimo samo da pokrenemo kontejner tako da sve radi i da trupci teku kao rijeka. Naravno, ovo je hardcode, ali nisam naš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 akreditiva za Splunk Universal Forwarder, koja se može preuzeti sa web sučelja.

Gdje kliknuti za preuzimanje (na slikama)Splunk Universal Forwarder u docker-u kao sakupljač sistemskih dnevnika

Splunk Universal Forwarder u docker-u kao sakupljač sistemskih dnevnika
Ovo je obična arhiva koja se može raspakovati. Unutra su sertifikati i lozinka za povezivanje na naš SplunkCloud i outputs.conf sa listom naših instanci unosa. Ova datoteka će biti relevantna sve dok ponovo ne instalirate svoju Splunk instalaciju ili dodate ulazni čvor ako je instalacija lokalna. Stoga, nema ništa loše u tome da ga dodate unutar kontejnera.

I zadnja stvar je restart. Da, da biste primijenili promjene, morate ga ponovo pokrenuti.

U našem inputs.conf dodajemo dnevnike koje želimo poslati u Splunk. Nije potrebno dodavati ovu datoteku slici ako, na primjer, distribuirate konfiguracije putem lutke. Jedina stvar je da Forwarder vidi konfiguracije kada se demon pokrene, inače će mu trebati ./splunk restart.

Kakve su to skripte za docker statistiku? Postoji staro rješenje na Githubu od outcoldman, skripte su preuzete odatle i modifikovane da rade sa trenutnim verzijama Dockera (ce-17.*) i Splunk (7.*).

Sa dobijenim podacima možete izgraditi sljedeće

komandne table: (par slika)Splunk Universal Forwarder u docker-u kao sakupljač sistemskih dnevnika

Splunk Universal Forwarder u docker-u kao sakupljač sistemskih dnevnika
Izvorni kod za crtice nalazi se na linku na kraju članka. Imajte na umu da postoje 2 polja za odabir: 1 - odabir indeksa (pretražuje se po maski), odabir hosta/kontejnera. Vjerovatno ćete morati ažurirati indeksnu masku, ovisno o imenima koja koristite.

U zaključku, želio bih da vam skrenem pažnju na funkciju start() в

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
}

U mom slučaju, za svako okruženje i svaki pojedinačni entitet, bilo da se radi o aplikaciji u kontejneru ili host mašini, koristimo poseban indeks. Na ovaj način, brzina pretraživanja neće patiti kada dođe do značajne akumulacije podataka. Za imenovanje indeksa koristi se jednostavno pravilo: _. Stoga, da bi kontejner bio univerzalan, prije pokretanja samog demona zamjenjujemo sed-th džoker na ime okoline. Varijabla imena okruženja se prenosi kroz varijable okruženja. Zvuči smešno.

Također je vrijedno napomenuti da iz nekog razloga Splunk nije pod utjecajem prisutnosti docker parametra hostname. On će i dalje tvrdoglavo slati dnevnike sa ID-om svog kontejnera u polje hosta. Kao rješenje, možete montirati / etc / hostname sa glavnog računala 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

Rezultat

Da, možda rješenje nije idealno i sigurno nije univerzalno za sve, jer ih ima mnogo "tvrdi kod". Ali na osnovu toga, svako može izgraditi svoj imidž i staviti ga u svoju privatnu artifabriku, ako vam je, kao što se dešava, potreban Splunk Forwarder u Dockeru.

Reference:

Rješenje iz članka
Rešenje od outcoldmana koje nas je inspirisalo da ponovo koristimo neke od funkcionalnosti
Of. dokumentaciju za postavljanje Universal Forwardera

izvor: www.habr.com

Dodajte komentar