Splunk on üks väheseid enim tuntud kommertstooteid logide kogumiseks ja analüüsimiseks. Isegi nüüd, kui Venemaal enam müüki ei toimu, ei ole see põhjus mitte kirjutada selle toote jaoks juhendeid/õpetusi.
Ülesanne: koguda süsteemi logisid docker node'idest Splunk'i ilma host-masina konfiguratsiooni muutmata
Alustaksin ametliku lähenemisega, mis dockerit kasutades tundub veidi kummaline.
Mida meil on:
1. Tõmbame pildi
$ docker pull splunk/universalforwarder:latest2. Käivitame konteineri vajalike parameetritega
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Siseneme konteinerisse
docker exec -it /bin/bashEdasi palutakse meil minna tuntud aadressile dokumentatsiooni.
Ja konfigureerida konteiner pärast selle käivitamist:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Oota. Mis?
Aga sellega üllatused ei lõpe. Kui käitate konteinerit ametlikust pildist interaktiivses režiimis, näete järgmist:
Veidi pettumust
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
MÄNG [Käivita vaike Splunki seadistus] *******************************************************************************************************************************************************************************************************
Teisipäev, 09. aprill 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
ÜLESANNE [Faktide kogumine] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Teisipäev, 09. aprill 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
ÜLESANNE [Hangi tegelik hostinimi] *******************************************************************************************************************************************************************************************************************
muudetud: [localhost]
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
ÜLESANNE [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
Teisipäev, 09. aprill 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
Teisipäev, 09. aprill 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
Teisipäev, 09. aprill 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
ÜLESANNE [splunk_common : Uuenda Splunki kaustade omanik] *****************************************************************************************************************************************************************************************
ok: [localhost]
Teisipäev, 09. aprill 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
Teisipäev, 09. aprill 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
ja nii edasi...
Suurepärane. Pildil ei ole isegi artefakte. See tähendab, et iga kord, kui alustate, kulub aega arhivi allalaadimiseks, faili dekompresseerimiseks ja seadistamiseks.
Aga kuidas on docker-way ja kõik muu?
Ei, aitäh. Me läheme teist teed. Mis siis, kui teeme kõik need toimingud ehitusetapis? Siis lähme!
Et mitte aega raisata, näitan kohe lõplikku pilti:
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" ]Nii, mis on sees
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 eofEsimese käivitamise korral palub Splunk seadistada kasutajanime/parooli, KUID neid andmeid kasutatakse seda selle konkreetse installatsiooni halduskäskude täitmiseks, st konteineri sees. Meie juhul tahame lihtsalt konteinerit käivitada, et kõik töötaks ja logid voolaksid. Muidugi on see hardcode, aga ma ei leidnud muid võimalusi.
Tüübi kohaselt jätkatakse
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — See on Splunk Universal Forwarderi jaoks mõeldud krediidifail, mille saab alla laadida veebiliidese kaudu.
Kuhu klõpsata, et alla laadida (piltidel)
See on tavaline arhiiv, mille saab lahti pakkida. Sees on sertifikaadid ja parool meie SplunkCloudi ühendamiseks ja outputs.conf meie input-instantide nimekirjaga. See fail on kehtiv seni, kuni te ei reinstalli oma Splunki või ei lisa input-nodesid, juhul kui installatsioon on kohaliku serveri peal. Seega ei ole midagi hullu selles, et lisada see konteinerisse.
Ja viimane — restart. Jah, muudatuste rakendamiseks tuleb see taaskäivitada.
Meie inputs.conf lisame logid, mida soovime Splunkisse edastada. Ei ole kohustuslik seda faili pildile lisada, kui näiteks jagate konfigureerimist puppet'i kaudu. Peamine on, et Forwarder näeks konfigureerimist, kui daemon käivitub, vastasel juhul on vajalik .\/splunk restart.
Mis skriptid on docker stats? Githubis on olemas vana lahendus , need skriptid on sealt võetud ja kohandatud, et töötada uusimate versioonidega Docker (ce-17.*) ja Splunk (7.*).
Saadud andmete põhjal saab luua selliseid
juhtpaneele: (paar pilti)
Algsed koodid juhte jaoks on salvestatud artikli lõpus märgitud repo's. Pange tähele, et seal on 2 valikuvälja: 1 — indeksi valik (otsitakse mustri järgi), hosti/konteineri valik. Indeksi mustrit tuleb tõenäoliselt uuendada, sõltuvalt nimedest, mida kasutate.
Kokkuvõtteks tahan tähelepanu juhtida funktsioonile start() ja
entrypoint.sh
start() {
trap teardown EXIT
if [ -z $SPLUNK_INDEX ]; then
echo "'SPLUNK_INDEX' keskkonna muutuja on tühi või pole määratud. Peaks olema 'dev' või '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
}Minu puhul kasutame iga keskkonna ja iga eraldi üksuse jaoks, olgu see rakendus konteineris või host-masin, eraldi indeksit. See ei hävita otsingu kiirus, kui andmeid koguneb. Indeksite nimetamiseks kasutatakse lihtsat reeglit: <environment_name>_<service/application/etc>. Seega, et konteiner oleks universaalne, asendame enne deemonit käivitamist sed- wildcardi keskkonna nimega. Muutujat keskkonna nime kohta edastatakse keskkonna muutujate kaudu. Kõlab lõbusalt.
Samuti tasub märkida, et mingil põhjusel ei mõjuta Splunkile docker parameetri olemasolu hostname. See saadab ikkagi jõhkralt oma konteineri id logisid välja valdkonnas host. Lahenduseks võib olla /etc/hostname konteinerite hostmasinast mount'imine ja käivitamisel sarnaste nimede asendamine, sarnaselt indikaatorite nimetusele.
Näide 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:roKokkuvõte
Jah, lahendus ei pruugi olla ideaalne ja kindlasti mitte universaalne, kuna olemas on palju "karmkoodi". Kuid selle põhjal võib igaüks luua oma pildi ja salvestada selle oma privaatse artefakti ehk, kui just juhtumisi on teil vaja Splunk Forwarderit Dockeris.
Lingid:
Allikas: habr.com
