Splunk Universal Forwarder v dokerju kot zbiralnik sistemskega dnevnika

Splunk Universal Forwarder v dokerju kot zbiralnik sistemskega dnevnika

Splunk je eden izmed več najbolj prepoznavnih komercialnih izdelkov za zbiranje in analizo hlodovine. Tudi zdaj, ko v Rusiji ni več prodaje, to ni razlog, da ne bi napisali navodil/navodil za ta izdelek.

Naloga: zbiranje sistemskih dnevnikov iz priklopnih vozlišč v Splunk brez spreminjanja konfiguracije gostiteljskega računalnika

Rad bi začel z uradnim pristopom, ki je pri uporabi Dockerja videti nekoliko čuden.
Povezava do središča Docker
Kaj imamo:

1. Pullim slika

$ docker pull splunk/universalforwarder:latest

2. Zaženite posodo s potrebnimi parametri

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

3. Gremo v posodo

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

Nato smo pozvani, da gremo na znan naslov v dokumentaciji.

In konfigurirajte vsebnik, ko se zažene:


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

Počakaj. Kaj?

Toda presenečenja se tu ne končajo. Če zaženete vsebnik iz uradne slike v interaktivnem načinu, boste videli naslednje:

Malce razočaranja


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

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

Super. Slika sploh ne vsebuje artefakta. To pomeni, da bo ob vsakem zagonu potreben čas za prenos arhiva z binarnimi datotekami, razpakiranje in konfiguracijo.
Kaj pa docker-way in vse to?

Ne hvala. Ubrali bomo drugo pot. Kaj pa, če vse te operacije izvedemo v fazi montaže? Potem gremo!

Da ne bom odlašal predolgo, vam takoj pokažem končno sliko:

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

Kaj torej vsebuje

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

Ob prvem zagonu vas Splunk prosi za prijavo/geslo, VENDAR se ti podatki uporabijo Samo za izvajanje skrbniških ukazov za to posebno namestitev, to je znotraj vsebnika. V našem primeru želimo samo zagnati kontejner, da vse deluje in da hlodi tečejo kot reka. Seveda je to trda koda, vendar nisem našel drugih načinov.

Nadalje se izvaja po scenariju

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

splunkclouduf.spl — To je datoteka s poverilnicami za Splunk Universal Forwarder, ki jo lahko prenesete s spletnega vmesnika.

Kje klikniti za prenos (v slikah)Splunk Universal Forwarder v dokerju kot zbiralnik sistemskega dnevnika

Splunk Universal Forwarder v dokerju kot zbiralnik sistemskega dnevnika
To je običajen arhiv, ki ga je mogoče razpakirati. V notranjosti so certifikati in geslo za povezavo z našim SplunkCloudom in izhodi.conf s seznamom naših primerkov vnosa. Ta datoteka bo ustrezna, dokler znova ne namestite namestitve Splunk ali dodate vhodnega vozlišča, če je namestitev na mestu uporabe. Zato ni nič narobe, če ga dodate v posodo.

In zadnja stvar je ponovni zagon. Da, če želite uporabiti spremembe, ga morate znova zagnati.

V našem inputs.conf dodamo dnevnike, ki jih želimo poslati v Splunk. Te datoteke ni treba dodati sliki, če na primer konfiguracije distribuirate prek lutke. Edina stvar je, da Forwarder vidi konfiguracije, ko se demon zažene, sicer bo potreboval ./splunk ponovni zagon.

Kakšni skripti docker stats so? Na Githubu je stara rešitev od outcoldman, so bili skripti vzeti od tam in spremenjeni za delo s trenutnimi različicami Docker (ce-17.*) in Splunk (7.*).

S pridobljenimi podatki lahko zgradite naslednje

nadzorne plošče: (par slik)Splunk Universal Forwarder v dokerju kot zbiralnik sistemskega dnevnika

Splunk Universal Forwarder v dokerju kot zbiralnik sistemskega dnevnika
Izvorna koda za pomišljaje je na povezavi na koncu članka. Upoštevajte, da sta na voljo 2 izbirni polji: 1 - izbira indeksa (iskanje po maski), izbira gostitelja/vsebnika. Najverjetneje boste morali posodobiti masko indeksa, odvisno od imen, ki jih uporabljate.

Na koncu bi vas rad opozoril na funkcijo začetek() в

vstopna 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
}

V mojem primeru za vsako okolje in vsako posamezno entiteto, naj bo to aplikacija v vsebniku ali gostiteljski stroj, uporabljamo ločen indeks. Na ta način hitrost iskanja ne bo prizadeta, ko pride do velikega kopičenja podatkov. Za poimenovanje indeksov se uporablja preprosto pravilo: _. Zato, da bi bil vsebnik univerzalen, pred zagonom samega demona zamenjamo žeja-th nadomestni znak za ime okolja. Spremenljivka imena okolja se posreduje skozi spremenljivke okolja. Sliši se smešno.

Prav tako je treba omeniti, da Splunk iz neznanega razloga na prisotnost parametra docker ne vpliva gostitelja. Še vedno bo trmasto pošiljal dnevnike z id-jem svojega vsebnika v polju gostitelja. Kot rešitev lahko montirate / etc / hostname iz gostiteljskega računalnika in ob zagonu naredite zamenjave, podobne indeksnim imenom.

Primer 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

Skupaj

Da, morda rešitev ni idealna in zagotovo ni univerzalna za vse, saj jih je veliko "trda koda". Toda na podlagi tega lahko vsak zgradi svojo lastno podobo in jo postavi v svojo zasebno artefakturo, če, kot se zgodi, potrebuje Splunk Forwarder v Dockerju.

Reference:

Rešitev iz članka
Rešitev podjetja Outcoldman, ki nas je navdihnila, da ponovno uporabimo nekatere funkcije
od. dokumentacijo za nastavitev Universal Forwarderja

Vir: www.habr.com

Dodaj komentar