„Splunk“ yra vienas iš kelių labiausiai atpažįstamų komercinių rąstų rinkimo ir analizės produktų. Net ir dabar, kai Rusijoje nebeparduodama, tai nėra priežastis nerašyti šio produkto instrukcijų/kaip.
Užduotis: rinkti sistemos žurnalus iš „Splunk“ doko mazgų nekeičiant pagrindinio kompiuterio konfigūracijos
Norėčiau pradėti nuo oficialaus požiūrio, kuris atrodo šiek tiek keistas naudojant „Docker“.
Ką mes turime:
1. Pullim vaizdas
$ docker pull splunk/universalforwarder:latest
2. Paleiskite konteinerį su reikiamais parametrais
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
3. Einame į konteinerį
docker exec -it <container-id> /bin/bash
Tada mūsų prašoma kreiptis į žinomą dokumentuose nurodytą adresą.
Ir sukonfigūruokite konteinerį jam prasidėjus:
./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart
Laukti. Ką?
Tačiau netikėtumai tuo nesibaigia. Jei paleidžiate konteinerį iš oficialaus vaizdo interaktyviuoju režimu, pamatysite:
Truputis nusivylimas
$ 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 *********
ну и так далее...
Puiku. Nuotraukoje net nėra artefakto. Tai reiškia, kad kiekvieną kartą paleidus užtruks, kol atsisiųsite archyvą su dvejetainiais failais, išpakuosite ir sukonfigūruosite.
O kaip su Docker-way ir visa kita?
Ne, ačiū. Eisime kitu maršrutu. Ką daryti, jei visas šias operacijas atliksime surinkimo etape? Tada eime!
Kad nedelsčiau per ilgai, iš karto parodysiu galutinį vaizdą:
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" ]
Taigi, kas yra įtraukta į
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
Pirmą kartą paleidus Splunk prašo duoti prisijungimo vardą/slaptažodį, BET šie duomenys naudojami tik vykdyti administracines komandas tam konkrečiam diegimui, tai yra konteinerio viduje. Mūsų atveju tiesiog norime paleisti konteinerį, kad viskas veiktų ir rąstai tekėtų kaip upė. Žinoma, tai yra griežtas kodas, bet aš neradau jokių kitų būdų.
Toliau vykdomas pagal scenarijų
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl — Tai yra „Splunk Universal Forwarder“ kredencialų failas, kurį galima atsisiųsti iš žiniatinklio sąsajos.
Kur spustelėti atsisiųsti (nuotraukose)
Tai įprastas archyvas, kurį galima išpakuoti. Viduje yra sertifikatai ir slaptažodis, skirtas prisijungti prie mūsų SplunkCloud ir išėjimai.conf su mūsų įvesties atvejų sąrašu. Šis failas bus aktualus, kol iš naujo neįdiegsite „Splunk“ diegimo arba pridėsite įvesties mazgą, jei įdiegsite vietoje. Todėl nėra nieko blogo įdėti jį į konteinerį.
Ir paskutinis dalykas yra paleisti iš naujo. Taip, norėdami pritaikyti pakeitimus, turite jį paleisti iš naujo.
Mūsų inputs.conf pridedame žurnalus, kuriuos norime siųsti į „Splunk“. Nebūtina pridėti šio failo prie vaizdo, jei, pavyzdžiui, platinate konfigūracijas per lėlę. Vienintelis dalykas yra tai, kad Forwarder mato konfigūracijas, kai demonas prasideda, kitaip reikės ./splunk paleisti iš naujo.
Kokie tai yra docker statistikos scenarijai? „Github“ yra senas sprendimas
Naudodami gautus duomenis galite sukurti šiuos dalykus
prietaisų skydeliai: (pora nuotraukų)
Brūkšnelių šaltinio kodas yra nuorodoje, pateiktoje straipsnio pabaigoje. Atkreipkite dėmesį, kad yra 2 pasirinkimo laukai: 1 - indekso pasirinkimas (ieškoma pagal kaukę), pagrindinio kompiuterio / sudėtinio rodinio pasirinkimas. Tikriausiai turėsite atnaujinti indekso kaukę, atsižvelgiant į naudojamus pavadinimus.
Baigdamas norėčiau atkreipti jūsų dėmesį į funkciją pradžia () в
įėjimo taškas.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
}
Mano atveju kiekvienai aplinkai ir kiekvienam atskiram objektui, nesvarbu, ar tai būtų konteineryje esanti programa, ar pagrindiniame kompiuteryje, naudojame atskirą indeksą. Tokiu būdu paieškos greitis nenukentės, kai bus daug duomenų. Indeksams pavadinti naudojama paprasta taisyklė: _. Todėl, norėdami, kad konteineris būtų universalus, prieš paleisdami patį demoną pakeičiame troškulys- aplinkos pavadinimo pakaitos simbolis. Aplinkos pavadinimo kintamasis perduodamas per aplinkos kintamuosius. Skamba juokingai.
Taip pat verta paminėti, kad dėl tam tikrų priežasčių „Splunk“ neturi įtakos dokerio parametro buvimas hostname. Jis vis tiek atkakliai siųs žurnalus su savo konteinerio identifikatoriumi priimančiojo lauke. Kaip sprendimą galite montuoti / etc / hostname iš pagrindinio kompiuterio ir paleidžiant atlikti pakeitimus, panašius į indekso pavadinimus.
Docker-compose.yml pavyzdys
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
Visas
Taip, galbūt sprendimas nėra idealus ir tikrai ne visiems universalus, nes jų yra daug "kietasis kodas". Bet remdamasis juo, kiekvienas gali susikurti savo įvaizdį ir įdėti jį į savo asmeninį artefaktūrą, jei, kaip nutinka, jums reikia „Splunk Forwarder“ programoje „Docker“.
Nuorodos:
Šaltinis: www.habr.com