Splunk Universal Forwarder στο docker ως συλλέκτης αρχείων καταγραφής συστήματος

Splunk Universal Forwarder στο docker ως συλλέκτης αρχείων καταγραφής συστήματος

Το Splunk είναι ένα από τα πιο αναγνωρίσιμα εμπορικά προϊόντα συλλογής και ανάλυσης κορμών. Ακόμη και τώρα, όταν οι πωλήσεις δεν γίνονται πλέον στη Ρωσία, αυτό δεν είναι λόγος να μην γράψετε οδηγίες/πώς για αυτό το προϊόν.

Έργο: συλλογή αρχείων καταγραφής συστήματος από κόμβους docker στο Splunk χωρίς αλλαγή της διαμόρφωσης του κεντρικού υπολογιστή

Θα ήθελα να ξεκινήσω με την επίσημη προσέγγιση, η οποία φαίνεται λίγο περίεργη όταν χρησιμοποιείτε το Docker.
Σύνδεσμος με το Docker hub
Τι έχουμε:

1. Τραβήξτε την εικόνα

$ docker pull splunk/universalforwarder:latest

2. Ξεκινήστε το δοχείο με τις απαραίτητες παραμέτρους

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

3. Μπαίνουμε στο δοχείο

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

Στη συνέχεια, μας ζητείται να πάμε σε μια γνωστή διεύθυνση στην τεκμηρίωση.

Και διαμορφώστε το κοντέινερ μετά την εκκίνηση:


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

Περίμενε. Τι?

Όμως οι εκπλήξεις δεν σταματούν εκεί. Εάν εκτελέσετε το κοντέινερ από την επίσημη εικόνα σε διαδραστική λειτουργία, θα δείτε τα εξής:

Λίγη απογοήτευση


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

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

Εξαιρετική. Η εικόνα δεν περιέχει καν τεχνούργημα. Δηλαδή, κάθε φορά που ξεκινάτε θα χρειάζεται χρόνος για να κατεβάσετε το αρχείο με δυαδικά αρχεία, να αποσυσκευάσετε και να ρυθμίσετε τις παραμέτρους.
Τι γίνεται με το docker-way και όλα αυτά;

Οχι ευχαριστώ. Θα ακολουθήσουμε διαφορετική διαδρομή. Τι γίνεται αν πραγματοποιήσουμε όλες αυτές τις λειτουργίες στο στάδιο της συναρμολόγησης; Τότε πάμε!

Για να μην καθυστερήσω πολύ, θα σας δείξω αμέσως την τελική εικόνα:

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

Τι περιέχεται λοιπόν σε

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

Στην πρώτη εκκίνηση, το Splunk σας ζητά να του δώσετε ένα login/password, ΑΛΛΑ αυτά τα δεδομένα χρησιμοποιούνται μόνο για να εκτελέσετε εντολές διαχείρισης για τη συγκεκριμένη εγκατάσταση, δηλαδή μέσα στο κοντέινερ. Στην περίπτωσή μας, θέλουμε απλώς να εκτοξεύσουμε το κοντέινερ έτσι ώστε όλα να λειτουργούν και τα κούτσουρα να ρέουν σαν ποτάμι. Φυσικά, αυτός είναι σκληρός κώδικας, αλλά δεν έχω βρει άλλους τρόπους.

Περαιτέρω σύμφωνα με το σενάριο εκτελείται

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

splunkclouduf.spl — Αυτό είναι ένα αρχείο διαπιστευτηρίων για το Splunk Universal Forwarder, το οποίο μπορεί να ληφθεί από τη διεπαφή Ιστού.

Πού να κάνετε κλικ για λήψη (σε φωτογραφίες)Splunk Universal Forwarder στο docker ως συλλέκτης αρχείων καταγραφής συστήματος

Splunk Universal Forwarder στο docker ως συλλέκτης αρχείων καταγραφής συστήματος
Αυτό είναι ένα κανονικό αρχείο που μπορεί να αποσυσκευαστεί. Μέσα υπάρχουν πιστοποιητικά και ένας κωδικός πρόσβασης για τη σύνδεση στο SplunkCloud και εξόδους.conf με μια λίστα των περιπτώσεων εισαγωγής μας. Αυτό το αρχείο θα είναι σχετικό μέχρι να εγκαταστήσετε ξανά την εγκατάσταση του Splunk ή να προσθέσετε έναν κόμβο εισόδου εάν η εγκατάσταση είναι εσωτερικής εγκατάστασης. Επομένως, δεν υπάρχει τίποτα κακό με την προσθήκη του μέσα στο δοχείο.

