A Splunk egyike a legismertebb kereskedelmi naplógyűjtési és elemzési termékeknek. Még most sem, amikor Oroszországban már nem árulnak, ez nem ok arra, hogy ne írjunk utasításokat/hogyan kell ehhez a termékhez.
Feladat: rendszernaplók gyűjtése a Splunk docker csomópontjairól a gazdagép konfigurációjának megváltoztatása nélkül
A hivatalos megközelítéssel kezdeném, ami kissé furcsán néz ki a Docker használatakor.
Mi van nálunk:
1. Pullim kép
$ docker pull splunk/universalforwarder:latest
2. Indítsa el a tárolót a szükséges paraméterekkel
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
3. Bemegyünk a konténerbe
docker exec -it <container-id> /bin/bash
Ezután megkérnek bennünket, hogy menjünk a dokumentációban szereplő ismert címre.
És konfigurálja a tárolót az indulás után:
./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart
Várjon. Mit?
De a meglepetések ezzel még nem érnek véget. Ha a tárolót a hivatalos képből interaktív módban futtatja, a következőket fogja látni:
Egy kis csalódás
$ 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 *********
ну и так далее...
Nagy. A kép még műtárgyat sem tartalmaz. Vagyis minden indításkor időbe telik az archívum letöltése binárisokkal, kicsomagolás és konfigurálás.
Mi a helyzet a docker-way-vel és mindennel?
Nem köszönöm. Más utat választunk. Mi van, ha mindezeket a műveleteket az összeszerelés szakaszában végezzük el? Akkor gyerünk!
Hogy ne késlekedjen túl sokáig, azonnal megmutatom a végső képet:
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" ]
Tehát mi van benne
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
Az első indításkor a Splunk kéri, hogy adjon meg egy bejelentkezési nevet/jelszót, DE ezeket az adatokat használják csak az adott telepítéshez, azaz a tárolón belüli adminisztrációs parancsok végrehajtásához. A mi esetünkben csak a konténert akarjuk elindítani, hogy minden működjön, és a rönkök úgy folyjanak, mint a folyó. Természetesen ez kemény kód, de nem találtam más módot.
A továbbiakban a forgatókönyv szerint végrehajtódik
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl — Ez a Splunk Universal Forwarder hitelesítő fájlja, amely letölthető a webes felületről.
Hová kell kattintani a letöltéshez (a képeken)
Ez egy normál archívum, amely kicsomagolható. A belsejében tanúsítványok és jelszó találhatók a SplunkCloud-hoz és a SplunkCloud-hoz való csatlakozáshoz outputs.conf bemeneti példányaink listájával. Ez a fájl mindaddig releváns lesz, amíg újra nem telepíti a Splunk-telepítést, vagy nem ad hozzá egy bemeneti csomópontot, ha a telepítés helyszíni. Ezért nincs semmi baj, ha a tartályba helyezzük.
És az utolsó dolog az újraindítás. Igen, a módosítások alkalmazásához újra kell indítania.
Miénkben inputs.conf hozzáadjuk a naplókat, amelyeket el szeretnénk küldeni a Splunknak. Ezt a fájlt nem szükséges hozzáadni a képhez, ha például a konfigurációkat bábon keresztül terjeszti. Az egyetlen dolog, hogy a Forwarder látja a konfigurációkat, amikor a démon elindul, különben szüksége lesz rá ./splunk újraindítás.
Milyen docker statisztika szkriptek ezek? Van egy régi megoldás a Githubon
A kapott adatokkal a következőket építheti fel
műszerfalak: (pár kép)
A kötőjelek forráskódja a cikk végén található hivatkozásban található. Kérjük, vegye figyelembe, hogy 2 kiválasztási mező van: 1 - indexkiválasztás (maszk alapján keresve), gazdagép/tároló kiválasztása. Valószínűleg frissítenie kell az indexmaszkot, a használt nevektől függően.
Végezetül szeretném felhívni a figyelmet a funkcióra Rajt() в
belépési pont.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
}
Az én esetemben minden környezethez és minden egyes entitáshoz, legyen az egy tárolóban lévő alkalmazás vagy egy gazdagép, külön indexet használunk. Így a keresési sebesség nem csökken, ha jelentős mennyiségű adat halmozódik fel. Egy egyszerű szabályt használnak az indexek elnevezésére: _. Ezért annak érdekében, hogy a tároló univerzális legyen, a démon elindítása előtt kicseréljük szomjúság-adik helyettesítő karakter a környezet nevéhez. A környezetnév változót a környezeti változókon keresztül továbbítják. Viccesen hangzik.
Azt is érdemes megjegyezni, hogy a Splunk-ot valamiért nem befolyásolja a docker paraméter jelenléte hostname. Továbbra is makacsul küld naplókat a konténer azonosítójával a host mezőben. Megoldásként felszerelhető / Etc / hostname a gazdagépről és indításkor az indexnevekhez hasonló cseréket hajt végre.
Példa 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
Teljes
Igen, a megoldás talán nem ideális és biztosan nem mindenki számára univerzális, hiszen sok van "kemény kód". De ez alapján mindenki felépítheti a saját arculatát, és elhelyezheti a saját artifaktúrájában, ha, mint ahogy megesik, Splunk Forwarder kell a Dockerben.
referenciák:
Forrás: will.com