Splunk Universal Forwarder în docker ca colector de jurnal de sistem

Splunk Universal Forwarder în docker ca colector de jurnal de sistem

Splunk este unul dintre cele mai recunoscute produse comerciale de colectare și analiză a buștenilor. Chiar și acum, când vânzările nu se mai fac în Rusia, acesta nu este un motiv pentru a nu scrie instrucțiuni/programe pentru acest produs.

Sarcină: colectați jurnalele de sistem de la nodurile docker din Splunk fără a modifica configurația mașinii gazdă

Aș dori să încep cu abordarea oficială, care pare puțin ciudată când folosești Docker.
Link către hub-ul Docker
Ce avem:

1. Imagine Pullim

$ docker pull splunk/universalforwarder:latest

2. Porniți recipientul cu parametrii necesari

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

3. Intrăm în recipient

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

În continuare, ni se cere să mergem la o adresă cunoscută din documentație.

Și configurați containerul după ce începe:


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

Aștepta. Ce?

Dar surprizele nu se opresc aici. Dacă rulați containerul din imaginea oficială în modul interactiv, veți vedea următoarele:

Un pic de dezamăgire


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

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

Grozav. Imaginea nu conține nici măcar un artefact. Adică, de fiecare dată când porniți, va dura timp să descărcați arhiva cu binare, să despachetați și să configurați.
Dar docker-way și toate astea?

Nu, mulțumesc. Vom lua un alt traseu. Ce se întâmplă dacă efectuăm toate aceste operații în faza de asamblare? Atunci să mergem!

Pentru a nu întârzia prea mult, vă voi arăta imediat imaginea finală:

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

Deci, ceea ce este conținut în

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

La prima pornire, Splunk vă cere să îi oferiți o autentificare/parolă, DAR aceste date sunt folosite numai pentru a executa comenzi administrative pentru instalația respectivă, adică în interiorul containerului. În cazul nostru, vrem doar să lansăm containerul astfel încât totul să funcționeze și buștenii să curgă ca un râu. Desigur, acesta este hardcode, dar nu am găsit alte modalități.

Mai departe, conform scriptului este executat

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

splunkclouduf.spl — Acesta este un fișier de acreditări pentru Splunk Universal Forwarder, care poate fi descărcat de pe interfața web.

Unde dați clic pentru descărcare (în imagini)Splunk Universal Forwarder în docker ca colector de jurnal de sistem

Splunk Universal Forwarder în docker ca colector de jurnal de sistem
Aceasta este o arhivă obișnuită care poate fi dezambalată. Înăuntru sunt certificate și o parolă pentru conectarea la SplunkCloud și iesiri.conf cu o listă a instanțelor noastre de intrare. Acest fișier va fi relevant până când reinstalați instalarea Splunk sau adăugați un nod de intrare dacă instalarea este on-premise. Prin urmare, nu este nimic în neregulă cu adăugarea acestuia în interiorul recipientului.

Și ultimul lucru este repornirea. Da, pentru a aplica modificările, trebuie să-l reporniți.

În a noastră intrări.conf adăugăm jurnalele pe care vrem să le trimitem către Splunk. Nu este necesar să adăugați acest fișier la imagine dacă, de exemplu, distribuiți configurații prin marionetă. Singurul lucru este că Forwarder vede configurațiile când demonul pornește, altfel va avea nevoie de ./splunk restart.

Ce fel de scripturi de statistici docker sunt acestea? Există o soluție veche pe Github de la outcoldman, scripturile au fost preluate de acolo și modificate pentru a funcționa cu versiunile actuale de Docker (ce-17.*) și Splunk (7.*).

Cu datele obținute, puteți construi următoarele

tablouri de bord: (câteva poze)Splunk Universal Forwarder în docker ca colector de jurnal de sistem

Splunk Universal Forwarder în docker ca colector de jurnal de sistem
Codul sursă pentru liniuțe se află în linkul oferit la sfârșitul articolului. Vă rugăm să rețineți că există 2 câmpuri de selectare: 1 - selecție index (căutat după mască), selecție gazdă/container. Probabil că va trebui să actualizați masca de index, în funcție de numele pe care le utilizați.

În concluzie, aș dori să vă atrag atenția asupra funcției start() в

punct de intrare.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
}

În cazul meu, pentru fiecare mediu și fiecare entitate individuală, fie că este o aplicație într-un container sau o mașină gazdă, folosim un index separat. În acest fel, viteza de căutare nu va avea de suferit atunci când există o acumulare semnificativă de date. O regulă simplă este folosită pentru a numi indecși: _. Prin urmare, pentru ca containerul să fie universal, înainte de a lansa demonul în sine, înlocuim sete-al-lea wildcard la numele mediului. Variabila nume de mediu este transmisă prin variabilele de mediu. Suna amuzant.

De asemenea, merită remarcat faptul că, din anumite motive, Splunk nu este afectat de prezența parametrului docker nume de gazdă. Se va încăpățâna să trimită jurnalele cu id-ul containerului său în câmpul gazdă. Ca soluție, puteți monta / Etc / hostname de la mașina gazdă și la pornire faceți înlocuiri similare cu numele de index.

Exemplu 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

Total

Da, poate că soluția nu este ideală și cu siguranță nu este universală pentru toată lumea, deoarece sunt multe "cod greu". Dar pe baza ei, fiecare își poate construi propria imagine și o poate pune în artifactory personală, dacă, așa cum se întâmplă, aveți nevoie de Splunk Forwarder în Docker.

referințe:

Soluție din articol
O soluție de la outcoldman care ne-a inspirat să reutilizam o parte din funcționalitate
De. documentația pentru configurarea Universal Forwarder

Sursa: www.habr.com

Adauga un comentariu