Και το τελευταίο πράγμα είναι η επανεκκίνηση. Ναι, για να εφαρμόσετε τις αλλαγές, πρέπει να το επανεκκινήσετε.

Στο δικό μας εισροές.conf προσθέτουμε τα αρχεία καταγραφής που θέλουμε να στείλουμε στο Splunk. Δεν είναι απαραίτητο να προσθέσετε αυτό το αρχείο στην εικόνα εάν, για παράδειγμα, διανέμετε ρυθμίσεις μέσω μαριονέτας. Το μόνο πράγμα είναι ότι το Forwarder βλέπει τις ρυθμίσεις παραμέτρων όταν ξεκινά ο δαίμονας, διαφορετικά θα χρειαστεί ./splunk επανεκκίνηση.

Τι είδους σενάρια στατιστικών στοιχείων docker είναι αυτά; Υπάρχει μια παλιά λύση στο Github από outcoldman, τα σενάρια ελήφθησαν από εκεί και τροποποιήθηκαν για να λειτουργούν με τις τρέχουσες εκδόσεις του Docker (ce-17.*) και του Splunk (7.*).

Με τα δεδομένα που αποκτήθηκαν, μπορείτε να δημιουργήσετε τα ακόλουθα

ταμπλό: (μερικές φωτογραφίες)Splunk Universal Forwarder στο docker ως συλλέκτης αρχείων καταγραφής συστήματος

Splunk Universal Forwarder στο docker ως συλλέκτης αρχείων καταγραφής συστήματος
Ο πηγαίος κώδικας για τις παύλες βρίσκεται στον σύνδεσμο που παρέχεται στο τέλος του άρθρου. Λάβετε υπόψη ότι υπάρχουν 2 επιλεγμένα πεδία: 1 - επιλογή ευρετηρίου (αναζήτηση με μάσκα), επιλογή κεντρικού υπολογιστή/κοντέινερ. Πιθανότατα θα χρειαστεί να ενημερώσετε τη μάσκα ευρετηρίου, ανάλογα με τα ονόματα που χρησιμοποιείτε.

Εν κατακλείδι, θα ήθελα να επιστήσω την προσοχή σας στη λειτουργία αρχή() в

σημείο εισόδου.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
}

Στην περίπτωσή μου, για κάθε περιβάλλον και κάθε μεμονωμένη οντότητα, είτε πρόκειται για εφαρμογή σε ένα κοντέινερ είτε για έναν κεντρικό υπολογιστή, χρησιμοποιούμε ξεχωριστό ευρετήριο. Με αυτόν τον τρόπο, η ταχύτητα αναζήτησης δεν θα υποφέρει όταν υπάρχει σημαντική συσσώρευση δεδομένων. Ένας απλός κανόνας χρησιμοποιείται για την ονομασία ευρετηρίων: _. Επομένως, για να είναι το δοχείο καθολικό, πριν εκτοξεύσουμε τον ίδιο τον δαίμονα, αντικαθιστούμε δίψα-ο μπαλαντέρ στο όνομα του περιβάλλοντος. Η μεταβλητή ονόματος περιβάλλοντος μεταβιβάζεται μέσω μεταβλητών περιβάλλοντος. Ακούγεται αστείο.

Αξίζει επίσης να σημειωθεί ότι για κάποιο λόγο το Splunk δεν επηρεάζεται από την παρουσία της παραμέτρου docker hostname. Θα εξακολουθεί να στέλνει με πείσμα κορμούς με την ταυτότητα του κοντέινερ του στο πεδίο υποδοχής. Ως λύση, μπορείτε να τοποθετήσετε / etc / hostname από τον κεντρικό υπολογιστή και κατά την εκκίνηση, πραγματοποιήστε αντικαταστάσεις παρόμοιες με τα ονόματα ευρετηρίου.

Παράδειγμα 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

Σύνολο

Ναι, ίσως η λύση δεν είναι ιδανική και σίγουρα δεν είναι καθολική για όλους, αφού είναι πολλές "σκληρός κώδικας". Αλλά με βάση αυτό, ο καθένας μπορεί να δημιουργήσει τη δική του εικόνα και να την βάλει στο ιδιωτικό του τεχνούργημα, αν, όπως συμβαίνει, χρειάζεστε το Splunk Forwarder στο Docker.

Βιβλιογραφικές αναφορές:

Λύση από το άρθρο
Μια λύση από την outcoldman που μας ενέπνευσε να επαναχρησιμοποιήσουμε μέρος της λειτουργικότητας
Του. τεκμηρίωση για τη ρύθμιση του Universal Forwarder

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο