Splunk este unul dintre cele mai recunoscute produse comerciale pentru colectarea și analiza logurilor. Chiar și acum, când vânzările în Rusia nu mai sunt realizate, nu este un motiv să nu scriem instrucțiuni / cum să-uri pentru acest produs.
Sarcină: colectarea logurilor de sistem de la nodurile Docker în Splunk fără a schimba configurația mașinii gazdă
Aș dori să încep cu abordarea oficială, care pare puțin ciudată atunci când folosești Docker.
Ce avem:
1. Facem pull la imagine
$ docker pull splunk/universalforwarder:latest2. Pornim containerul cu parametrii necesari
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Intrați în container
docker exec -it /bin/bashApoi, ni se cere să accesăm un link cunoscut în documentație.
Și să configurăm containerul după ce a fost lansat:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Așteaptă. Ce?
Dar surprizele nu se opresc aici. Dacă lansezi containerul din imaginea oficială în modul interactiv, vei vedea următoarele:
Puțin dezamăgire
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
PLAY [Rulare provisioning-ul standard Splunk] *******************************************************************************************************************************************************************************************************
Marți 09 Aprilie 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
TASK [Colectare informații] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Marți 09 Aprilie 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
TASK [Obținerea numelui gazdei actuale] *******************************************************************************************************************************************************************************************************************
changed: [localhost]
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
Marți 09 Aprilie 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
Marți 09 Aprilie 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
Marți 09 Aprilie 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
TASK [splunk_common : Actualizare proprietar director Splunk] *****************************************************************************************************************************************************************************************
ok: [localhost]
Marți 09 Aprilie 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
Marți 09 Aprilie 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
și așa mai departe...
Excelent. În imagine nici măcar nu există un artefact. Asta înseamnă că, de fiecare dată când se pornește, se va pierde timp pentru a descărca arhiva cu binarele, a le decomprima și a le configura.
Dar cum rămâne cu docker-way și toate celelalte?
Nu, mulțumesc. Vom lua o altă direcție. Ce-ar fi dacă toate aceste operațiuni le-am efectua în etapa de construire? Haideți să începem!
Pentru a nu lungi lucrurile, voi arăta imediat imaginea finală:
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" ]Așadar, ce conține
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 eofLa prima pornire, Splunk cere să îi specifici un nume utilizator/parolă, DAR aceste date sunt folosite doar pentru a executa comenzi administrative pentru această instalare specifică, adică, în interiorul containerului. În cazul nostru, doar dorim să pornim containerul pentru ca totul să funcționeze și să curgă logurile în valuri. Desigur, este hardcodificat, dar nu am găsit alte metode.
În continuare, scriptul se execută
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Acesta este fișierul de credențiale pentru Splunk Universal Forwarder, care poate fi descărcat din interfața web.
Unde să apăsați pentru a descărca (în imagini)
Este un arhiv simplu, care poate fi dezarhivat. În interior — certificatele și parola pentru conectarea la SplunkCloud și outputs.conf cu lista instanțelor noastre de input. Acest fișier va fi valabil până când nu reinstalați instalarea dvs. Splunk sau nu adăugați noduri de input, dacă instalarea este on-premise. Așadar, nu este nimic grav dacă îl adăugați în interiorul containerului.
Și în final — restart. Da, pentru a aplica modificările, trebuie să-l reporniți.
În fișierul nostru inputs.conf adăugăm logurile pe care dorim să le trimitem la Splunk. Nu este obligatoriu să adăugați acest fișier în imagine, dacă, de exemplu, distribuiți configurațiile prin puppet. Important este ca Forwarder-ul să vadă configurațiile la pornirea demonului, altfel va fi necesar .\/splunk restart.
Ce sunt scripturile docker stats? Pe GitHub există o soluție veche de la , scripturile au fost preluate de acolo și adaptate pentru a funcționa cu versiunile actuale de Docker (ce-17.*) și Splunk (7.*).
Cu datele obținute, se pot construi astfel de
dashboar-uri: (câteva imagini)
Codul sursă al dashboard-urilor se află în repo-ul menționat la sfârșitul articolului. Vă rugăm să rețineți că există 2 câmpuri selectabile: 1 — selecția indexului (cercetate prin mască), selecția gazdei/containerului. Este posibil să trebuiască să actualizați masca indexului, în funcție de numele pe care le folosiți.
În încheiere, vreau să atrag atenția asupra funcției start() în
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
}În cazul meu, pentru fiecare mediu și fiecare entitate separată, fie că este vorba de o aplicație în container sau de o mașină gazdă, folosim un index separat. Astfel, viteza de căutare nu va avea de suferit în urma acumulării semnificative de date. Pentru denumirea indexurilor se folosește o regulă simplă: _. Așadar, pentru a face containerul universal, înlocuim înainte de a porni demonul sed-ul wildcard cu numele mediului. Variabila cu numele mediu este transmisă prin variabile de mediu. Sună amuzant.
De asemenea, merită menționat faptul că, dintr-un anumit motiv, prezența parametrului docker nu afectează Splunk. nume gazdăAcesta va continua să trimită jurnalele cu ID-ul containerului său în câmpul host. Ca soluție, se poate monta /etc/hostname de pe mașina gazdă și, la pornire, să se efectueze o înlocuire similară cu numele indexurilor.
Exemplu 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:roRezultatul
Da, este posibil ca soluția să nu fie ideală și cu siguranță nu universală pentru toți, deoarece există mult «hardcode». Dar pe baza acesteia, fiecare poate construi imaginea sa și o poate salva în propriul său artefact privat, dacă a fost nevoie, de exemplu, de un Splunk Forwarder anume în Docker.
Linkuri:
Sursa: habr.com
