Splunk Universal Forwarder im Docker als Systemprotokollsammler



Splunk ist das bekannteste kommerzielle Produkt zum Sammeln und Analysieren von Protokollen. Sogar jetzt, als Splunk den Verkauf in der Russischen Föderation eingestellt hat. Und das ist kein Grund, die Artikel mit Anleitungen zu diesem Produkt nicht zu schreiben.

Ziel : Sammeln Sie die Systemprotokolle von den Docker-Knoten, ohne die Computerkonfiguration des Hosts zu ändern

Beginnen wir mit dem offiziellen Weg, der mit dem Docker seltsam erscheint.
Docker Hub Link

Konfigurationsschritte:

1. Bild ziehen

$ docker pull splunk/universalforwarder:latest 

2. Führen Sie den Container mit den benötigten Parametern aus

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

3. Melden Sie sich im Container an

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

Dann sollten wir die Docs-Seite besuchen.

Und konfigurieren Sie den Container nach dem Start:

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

Warten Sie. Was?
Dies ist jedoch nicht die letzte Überraschung. Wenn Sie den offiziellen Container im interaktiven Modus ausführen, werden Sie:

Einige Enttäuschung
 $ 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 ********* etc... 

Großartig Das Docker-Bild enthält kein Artefakt. Jedes Mal, wenn Sie den Container ausführen, werden Sie Binärdateien herunterladen, entpacken und konfigurieren.
Was ist mit Docker-Way? Wo ist es

Nein, danke. Wir werden den richtigen Weg wählen. Was ist, wenn wir alle Befehle während der Erstellungsphase ausführen? Lass uns weitermachen!

Um den langweiligen Teil zu überspringen, gibt es ein endgültiges Bild:

Dockerfile
 # Depends on your preferences FROM centos:7 # Define env variables only once and don't define it any more ENV SPLUNK_HOME /splunkforwarder ENV SPLUNK_ROLE splunk_heavy_forwarder ENV SPLUNK_PASSWORD changeme ENV SPLUNK_START_ARGS --accept-license # Install required packages # wget - to download artifacts # expect - for the first run step of Splunk for build stage # jq - using in the shell scripts RUN yum install -y epel-release \ && yum install -y wget expect jq # Download, unpack, remove 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 # Everything is simple with shell scripts, but inputs.conf, splunkclouduf.spl and first_start.sh should have an explanation. I'll tell more about it below. 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/ # Grant execute permissions, add user, execute pre-configuration 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 scripts COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ] # It depends. If you need it locally - go on. 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" ] 

Also, der Inhalt von

first_start.sh
 #!/usr/bin/expect -f set timeout -1 spawn /splunkforwarder/bin/splunk start --accept-license expect "Please enter an administrator username: " send -- "admin\r" expect "Please enter a new password: " send -- "changeme\r" expect "Please confirm new password: " send -- "changeme\r" expect eof 

Während des ersten Starts fragt Splunk nach Login / Passwort. ABER Anmeldeinformationen können nur für die Ausführung der Befehle des Administrators in dieser bestimmten Installation innerhalb des Containers verwendet werden. In unserem Fall möchten wir nur den Container ausführen und alles sollte ohne Aktionen funktionieren. Es mag wie "Hardcode" aussehen, aber ich habe keine anderen Lösungen gefunden.
Der nächste Schritt des Builds ist

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

splunkclouduf.spl - Dies ist die Anmeldeinformationsdatei von Splunk Universal Forwarder, die Sie über die Benutzeroberfläche herunterladen können.

Welche Tasten soll ich drücken (Bilder)



Es ist ein einfaches Archiv, das Sie leicht entpacken können. Es enthält - Zertifikate und Passwort, um eine Verbindung zu unserer SplunkCloud herzustellen; output.conf mit der Liste der Eingabeknoten. Diese Datei ist aktuell, es sei denn, Sie installieren die Splunk-Installation erneut oder fügen neue Eingabeknoten hinzu, wenn sie lokal ist. Auf jeden Fall wird nichts Ernstes passieren, wenn Sie es auf das Bild setzen.

Der letzte Schritt - Neustart. Ja, um die Konfiguration anzuwenden, muss sie neu gestartet werden.

Fügen Sie die Protokolle in inputs.conf hinzu, die wir an Splunk senden möchten. Wenn Sie die Konfiguration über Puppet bereitstellen, müssen Sie diese Konfiguration nicht zum Image hinzufügen. Denken Sie daran, dass die Konfigurationsdatei gemountet werden sollte.

Was sind die Docker-Statistikskripte? Sie konnten die Lösung auf dem Github von outcoldman finden. Ich habe Skripte von dort ausgewählt und aktualisiert, damit sie mit aktuellen Versionen von Docker (ce-17. *) Und Splunk (7. *) funktionieren.
Sie können ausgefallene Dashboards mit gesammelten Daten erstellen:

Dashboards: (Bilder)



Sie finden den Dashboard-Quellcode im Repo, das ich am Ende des Artikels erwähnt habe. Achten Sie auf das 1. Auswahlfeld: Index auswählen (Suche nach der Maske). Sie müssten die Maske aktualisieren. Dies hängt von den Indexnamen ab, die Sie haben.

Am Ende möchte ich auf die Funktion start () im Inneren achten

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 meinem Fall erstellen wir für jede Umgebung und für jeden Dienst, unabhängig von Host-Computer oder Docker-Anwendung, einen separaten Index. Es verhindert eine Verringerung der Suchgeschwindigkeit durch die hohe Datenmenge im Index. Wir verwenden eine einfache Namenskonvertierungsregel: <Umgebungsname> _ <Dienst / Anwendung / etc> . Um einen universellen Container zu erstellen, ersetzen wir den Platzhalter durch den Umgebungsnamen durch sed . Die Umgebungsnamensvariable erbt von der Umgebungsvariablen. Klingt lustig.

Außerdem möchte ich darauf hinweisen, dass Splunk aus irgendeinem Grund den Docker-Parameter Hostname nicht als Hostfeld in Protokollen verwendet. Es werden weiterhin Protokolle mit host = <Weiterleitungscontainer-ID> gesendet, auch wenn Sie den Parameter Hostname definieren. Lösung: Sie können / etc / hostname vom Hostcomputer bereitstellen und Hostparameter wie Indexnamen ersetzen.

Beispiel für 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 


Zusammenfassung
Ja, vielleicht ist meine Lösung nicht ideal und sie ist nicht für alle universell, da sie "Hardcode" enthält. Aber es könnte hilfreich sein für jemanden, der sein eigenes Image erstellen und es in die private Registrierung stellen kann. Vor allem, wenn Sie Splunk Forwarder im Docker benötigen.

Links:

Diese Lösung
Lösung von outcoldman, die mich dazu inspirierte, einige Funktionen wiederzuverwenden
Offizielle Dokumentationsseite. Universelle Weiterleiterkonfiguration

Source: https://habr.com/ru/post/de447532/


All Articles