Splunk Universal Forwarder ב-Docker כאוסף יומני מערכת

Splunk Universal Forwarder ב-Docker כאוסף יומני מערכת

Splunk הוא אחד המוצרים המסחריים הבודדים המוכרים ביותר לאיסוף וניתוח יומני רישום. אפילו עכשיו, כאשר המכירות ברוסיה אינן מתבצעות עוד, אין זו סיבה לא לכתוב הוראות/הוראות שימוש על מוצר זה.

משימהאיסוף יומני מערכת מצמתי docker ב-Splunk מבלי לשנות את תצורת מכונת המארח

אני רוצה להתחיל עם הגישה הרשמית, שנראית מוזרה כשמשתמשים בדוקר.
קישור למרכז Docker
אז מה יש לנו:

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

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

מצוין. אין אפילו ארטיפקט בתמונה. כלומר, בכל פעם שתפעילו אותו, יושקע זמן בהורדת הארכיון עם הקבצים הבינאריים, פקיעת הקובץ ותצורתו.
מה לגבי דוקר-וויי וכל זה?

לא, תודה. נלך בכיוון השני. מה אם נעשה את כל הפעולות האלה בשלב ההרכבה? אז בואו נלך!

כדי לא להאריך את זה, אני אראה לכם את התמונה הסופית מיד:

דוקרפיל

# Тут у кого какие предпочтения
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 לראשונה, הוא מבקש ממך להגדיר שם משתמש/סיסמה, אבל הנתונים האלה משמשים רק להפעיל פקודות אדמיניסטרטיביות עבור התקנה ספציפית זו, כלומר, בתוך הקונטיינר. במקרה שלנו, אנחנו רק רוצים להפעיל את הקונטיינר כך שהכל יעבוד והיומנים יזרמו כמו נהר. כמובן, זה קוד קשיח, אבל לא מצאתי דרכים אחרות.

בהמשך, בהתאם לתרחיש, מתבצעים הפעולות הבאות:

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

splunkclouduf.spl זהו קובץ אישורים של Splunk Universal Forwarder שניתן להוריד מממשק האינטרנט.

איפה ללחוץ כדי להוריד (בתמונות)Splunk Universal Forwarder ב-Docker כאוסף יומני מערכת

Splunk Universal Forwarder ב-Docker כאוסף יומני מערכת
זהו ארכיון רגיל שניתן לפרוק. בפנים יש אישורים וסיסמה להתחברות ל-SplunkCloud שלנו. outputs.conf עם רשימה של מופעי הקלט שלנו. קובץ זה יהיה רלוונטי עד שתתקין מחדש את התקנת Splunk שלך או תוסיף צומת קלט אם ההתקנה היא מקומית. לכן אין שום דבר רע בהוספתו בתוך הקונטיינר.

והדבר האחרון הוא הפעלה מחדש. כן, כדי להחיל את השינויים, עליך להפעיל מחדש.

אצלנו inputs.conf הוסיפו יומני רישום (logs) שאנו רוצים לשלוח ל-Splunk. אין צורך להוסיף קובץ זה לתמונה אם, לדוגמה, אתם מפיצים קונפיגים דרך puppet. העיקר הוא ש-Forwarder יראה את הקונפיגים בעת הפעלת הדמון, אחרת יהיה צורך. הפעלה מחדש של ./splunk.

מהם סקריפטים של סטטיסטיקות של דוקר? יש פתרון ישן בגיטהאב מאת איש אאוטקולד, הסקריפטים נלקחים משם ומעוצבים כך שיעבדו עם הגרסאות הנוכחיות של Docker (ce-17.*) ו-Splunk (7.*).

בעזרת הנתונים שהתקבלו, ניתן לבנות את הדברים הבאים

לוחות מחוונים: (כמה תמונות)Splunk Universal Forwarder ב-Docker כאוסף יומני מערכת

Splunk Universal Forwarder ב-Docker כאוסף יומני מערכת
קוד המקור של מקפים נמצא במאגר שצוין בסוף המאמר. שימו לב שישנם 2 שדות בחירה: 1 - בחירת אינדקס (חיפוש לפי מסכה), בחירת מארח/מיכל. סביר להניח שתצטרכו לעדכן את מסכת האינדקס, בהתאם לשמות שבהם תשתמשו.

לסיכום, ברצוני להפנות את תשומת הלב לפונקציה הַתחָלָה() в

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
}

במקרה שלי, עבור כל סביבה וכל ישות בנפרד, בין אם מדובר ביישום מקונטיינרי או במחשב מארח, אנו משתמשים באינדקס נפרד. בדרך זו, מהירות החיפוש לא תיפגע כאשר נתונים מצטברים באופן משמעותי. כלל פשוט משמש למתן שמות לאינדקסים: _לכן, כדי שהקונטיינר יהיה אוניברסלי, לפני הפעלת הדמון עצמו, אנו מחליפים צמאתו כללי -om לשם הסביבה. המשתנה עם שם הסביבה מועבר דרך משתני סביבה. נשמע מצחיק.

כמו כן, ראוי לציין שמסיבה כלשהי, Splunk אינו מושפע מנוכחות הפרמטר docker. המארחזה עדיין ישלח בעקשנות יומני רישום עם המזהה של המכולה שלו בשדה המארח. כפתרון, אתה יכול לטעון / 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.

קישורים:

הפתרון מהמאמר
הפתרון של אאוטקולדמן נתן השראה לשימוש חוזר בחלק מהפונקציונליות
תיעוד רשמי על הגדרת Universal Forwarder

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster