Splunk je jedan od nekoliko najpoznatijih komercijalnih proizvoda za prikupljanje i analizu logova. Čak i sada, kada se prodaja u Rusiji više ne obavlja, to nije razlog da ne pišemo upute/how-to za ovaj proizvod.
Zadatak: prikupljanje sistemskih logova s docker čvorova u Splunk bez mijenjanja konfiguracije host-mašine
Započeti bismo s službenim pristupom, koji izgleda pomalo čudno pri korištenju dockera.
Što imamo:
1. Povlačimo sliku
$ docker pull splunk/universalforwarder:latest2. Pokrećemo kontejner s potrebnim parametrima
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Ulazimo u kontejner
docker exec -it /bin/bashNakon toga, traži nas da odemo na poznatu adresu u dokumentaciju.
I konfiguriramo kontejner nakon njegovog pokretanja:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Čekajte. Što?
No, tu iznenađenja ne završavaju. Ako pokrenete kontejner iz službene slike u interaktivnom režimu, vidjet ćete sljedeće:
Malo razočaranje
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
PLAY [Pokreni zadani Splunk provisioning] *******************************************************************************************************************************************************************************************************
Utorak 09. travnja 2019. 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
TASK [Prikupljanje podataka] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorak 09. travnja 2019. 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
TASK [Dohvati actual hostname] *******************************************************************************************************************************************************************************************************************
promijenjeno: [localhost]
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
Utorak 09. travnja 2019. 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
Utorak 09. travnja 2019. 13:40:41 +0000 (0:00:00.216) 0:00:02.798 *********
uključeno: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml za localhost
Utorak 09. travnja 2019. 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
TASK [splunk_common : Ažuriraj vlasnika Splunk direktorija] *****************************************************************************************************************************************************************************************
ok: [localhost]
Utorak 09. travnja 2019. 13:40:41 +0000 (0:00:00.324) 0:00:03.210 *********
uključeno: /opt/ansible/roles/splunk_common/tasks/get_facts.yml za localhost
Utorak 09. travnja 2019. 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
i tako dalje...
Odlično. U slici čak nema artefakta. To znači da će svaki put prilikom pokretanja biti potrebno vremena da se preuzme arhiva s binarnim datotekama, raspakira i konfigurira.
A kako je s docker-way i sličnim stvarima?
Ne, hvala. Ići ćemo drugim putem. Što ako sve te operacije izvršimo u fazi izgradnje? Krenimo!
Da ne bi previše odugovlačili, odmah ću pokazati konačnu sliku:
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" ]Dakle, što se nalazi u
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 eofPrilikom prvog pokretanja, Splunk traži da postavite korisničko ime/lozinku, NO ti podaci se koriste samo za izvršavanje administrativnih komandi ove konkretne instalacije, dakle, unutar kontejnera. U našem slučaju, samo želimo pokrenuti kontejner tako da sve radi i logovi teku u obilju. Naravno, to je hardkodirano, ali nisam našao druge načine.
Dalje, u scenariju se izvršava
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — To je datoteka s vjerodajnicama za Splunk Universal Forwarder koju možete preuzeti putem web sučelja.
Na što kliknuti za preuzimanje (na slikama)
To je obična arhiva koju možete raspakirati. Unutra se nalaze certifikati i lozinka za povezivanje s našim SplunkCloudom i outputs.conf popis naših input instanci. Ova datoteka bit će aktualna dok ne reinstalirate svoju instalaciju Splunka ili ne dodate input čvorove ako je instalacija na lokalnom serveru. Stoga nije ništa strašno dodati je unutar kontejnera.
I posljednje — restart. Da, za primjenu promjena, potrebno je restartati.
U naš inputs.conf dodajemo logove koje želimo slati u Splunk. Nije obavezno dodavati ovu datoteku u sliku, ako, na primjer, konfiguracije distribuirate putem puppeta. Važno je samo da Forwarder vidi konfiguracije prilikom pokretanja demona, inače će vam trebati .\/splunk restart.
A što su to docker stats skripte? Na GitHubu postoji staro rješenje od , skripte su preuzete odatle i prilagođene za rad s aktualnim verzijama Dockera (ce-17.*) i Splunka (7.*).
S dobivenim podacima možete izraditi takve
nadzorne ploče: (par slika)
Izvorni kod nadzora nalazi se u repozitoriju navedenom na kraju članka. Obratite pažnju da postoje 2 select polja: 1 — odabir indeksa (pretražuje se prema maski), odabir hosta/kontejnera. Maska indeksa će vjerojatno trebati ažurirati, ovisno o nazivima koje koristite.
Na kraju, želim skrenuti pozornost na funkciju start() u
entrypoint.sh
start() {
trap teardown EXIT
if [ -z $SPLUNK_INDEX ]; then
echo "'SPLUNK_INDEX' varijabla okruženja je prazna ili nije definirana. Trebala bi biti 'dev' ili '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 'pokreće se' > /tmp/splunk-container.state"
${SPLUNK_HOME}/bin/splunk start
watch_for_failure
}U mom slučaju, za svako okruženje i svaku pojedinačnu jedinicu, bilo da se radi o aplikaciji u kontejneru ili host-mašini, koristimo odvojeni indeks. Tako se brzina pretraživanja neće smanjiti prilikom značajnog nakupljanja podataka. Za imenovanje indeksa koristi se jednostavno pravilo: _. Stoga, kako bi kontejner bio univerzalan, prije nego što pokrenemo samog demona, zamjenjujemo sed-om wildcard s imenom okruženja. Varijabla s imenom okruženja proslijeđuje se putem varijabli okruženja. Zvuči zabavno.
Također, valja istaknuti da iz nekog razloga na Splunk ne utječe postojanje docker parametra hostname. On će i dalje slati logove s ID-om svog kontejnere u polje host. Kao rješenje, moguće je montirati /etc/hostname s host-mašine i pri pokretanju izvršiti zamjenu, sličnu imenima indeksa.
Primjer 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:roZaključak
Da, moguće je da rješenje nije idealno i zasigurno nije univerzalno za sve, jer ima puno hardkoda. No, na temelju njega svatko može sastaviti svoj image i staviti ga u svoj privatni artefaktor, ako vam je, tako se dogodilo, potreban Splunk Forwarder baš u dockeru.
Linkovi:
Izvor: habr.com
