Splunk הוא אחד המוצרים המסחריים הבודדים המוכרים ביותר לאיסוף וניתוח יומני רישום. אפילו עכשיו, כאשר המכירות ברוסיה אינן מתבצעות עוד, אין זו סיבה לא לכתוב הוראות/הוראות שימוש על מוצר זה.
משימהאיסוף יומני מערכת מצמתי docker ב-Splunk מבלי לשנות את תצורת מכונת המארח
אני רוצה להתחיל עם הגישה הרשמית, שנראית מוזרה כשמשתמשים בדוקר.
אז מה יש לנו:
1. תמונת פולים
$ docker pull splunk/universalforwarder:latest2. הפעל את המכולה עם הפרמטרים הנדרשים
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest3. היכנסו למיכל
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:changemesplunkclouduf.spl זהו קובץ אישורים של Splunk Universal Forwarder שניתן להוריד מממשק האינטרנט.
איפה ללחוץ כדי להוריד (בתמונות)
זהו ארכיון רגיל שניתן לפרוק. בפנים יש אישורים וסיסמה להתחברות ל-SplunkCloud שלנו. outputs.conf עם רשימה של מופעי הקלט שלנו. קובץ זה יהיה רלוונטי עד שתתקין מחדש את התקנת Splunk שלך או תוסיף צומת קלט אם ההתקנה היא מקומית. לכן אין שום דבר רע בהוספתו בתוך הקונטיינר.
והדבר האחרון הוא הפעלה מחדש. כן, כדי להחיל את השינויים, עליך להפעיל מחדש.
אצלנו inputs.conf הוסיפו יומני רישום (logs) שאנו רוצים לשלוח ל-Splunk. אין צורך להוסיף קובץ זה לתמונה אם, לדוגמה, אתם מפיצים קונפיגים דרך puppet. העיקר הוא ש-Forwarder יראה את הקונפיגים בעת הפעלת הדמון, אחרת יהיה צורך. הפעלה מחדש של ./splunk.
מהם סקריפטים של סטטיסטיקות של דוקר? יש פתרון ישן בגיטהאב מאת , הסקריפטים נלקחים משם ומעוצבים כך שיעבדו עם הגרסאות הנוכחיות של Docker (ce-17.*) ו-Splunk (7.*).
בעזרת הנתונים שהתקבלו, ניתן לבנות את הדברים הבאים
לוחות מחוונים: (כמה תמונות)
קוד המקור של מקפים נמצא במאגר שצוין בסוף המאמר. שימו לב שישנם 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.
קישורים:
מקור: www.habr.com
