Splunk Universal Forwarder a Docker com a col·lector de registres del sistema

Splunk Universal Forwarder a Docker com a col·lector de registres del sistema

Splunk és un dels diversos productes de recollida i anàlisi de registres comercials més reconeixibles. Fins i tot ara, quan les vendes ja no es fan a Rússia, aquesta no és una raó per no escriure instruccions o instruccions per a aquest producte.

Tasca: recopila els registres del sistema dels nodes docker a Splunk sense canviar la configuració de la màquina host

M'agradaria començar amb l'enfocament oficial, que sembla una mica estrany quan s'utilitza Docker.
Enllaç a Docker hub
Què tenim:

1. Imatge Pullim

$ docker pull splunk/universalforwarder:latest

2. Posar en marxa el contenidor amb els paràmetres necessaris

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

3. Entrem al contenidor

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

A continuació, se'ns demana que anem a una adreça coneguda a la documentació.

I configureu el contenidor després que s'iniciï:


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

Espera. Què?

Però les sorpreses no acaben aquí. Si executeu el contenidor des de la imatge oficial en mode interactiu, veureu el següent:

Una mica de decepció


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

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

Genial. La imatge ni tan sols conté un artefacte. És a dir, cada vegada que comenci trigarà temps a descarregar l'arxiu amb binaris, desempaquetar i configurar.
Què passa amb Docker-way i tot això?

No gràcies. Farem una ruta diferent. I si realitzem totes aquestes operacions en l'etapa de muntatge? Aleshores anem!

Per no demorar-vos massa, us mostraré de seguida la imatge 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" ]

Per tant, què conté

primer_inici.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

Al primer inici, Splunk us demana que li doneu un inici de sessió/contrasenya, PERÒ s'utilitzen aquestes dades només per executar ordres administratives per a aquella instal·lació concreta, és a dir, dins del contenidor. En el nostre cas, només volem llançar el contenidor perquè tot funcioni i els troncs flueixin com un riu. Per descomptat, això és un codi dur, però no he trobat cap altra manera.

A més, segons s'executa l'script

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

splunkclouduf.spl — Aquest és un fitxer de credencials per a Splunk Universal Forwarder, que es pot descarregar des de la interfície web.

On fer clic per descarregar (en imatges)Splunk Universal Forwarder a Docker com a col·lector de registres del sistema

Splunk Universal Forwarder a Docker com a col·lector de registres del sistema
Aquest és un arxiu normal que es pot desempaquetar. A dins hi ha certificats i una contrasenya per connectar-se al nostre SplunkCloud i sortides.conf amb una llista de les nostres instàncies d'entrada. Aquest fitxer serà rellevant fins que torneu a instal·lar la vostra instal·lació de Splunk o afegiu un node d'entrada si la instal·lació és local. Per tant, no hi ha res dolent a afegir-lo dins del contenidor.

I l'últim és reiniciar. Sí, per aplicar els canvis, cal reiniciar-lo.

En la nostra entrades.conf afegim els registres que volem enviar a Splunk. No cal afegir aquest fitxer a la imatge si, per exemple, distribuïu configuracions a través de titella. L'única cosa és que el reenviador veu les configuracions quan s'inicia el dimoni, en cas contrari, necessitarà ./splunk reinici.

Quin tipus de scripts d'estadístiques de Docker són? Hi ha una solució antiga a Github de outcoldman, els scripts es van extreure d'allà i es van modificar per funcionar amb les versions actuals de Docker (ce-17.*) i Splunk (7.*).

Amb les dades obtingudes, podeu construir el següent

quadres de comandament: (un parell d'imatges)Splunk Universal Forwarder a Docker com a col·lector de registres del sistema

Splunk Universal Forwarder a Docker com a col·lector de registres del sistema
El codi font dels guions es troba a l'enllaç que es proporciona al final de l'article. Tingueu en compte que hi ha 2 camps de selecció: 1 - selecció d'índex (cerca per màscara), selecció d'amfitrió/contenidor. Probablement haureu d'actualitzar la màscara d'índex, en funció dels noms que utilitzeu.

En conclusió, m'agradaria cridar la vostra atenció sobre la funció començar() в

punt d'entrada.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
}

En el meu cas, per a cada entorn i cada entitat individual, ja sigui una aplicació en un contenidor o una màquina host, fem servir un índex separat. D'aquesta manera, la velocitat de cerca no patirà quan hi hagi una acumulació important de dades. S'utilitza una regla senzilla per nomenar els índexs: _. Per tant, perquè el contenidor sigui universal, abans de llançar el propi dimoni, substituïm set-è comodí al nom de l'entorn. La variable de nom d'entorn es passa a través de variables d'entorn. Sona divertit.

També val la pena assenyalar que per algun motiu Splunk no es veu afectat per la presència del paràmetre docker nom d'amfitrió. Encara enviarà registres amb l'identificador del seu contenidor al camp amfitrió. Com a solució, podeu muntar / etc / hostname des de la màquina amfitriona i a l'inici feu substitucions semblants als noms d'índex.

Exemple 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

Sí, potser la solució no és ideal i certament no és universal per a tothom, ja que n'hi ha moltes "codi dur". Però a partir d'això, tothom pot crear la seva pròpia imatge i posar-la al seu artefacte privat, si, com passa, necessiteu Splunk Forwarder a Docker.

Enllaços:

Solució de l'article
Una solució d'outcoldman que ens va inspirar a reutilitzar algunes de les funcionalitats
De. documentació per configurar Universal Forwarder

Font: www.habr.com

Afegeix comentari