Splunk Universal Forwarder in docker cum'è un cullettore di log di sistema

Splunk Universal Forwarder in docker cum'è un cullettore di log di sistema

Splunk hè unu di parechji di i prudutti di cullizzioni di log è di analisi cummerciale più ricunnisciuti. Ancu avà, quandu a vendita ùn hè più fatta in Russia, questu ùn hè micca un mutivu per ùn scrive struzzioni / cumu per stu pruduttu.

Objettivu: raccoglie i logs di u sistema da i nodi docker in Splunk senza cambià a cunfigurazione di a macchina host

Mi piacerebbe principià cù l'approcciu ufficiale, chì pare un pocu stranu quandu si usa Docker.
Link à Docker hub
Chì avemu:

1. Pullim image

$ docker pull splunk/universalforwarder:latest

2. Cumincià u cuntinuu cù i paràmetri necessarii

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

3. Andemu in u cuntinuu

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

In seguitu, ci hè dumandatu à andà à un indirizzu cunnisciutu in a documentazione.

È cunfigurà u cuntinuu dopu avè principiatu:


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

Aspetta. Chì ?

Ma e sorprese ùn finiscinu micca quì. Se eseguite u cuntinuu da l'imagine ufficiale in modu interattivu, vi vede u seguente:

Un pocu di delusione


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

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

Perfettu. L'imaghjini ùn cuntene mancu un artefattu. Questu hè, ogni volta chì avete principiatu, ci volerà tempu per scaricà l'archiviu cù binari, unpack è cunfigurà.
E docker-way è tuttu ciò?

No grazie. Piglieremu una strada diversa. E s'ellu facemu tutte queste operazioni in u stadiu di l'assemblea? Allora andemu !

Per ùn ritardà troppu tempu, vi mustraraghju subitu l'imaghjini finali:

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

Allora ciò chì cuntene

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

À u primu principiu, Splunk vi dumanda di dà un login / password, MA sta dati hè utilizatu solu per eseguisce cumandamenti amministrativi per quella installazione particulare, vale à dì, in u cuntinuu. In u nostru casu, vulemu solu lancià u cuntinuu per chì tuttu u travagliu è i ghjurnali scorri cum'è un fiume. Di sicuru, questu hè hardcode, ma ùn aghju micca trovu altre manere.

In più sicondu u script hè eseguitu

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

splunkclouduf.spl - Questu hè un schedariu di credenziali per Splunk Universal Forwarder, chì pò esse scaricatu da l'interfaccia web.

Induve cliccate per scaricà (in imagine)Splunk Universal Forwarder in docker cum'è un cullettore di log di sistema

Splunk Universal Forwarder in docker cum'è un cullettore di log di sistema
Questu hè un archiviu regulare chì pò esse unpacked. Dentru sò certificati è una password per cunnette à u nostru SplunkCloud è outputs.conf cù una lista di i nostri casi di input. Stu schedariu serà pertinenti finu à chì reinstallate a vostra installazione Splunk o aghjunghje un node di input se l'installazione hè on-premise. Dunque, ùn ci hè nunda di male à aghjunghje in u cuntinuu.

È l'ultima cosa hè riavvia. Iè, per applicà i cambiamenti, avete bisognu di riavvia.

In u nostru inputs.conf aghjunghjemu i logs chì vulemu mandà à Splunk. Ùn hè micca necessariu aghjunghje stu schedariu à l'imaghjini se, per esempiu, distribute cunfigurazioni via puppet. L'unicu cosa hè chì Forwarder vede a cunfigurazione quandu u daemon principia, altrimenti avarà bisognu ./splunk restart.

Chì tippu di script di stats docker sò? Ci hè una vechja suluzione nantu à Github da omu fora, I scripts sò stati pigliati da quì è mudificate per travaglià cù e versioni attuali di Docker (ce-17.*) è Splunk (7.*).

Cù i dati ottenuti, pudete custruisce i seguenti

dashboards: (un coppiu di ritratti)Splunk Universal Forwarder in docker cum'è un cullettore di log di sistema

Splunk Universal Forwarder in docker cum'è un cullettore di log di sistema
U codice fonte per i trattini hè in u ligame furnitu à a fine di l'articulu. Per piacè nutate chì ci sò 2 campi selezziunati: 1 - selezzione d'indici (cercata per maschera), selezzione di host/container. Puderete bisognu di aghjurnà a maschera d'indici, secondu i nomi chì utilizate.

In cunclusioni, vogliu attirà a vostra attenzione à a funzione principià () в

puntu d'entrata.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
}

In u mo casu, per ogni ambiente è ogni entità individuale, sia una applicazione in un containeru o una macchina d'ospite, usemu un indice separatu. In questu modu, a velocità di ricerca ùn soffre micca quandu ci hè una accumulazione significativa di dati. Una regula simplice hè usata per nome indici: _. Dunque, per chì u cuntinuu sia universale, prima di lancià u daemon stessu, rimpiazzamu sidu-th wildcard à u nome di l'ambiente. A variabile di u nome di l'ambiente hè passatu per e variabili di l'ambiente. Sona divertente.

Hè da nutà ancu chì per una certa ragione Splunk ùn hè micca affettatu da a presenza di u paràmetru docker. nomu di ostinu. Ellu hà sempre stubbornly mandà logs cù l'id di u so cuntinuu in u campu di l'ospiti. Comu suluzione, pudete muntà / etc / hostname da a macchina host è à l'iniziu facenu rimpiazzamenti simili à i nomi d'indici.

Esempiu 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

U risultatu

Iè, forsi a suluzione ùn hè micca ideale è certamente micca universale per tutti, postu chì ci sò assai "hardcode". Ma basatu annantu à questu, ognunu pò custruisce a so propria maghjina è mette in u so artifactory privatu, se, cum'è succede, avete bisognu di Splunk Forwarder in Docker.

Referenze:

Soluzione da l'articulu
Una soluzione di outcoldman chì ci hà ispiratu à riutilizà alcune di e funziunalità
Di. documentazione per l'installazione di Universal Forwarder

Source: www.habr.com

Add a comment