Splunk is een van de meest herkenbare commerciële producten voor het verzamelen en analyseren van logs. Ook al vindt de verkoop in Rusland niet meer plaats, is dit geen reden om geen gebruiksaanwijzing/handleiding voor dit product te schrijven.
Taak: verzamel systeemlogboeken van docker-knooppunten in Splunk zonder de configuratie van de hostmachine te wijzigen
Ik wil beginnen met de officiële aanpak, die er vreemd uitziet bij het gebruik van Docker.
Dus wat hebben we:
1. Pullim-afbeelding
$ docker pull splunk/universalforwarder:latest2. Start de container met de vereiste parameters
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest3. Ga de container in
docker exec -it <container-id> /bin/bashVervolgens wordt ons gevraagd om naar een bekend adres voor de documentatie te gaan.
En configureer de container nadat deze is gestart:
./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart
Wachten. Wat?
Maar de verrassingen eindigen daar niet. Als u een container uitvoert vanuit de officiële image in de interactieve modus, ziet u het volgende:
Een beetje teleurstelling
$ 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 *********
ну и так далее...
Geweldig. Er is zelfs geen enkel artefact te zien in de afbeelding. Dat wil zeggen dat elke keer dat u het programma opstart, er tijd verloren gaat aan het downloaden van het archief met de binaire bestanden, het uitpakken ervan en het installeren ervan.
Hoe zit het met docker-way en dat soort dingen?
Nee bedankt. Wij gaan een andere weg. Wat als we al deze handelingen in de assemblagefase uitvoeren? Nou, laten we gaan!
Om te voorkomen dat het allemaal wat langer duurt, laat ik je meteen het eindresultaat zien:
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" ]Dus wat zit er in
eerste_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 eofWanneer u Splunk voor het eerst start, wordt u gevraagd een login/wachtwoord in te stellen, MAAR deze gegevens worden gebruikt alleen om beheeropdrachten uit te voeren voor deze specifieke installatie, dat wil zeggen binnen de container. In ons geval willen we de container gewoon lanceren, zodat alles werkt en de boomstammen als een rivier stromen. Natuurlijk is dit hardcode, maar ik heb geen andere manieren gevonden.
Vervolgens wordt, afhankelijk van het scenario, het volgende gedaan:
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl - Dit is een Splunk Universal Forwarder-referentiebestand dat kan worden gedownload via de webinterface.
Waar te klikken om te downloaden (in afbeeldingen)
Dit is een regulier archief dat kan worden uitgepakt. Binnenin bevinden zich certificaten en een wachtwoord om verbinding te maken met onze SplunkCloud en outputs.conf met een lijst van onze invoerinstanties. Dit bestand blijft geldig totdat u uw Splunk-installatie opnieuw installeert of een invoerknooppunt toevoegt als de installatie on-premise is. Er is dus helemaal niets mis mee om het in de container te doen.
En als laatste: opnieuw opstarten. Ja, om de wijzigingen toe te passen, moet u het programma opnieuw opstarten.
In onze inputs.conf Voeg de logs toe die we naar Splunk willen sturen. Het is niet nodig om dit bestand aan de afbeelding toe te voegen als u bijvoorbeeld configuraties via Puppet verspreidt. Het belangrijkste is dat Forwarder de configuraties ziet bij het starten van de daemon, anders is het nodig ./splunk opnieuw opstarten.
Wat zijn docker stats-scripts? Er is een oude oplossing op GitHub van De scripts zijn daarvandaan gehaald en aangepast zodat ze werken met de huidige versies van Docker (ce-17.*) en Splunk (7.*).
Met de verkregen gegevens kunt u het volgende bouwen
dashboards: (een paar foto's)
De broncode voor dashes staat in de repository die aan het einde van het artikel staat vermeld. Houd er rekening mee dat er twee selectievelden zijn: 2 - indexselectie (zoeken op masker), host-/containerselectie. Afhankelijk van de namen die u gebruikt, moet u waarschijnlijk het indexmasker bijwerken.
Tot slot wil ik de aandacht vestigen op de functie begin() в
toegangspunt.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
}In mijn geval gebruiken we voor elke omgeving en elke afzonderlijke entiteit, of het nu een containertoepassing of een hostmachine is, een aparte index. Op deze manier wordt de zoeksnelheid niet verlaagd als er een grote hoeveelheid gegevens wordt verzameld. Er wordt een eenvoudige regel gebruikt om indexen te benoemen: _. Om de container universeel te maken, vervangen we daarom, voordat we de daemon zelf starten, dorst-om wildcard voor de naam van de omgeving. Een variabele met de omgevingsnaam wordt doorgegeven via omgevingsvariabelen. Klinkt grappig.
Het is ook de moeite waard om op te merken dat Splunk om een of andere reden niet wordt beïnvloed door de aanwezigheid van de docker-parameter hostname. Het blijft hardnekkig logs versturen met de id van de container in het hostveld. Als oplossing kunt u monteren / Etc / hostnaam van de hostmachine en maak bij het opstarten een vervanging die lijkt op de indexnamen.
Voorbeeld 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:roTotaal
Ja, misschien is de oplossing niet ideaal en zeker niet universeel voor iedereen, aangezien er veel "hard coderen". Maar op basis hiervan kan iedereen een eigen image bouwen en deze in zijn eigen privé-artefact plaatsen, mocht je bijvoorbeeld Splunk Forwarder in Docker nodig hebben.
referenties:
Bron: www.habr.com
