Splunk Universal Forwarder у докеры як зборшчык сістэмных логаў

Splunk Universal Forwarder у докеры як зборшчык сістэмных логаў

Splunk з'яўляецца адным з некалькіх найбольш вядомых камерцыйных прадуктаў для збору і аналізу логаў. Нават цяпер, калі продажы ў Расіі больш не вырабляюцца, гэта не нагода не пісаць інструкцыі/how-to па гэтым прадукце.

Задача: збіраць сістэмныя логі з docker нод у Splunk не змяняючы канфігурацыю хост-машыны

Пачаць хацелася б з афіцыйнага падыходу, які выглядае дзіўным пры выкарыстанні докера.
Спасылка на 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 і ўсё такое?

Не Дзякуй. Мы пойдзем іншым шляхам. Што, калі ўсе гэтыя аперацыі мы выканаем на этапе зборкі? Тады паехалі!

Каб доўга не цягнуць, пакажу адразу выніковую выяву:

Докер-файл

# Тут у кого какие предпочтения
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 у докеры як зборшчык сістэмных логаў

Splunk Universal Forwarder у докеры як зборшчык сістэмных логаў
Гэта звычайны архіў, які можна распакаваць. Унутры – сертыфікаты і пароль для падлучэння да нашага SplunkCloud і outputs.conf са спісам нашых input інстансаў. Гэты файл будзе актуальны датуль, пакуль вы не пераўсталюеце сваю ўсталёўку Splunk ці не дадасце input нод, калі ўсталёўка on-premise. Таму нічога страшнага няма ў тым, каб дадаць яго ўнутр кантэйнера.

І апошняе - restart. Так, для ўжывання змен, трэба яго рэстартануць.

У наш inputs.conf дадаем логі, якія мы хочам адпраўляць у Splunk. Неабавязкова дадаваць гэты файл у выяву, калі вы, да прыкладу, раскідваеце канфігі праз puppet. Галоўнае толькі ў тым, каб Forwarder бачыў канфігі, пры старце дэмана, інакш будзе патрэбен. ./splunk restart.

А што за docker stats скрыпты? На гітхабе ёсць старое рашэнне ад outcoldman, скрыпты ўзяты адтуль і дапрацаваны для працы з актуальнымі версіямі Docker (ce-17.*) і Splunk (7.*).

З атрыманымі дадзенымі можна будаваць такія

дэшборды: (пара карцінак)Splunk Universal Forwarder у докеры як зборшчык сістэмных логаў

Splunk Universal Forwarder у докеры як зборшчык сістэмных логаў
Зыходны код дэшэй ляжыць у рэпе, указанай у канцы артыкула. Звярніце ўвагу, што там прысутнічае 2 select палі: 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
}

У маім выпадку, для кожнага асяроддзя і кожнай асобнай сутнасці, няхай гэта будзе прыкладанне ў кантэйнеры або хост-машына, мы выкарыстоўваем асобны індэкс. Так не будзе цярпець хуткасць пошуку пры значным назапашванні дадзеных. Для наймення індэксаў выкарыстоўваецца простае правіла: _. Таму, каб кантэйнер быў універсальным, мы перад запускам непасрэдна дэмана, заменны sed-ым wildcard на імя акружэння. Пераменная з імем акружэння перадаецца праз зменныя асяроддзі. Гучыць пацешна.

Таксама варта адзначыць момант, што па нейкім чынніку на Splunk не ўплывае наяўнасць docker параметру імя хаста. Ён усё роўна будзе зацята слаць логі з id свайго кантэйнера ў поле host. Як рашэнне, можна мантаваць / І г.д. / імя хаста з хост-машыны і пры старце рабіць замену, аналагічную імёнам азначнікаў.

Прыклад 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 менавіта ў докеры.

спасылкі:

Рашэнне з артыкула
Рашэнне ад outcoldman натхнёнае перавыкарыстоўваць частку функцыяналу
Оф. дакументацыя па наладзе Universal Forwarder

Крыніца: habr.com

Дадаць каментар