A Splunk egyike a legjobban ismert kereskedelmi termékeknek a naplók gyűjtésére és elemzésére. Még most is, amikor Oroszországban már nem forgalmazzák, ez nem ok arra, hogy ne írjunk útmutatókat e termékhez.
Feladat: rendszernaplók gyűjtése docker node-okról a Splunkban a hosztgép konfigurációjának megváltoztatása nélkül
Kezdeném azzal a hivatalos megközelítéssel, amely a Docker használatakor kissé furcsának tűnik.
Mit is látunk:
1. Letöltjük a képet
$ docker pull splunk/universalforwarder:latest2. Elindítjuk a konténert a szükséges paraméterekkel
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Belépünk a konténerbe
docker exec -it /bin/bashEzután arra kérnek minket, hogy egy ismert címen átmenjünk a dokumentációra.
És konfigurálnunk kell a konténert a futtatása után:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Várj. Mi?
De a meglepetések itt még nem értek véget. Ha interaktív módban indítod el a hivatalos képből a konténert, a következőket látod:
Egy kis csalódás
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
JÁTÉK [Alapértelmezett Splunk előkészítés futtatása] *******************************************************************************************************************************************************************************************************
2019. április 9., kedd 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
TASK [Tények összegyűjtése] ***********************************************************************************************************************************************************************************************************************
rendben: [localhost]
2019. április 9., kedd 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
TASK [Aktuális hosztnév megszerzése] *******************************************************************************************************************************************************************************************************************
változtatva: [localhost]
2019. április 9., kedd 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
2019. április 9., kedd 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
TASK [tényező beállítása] ******************************************************************************************************************************************************************************************************************************
endben: [localhost]
2019. április 9., kedd 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
2019. április 9., kedd 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
2019. április 9., kedd 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
2019. április 9., kedd 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
2019. április 9., kedd 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
2019. április 9., kedd 13:40:41 +0000 (0:00:00.216) 0:00:02.798 *********
bemutatva: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml localhost számára
2019. április 9., kedd 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
TASK [splunk_common : Splunk könyvtár tulajdonosának frissítése] *****************************************************************************************************************************************************************************************
rendben: [localhost]
2019. április 9., kedd 13:40:41 +0000 (0:00:00.324) 0:00:03.210 *********
bemutatva: /opt/ansible/roles/splunk_common/tasks/get_facts.yml localhost számára
2019. április 9., kedd 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
nos, és így tovább...
Nagyszerű. A képen még artefaktum sincs. Tehát, minden egyes alkalommal, amikor futtatni fogjuk, időt fogunk pazarolni, hogy letöltsük az archívumot a bináris fájlokkal, kicsomagoljuk és beállítjuk.
De mi van a docker-way-jel és hasonlókkal?
Nem, köszönöm. Más úton fogunk haladni. Mi van, ha mindezeket a műveleteket a build szakaszban hajtjuk végre? Akkor lássuk!
Hogy ne húzzuk az időt, 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 található a
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 eofAz első indításkor a Splunk megkéri, hogy adjon meg egy felhasználónevet/jelszót, DE ezek az adatok arra szolgálnak a fő DB példányhoz ennek a konkrét telepítésnek az adminisztrációs parancsainak végrehajtására, vagyis a konténeren belül. Az esetünkben csak annyit szeretnénk, hogy elinduljon a konténer és az összes napló folyamatosan áramoljon. Nyilván ez hardcode, de más módszert nem találtam.
A forgatókönyv következő lépése a következő
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Ez a fájl a Splunk Universal Forwarder hitelesítő adatai, amelyeket a webes felületről lehet letölteni.
Hová kell kattintani a letöltéshez (képekben)
Ez egy normál archívum, amely kicsomagolható. Benne találhatóak a tanúsítványok és a jelszó a SplunkCloudhoz való csatlakozáshoz, valamint outputs.conf a bemeneti példányaink listájával. Ez a fájl érvényes marad, amíg újratelepíti a Splunk telepítését, vagy nem ad hozzá bemeneti csomópontokat, ha a telepítés helyben van. Ezért nem kell megijedni, ha be akarja rakni a konténerbe.
És az utolsó — újraindítás. Igen, a változtatások alkalmazásához újra kell indítani.
A mi inputs.conf fájlunkba hozzáadjuk a naplókat, amelyeket a Splunkba szeretnénk küldeni. Nem szükséges ezt a fájlt a képre tenni, ha például puppet-en keresztül terjeszti a konfigurációkat. Az a fontos, hogy a Forwarder lássa a konfigurációkat, amikor elindul a démon, különben szüksége lesz ./splunk restart.
Mik azok a docker stats szkriptek? A GitHubon van egy régi megoldás -tól, a szkriptek onnan lettek véve és átírták, hogy működjenek a legújabb Docker (ce-17.*) és Splunk (7.*) verziókkal.
A megkapott adatokból ilyen
mérőpultokat lehet készíteni: (pár kép)
A mérőpultok forráskódja a cikk végén megadott repo-ban található. Ne felejtse el, hogy két kiválasztó mező található: 1 — az index kiválasztása (maszk alapján keresnek), a hoszt/konténer kiválasztása. Valószínűleg frissítenie kell az index maszkját a használt nevek függvényében.
Végezetül szeretném felhívni a figyelmet a start() be.
entrypoint.sh
start() {
trap teardown EXIT
if [ -z $SPLUNK_INDEX ]; then
echo "'SPLUNK_INDEX' környezeti változó üres vagy nincs definiálva. 'dev' vagy 'prd' kell, hogy legyen." >&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 'indítás' > /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 alkalmazás egy konténerben vagy a gazdagép, külön indexet használunk. Így nem szenved a keresési sebesség jelentős adathalmozódás esetén. Az indexek elnevezésében egy egyszerű szabályt alkalmazunk: _. Ezért, hogy a konténer univerzális legyen, a démon közvetlen indítása előtt kicseréljük sed-om wildcard-ot a környezeti névre. A környezeti név változóként van átadva. Érdekesnek hangzik.
Érdemes megjegyezni, hogy valami miatt a Docker paraméter nem befolyásolja a Splunk működését hosztnév. Az továbbra is folyamatosan küldi a konténerének az ID-ját a host mezőbe. Megoldásként lehet csatolni /etc/hostname a gazdagépről, és indításkor egy hasonló nevet cserélni, mint az indexek nevei.
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:roResult
Igen, lehet, hogy a megoldás nem tökéletes, és biztosan nem univerzális mindenki számára, mivel sok „hardcode”. De ezen alapulva mindenki összeállíthatja a saját képmását, és elhelyezheti a saját privát artefaktum tárolójában, ha szükséges a Splunk Forwarder pontosan Dockerben.
Linkek:
Forrás: habr.com
