Splunk Universal Forwarder in docker als systeemlogboekverzamelaar

Splunk Universal Forwarder in docker als systeemlogboekverzamelaar

Splunk is een van de meest herkenbare commerciële producten voor het verzamelen en analyseren van houtblokken. Zelfs nu de verkoop niet meer in Rusland plaatsvindt, is dit geen reden om geen instructies/how-to voor dit product te schrijven.

Taak: verzamel systeemlogboeken van docker-knooppunten in Splunk zonder de configuratie van de hostmachine te wijzigen

Ik zou graag willen beginnen met de officiële aanpak, die er een beetje vreemd uitziet bij het gebruik van Docker.
Link naar Docker-hub
Wat hebben we:

1. Pullim-afbeelding

$ docker pull splunk/universalforwarder:latest

2. Start de container met de benodigde parameters

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

3. We gaan de container in

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

Vervolgens worden we gevraagd om naar een bekend adres in de documentatie te gaan.

En configureer de container nadat deze is gestart:


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

Wachten. Wat?

Maar daar houden de verrassingen niet op. Als u de container vanuit de officiële afbeelding in de interactieve modus uitvoert, ziet u het volgende:

Een beetje teleurstelling


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

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

Geweldig. De afbeelding bevat niet eens een artefact. Dat wil zeggen dat het elke keer dat u start tijd kost om het archief met binaire bestanden te downloaden, uit te pakken en te configureren.
Hoe zit het met Docker-way en zo?

Nee bedankt. Wij nemen een andere route. Wat als we al deze handelingen in de assemblagefase uitvoeren? Laten we dan gaan!

Om niet te lang te wachten, laat ik je meteen het uiteindelijke beeld zien:

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

Wat zit er dus in

eerste_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

Bij de eerste start vraagt ​​Splunk je om een ​​login/wachtwoord te geven, MAAR deze gegevens worden gebruikt alleen om administratieve opdrachten uit te voeren voor die specifieke installatie, dat wil zeggen binnen de container. In ons geval willen we gewoon de container lanceren, zodat alles werkt en de boomstammen als een rivier stromen. Natuurlijk is dit hardcode, maar ik heb geen andere manieren gevonden.

Verder wordt volgens het script uitgevoerd

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

splunkclouduf.spl — Dit is een inloggegevensbestand voor Splunk Universal Forwarder, dat kan worden gedownload via de webinterface.

Waar te klikken om te downloaden (in afbeeldingen)Splunk Universal Forwarder in docker als systeemlogboekverzamelaar

Splunk Universal Forwarder in docker als systeemlogboekverzamelaar
Dit is een regulier archief dat kan worden uitgepakt. Hierin zitten certificaten en een wachtwoord om verbinding te maken met onze SplunkCloud en uitgangen.conf met een lijst van onze invoerinstanties. Dit bestand is relevant totdat u uw Splunk-installatie opnieuw installeert of een invoerknooppunt toevoegt als de installatie op locatie plaatsvindt. Daarom is er niets mis mee om het in de container toe te voegen.

En het laatste is opnieuw opstarten. Ja, om de wijzigingen toe te passen, moet u het programma opnieuw opstarten.

In onze ingangen.conf we voegen de logs toe die we naar Splunk willen sturen. Het is niet nodig om dit bestand aan de afbeelding toe te voegen als u bijvoorbeeld configuraties via puppet distribueert. Het enige is dat Forwarder de configuraties ziet wanneer de daemon start, anders heeft hij dit nodig ./splunk opnieuw opstarten.

Wat voor soort docker-statistiekenscripts zijn het? Er is een oude oplossing op Github vandaan uitkoudeman, de scripts zijn daar vandaan gehaald en aangepast om te werken met de huidige versies van Docker (ce-17.*) en Splunk (7.*).

Met de verkregen gegevens kunt u het volgende bouwen

dashboards: (een paar foto's)Splunk Universal Forwarder in docker als systeemlogboekverzamelaar

Splunk Universal Forwarder in docker als systeemlogboekverzamelaar
De broncode voor streepjes staat in de link aan het einde van het artikel. Houd er rekening mee dat er 2 selectievelden zijn: 1 - indexselectie (gezocht op masker), host-/containerselectie. Afhankelijk van de namen die u gebruikt, zult u waarschijnlijk het indexmasker moeten bijwerken.

Tot slot wil ik uw aandacht vestigen op de functie begin() в

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
}

In mijn geval gebruiken we voor elke omgeving en elke individuele entiteit, of het nu een applicatie in een container of een hostmachine is, een afzonderlijke index. Op deze manier zal de zoeksnelheid er niet onder lijden als er sprake is van een aanzienlijke opeenstapeling van gegevens. Er wordt een eenvoudige regel gebruikt om indexen een naam te geven: _. Om ervoor te zorgen dat de container universeel is, vervangen we daarom voordat we de daemon zelf lanceren dorst-de jokerteken voor de naam van de omgeving. De omgevingsnaamvariabele wordt doorgegeven via omgevingsvariabelen. Klinkt grappig.

Het is ook vermeldenswaard dat Splunk om de een of andere reden niet wordt beïnvloed door de aanwezigheid van de docker-parameter hostname. Hij zal nog steeds koppig logs sturen met de id van zijn container in het hostveld. Als oplossing kunt u monteren / Etc / hostnaam vanaf de hostcomputer en voer bij het opstarten vervangingen uit die lijken op indexnamen.

Voorbeeld 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

Totaal

Ja, misschien is de oplossing niet ideaal en zeker niet universeel voor iedereen, aangezien er veel zijn "hardcode". Maar op basis daarvan kan iedereen zijn eigen afbeelding bouwen en deze in zijn privé-kunstwerk plaatsen, als je toevallig Splunk Forwarder in Docker nodig hebt.

referenties:

Oplossing uit het artikel
Een oplossing van outcoldman die ons inspireerde om een ​​deel van de functionaliteit te hergebruiken
Van. documentatie voor het instellen van Universal Forwarder

Bron: www.habr.com

Voeg een reactie