يعد Splunk واحدًا من العديد من منتجات جمع وتحليل السجلات التجارية الأكثر شهرة. حتى الآن، عندما لم تعد تتم المبيعات في روسيا، فهذا ليس سببًا لعدم كتابة تعليمات/كيفية استخدام هذا المنتج.
مهمة: جمع سجلات النظام من عقد الإرساء في 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 *********
ну и так далее...
عظيم. الصورة لا تحتوي حتى على قطعة أثرية. أي أنه في كل مرة تبدأ فيها، سيستغرق تنزيل الأرشيف بالثنائيات وفك ضغطه وتكوينه بعض الوقت.
ماذا عن طريقة الإرساء وكل ذلك؟
ًلا شكرا. سنتخذ طريقًا مختلفًا. ماذا لو قمنا بكل هذه العمليات في مرحلة التجميع؟ إذا دعنا نذهب!
وحتى لا أتأخر كثيراً، سأعرض لكم الصورة النهائية على الفور:
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 إعطائه معلومات تسجيل الدخول/كلمة المرور، ولكن يتم استخدام هذه البيانات فقط لتنفيذ الأوامر الإدارية لهذا التثبيت المعين، أي داخل الحاوية. في حالتنا، نريد فقط إطلاق الحاوية بحيث يعمل كل شيء وتتدفق جذوع الأشجار مثل النهر. بالطبع، هذا رمز ثابت، لكنني لم أجد أي طرق أخرى.
علاوة على ذلك، يتم تنفيذ البرنامج النصي
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl — هذا هو ملف بيانات الاعتماد الخاص بـ Splunk Universal Forwarder، والذي يمكن تنزيله من واجهة الويب.
مكان الضغط للتحميل (بالصور)
هذا أرشيف عادي يمكن تفريغه. يوجد بالداخل شهادات وكلمة مرور للاتصال بـ SplunkCloud و Outputs.conf مع قائمة مثيلات الإدخال لدينا. سيكون هذا الملف ذا صلة حتى تقوم بإعادة تثبيت تثبيت Splunk أو إضافة عقدة إدخال إذا كان التثبيت محليًا. ولذلك فلا حرج من إضافته داخل الحاوية.
وآخر شيء هو إعادة التشغيل. نعم، لتطبيق التغييرات، تحتاج إلى إعادة تشغيله.
في لدينا المدخلات نضيف السجلات التي نريد إرسالها إلى Splunk. ليس من الضروري إضافة هذا الملف إلى الصورة، على سبيل المثال، إذا قمت بتوزيع التكوينات عبر الدمية. الشيء الوحيد هو أن معيد التوجيه يرى التكوينات عند بدء تشغيل البرنامج الخفي، وإلا فإنه سوف يحتاج ./splunk إعادة التشغيل.
ما هو نوع البرامج النصية لإحصائيات عامل الإرساء؟ يوجد حل قديم على Github من
مع البيانات التي تم الحصول عليها، يمكنك بناء ما يلي
لوحات المعلومات: (صورتان)
الكود المصدري للشرطات موجود في الرابط الموجود في نهاية المقالة. يرجى ملاحظة أن هناك حقلين محددين: 2 - اختيار الفهرس (يتم البحث فيه بواسطة القناع)، واختيار المضيف/الحاوية. ستحتاج على الأرجح إلى تحديث قناع الفهرس، اعتمادًا على الأسماء التي تستخدمها.
وفي الختام، أود أن ألفت انتباهكم إلى هذه الوظيفة بداية() в
نقطة الدخول.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-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