Splunk Universal Forwarder في Docker كنظام سجلات المجمّع



Splunk هو المنتج التجاري الأكثر شهرة لجمع السجلات وتحليلها. حتى الآن ، عندما توقف Splunk المبيعات في الاتحاد الروسي. وهذا ليس سببًا لعدم كتابة المقالات الإرشادية حول هذا المنتج.

الهدف : تجميع سجلات النظام من العقد Docker دون تغيير تكوين الجهاز المضيف

لنبدأ بالطريقة الرسمية التي تبدو غريبة باستخدام 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 ********* etc... ] ***************************************** $ 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... 

عظيم. صورة عامل الميناء لا تحتوي على قطعة أثرية. وبالتالي ، في كل مرة تقوم فيها بتشغيل الحاوية ، ستقوم بتنزيل الثنائيات وتفريغها وتكوينها.
ماذا عن عامل الميناء؟ اين هو؟

لا شكرا. سوف نختار الطريق الصحيح. ماذا لو قمنا بتنفيذ جميع الأوامر خلال مرحلة البناء؟ دعنا نذهب!

لتخطي الجزء الممل ، هناك صورة نهائية:

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

لذلك ، فإن محتوى

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 

أثناء البداية ، سيطلب Splunk تسجيل الدخول / كلمة المرور ، لكن بيانات اعتماد BUT يمكن استخدامها فقط لتنفيذ أوامر المسؤول في هذا التثبيت المحدد ، داخل الحاوية. في حالتنا ، نريد فقط تشغيل الحاوية ويجب أن يعمل كل شيء دون أي إجراءات. قد يبدو مثل "hardcode" ، لكنني لم أجد أي حلول أخرى.
الخطوة التالية للبناء هي

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

splunkclouduf.spl - هذا هو ملف بيانات اعتماد Splunk Universal Forwarder ، والذي يمكنك تنزيله عبر واجهة المستخدم.

ما الأزرار التي يجب أن أضغط عليها (الصور)



إنه أرشيف بسيط يمكنك فكه بسهولة. أنه يحتوي على - شهادات وكلمة مرور للاتصال SplunkCloud لدينا. outputs.conf مع قائمة العقد المدخلات. سيكون هذا الملف فعليًا ما لم تقم بإعادة تثبيت تثبيت Splunk أو إضافة نقاط إدخال جديدة إذا كانت موجودة. على أي حال ، لن يحدث أي شيء خطير إذا وضعت الصورة.

الخطوة الأخيرة - إعادة التشغيل. نعم ، لتطبيق التكوين ، يجب إعادة تشغيله.

أضف السجلات إلى المدخلات. ونريد إرسالها إلى Splunk. إذا قمت بتقديم التكوين عبر Puppet ، فلن تحتاج إلى إضافة هذا التكوين إلى الصورة. فقط ضع في اعتبارك أنه يجب تثبيت ملف التكوين.

ما هي النصوص القانون الأساسي عامل ميناء؟ يمكنك العثور على الحل على Github من outcoldman ، لقد اخترت البرامج النصية من هناك وقمت بتحديثه للسماح له بالعمل مع الإصدارات الفعلية من Docker (ce-17. *) و Splunk (7. *).
يمكنك إنشاء لوحات معلومات رائعة باستخدام بيانات مجمعة:

لوحات المعلومات: (صور)



يمكنك العثور على شفرة مصدر لوحة القيادة في الريبو ، والتي ذكرتها في نهاية المقال. انتبه إلى حقل التحديد الأول: اختر الفهرس (ابحث عن القناع). سيكون لديك لتحديث القناع. ذلك يعتمد على أسماء الفهرس التي لديك.

في النهاية ، أريد أن أنبه إلى وظيفة start () في الداخل

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 } 

في حالتي ، لكل بيئة ، ولكل خدمة ، لا يهم الجهاز المضيف أو تطبيق عامل ميناء ، نحن إنشاء فهرس منفصل. ويمنع انخفاض سرعة البحث عن طريق ارتفاع كمية البيانات الموجودة في الفهرس. نحن نستخدم قاعدة تحويل التسمية البسيطة: <environment_name> _ <service / application / etc> . وبالتالي ، لصنع حاوية عالمية ، فإننا نستبدل حرف البدل باسم البيئة بواسطة sed . متغير اسم البيئة يرث بواسطة متغير البيئة. يبدو مضحكا.

وأيضًا ، أود الإشارة إلى أن Splunk لسبب ما لا يستخدم اسم مضيف معلمة عامل النقل كحقل مضيف في السجلات. سيستمر إرسال السجلات مع المضيف = <forwarder_container_id> حتى إذا قمت بتعريف معلمة اسم المضيف. الحل: يمكنك تحميل / etc / hostname من الجهاز المضيف واستبدال معلمة المضيف مثل أسماء الفهرس.

عامل ميناء 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 


موجز.
نعم ، ربما ، قد لا يكون الحل الخاص بي مثاليًا وهو ليس الحل الشامل للجميع لأنه يحتوي على "hardcode" . ولكن قد يكون من المفيد لشخص يمكنه بناء صورته الخاصة ووضعها في السجل الخاص. خاصة إذا كنت بحاجة إلى Splunk Forwarder in the Docker.

الروابط:

هذا الحل
حل من outcoldman مما أعطاني إلهام لإعادة استخدام بعض الوظائف
صفحة الوثائق الرسمية. تكوين معيد التوجيه العالمي

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


All Articles