Splunk är en av de mest kända kommersiella produkterna för insamling och analys av loggar. Även nu när försäljning i Ryssland inte längre förekommer, är detta ingen anledning att inte skriva instruktioner / how-to för denna produkt.
Uppgift: att samla systemloggar från Docker-noder i Splunk utan att ändra konfigurationen på värdmaskinen
Vi börjar med det officiella tillvägagångssättet, som verkar lite konstigt när man använder Docker.
Vad har vi här:
1. Dra bilden
$ docker pull splunk/universalforwarder:latest2. Starta upp containern med rätt parametrar
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Gå in i containern
docker exec -it /bin/bashDärefter uppmanas vi att gå till den välkända adressen i dokumentationen.
Och konfigurera containern efter att ha startat den:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Vänta. Vad?
Men på detta slutar inte överraskningarna. Om du startar containern från den officiella bilden i interaktivt läge, kommer du att se följande:
Lite besvikelse
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
PLAY [Kör standardkonfiguration för Splunk] *****************************************************************************************************************************************************************************************************
Tisdag 09 April 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
TASK [Samlar fakta] *********************************************************************************************************************************************************************************************************************************
ok: [localhost]
Tisdag 09 April 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
TASK [Hämta aktuell värdnamn] **********************************************************************************************************************************************************************************************************************
ändrades: [localhost]
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
TASK [set_fact] **************************************************************************************************************************************************************************************************************************************
ok: [localhost]
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
Tisdag 09 April 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
Tisdag 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 för localhost
Tisdag 09 April 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
TASK [splunk_common : Uppdatera Splunk katalogägare] *********************************************************************************************************************************************************************************************
ok: [localhost]
Tisdag 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 för localhost
Tisdag 09 April 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
och så vidare...
Utmärkt. Det finns inte ens något artefakt i bilden. Så varje gång vi kör den kommer tid att gå åt för att ladda ner arkivet med binärfiler, packa upp och konfigurera.
Men vad hände med docker-way och allt det där?
Nej, tack. Vi väljer en annan väg. Vad om vi utför alla dessa operationer under byggsteget? Låt oss köra!
För att inte dra ut på tiden, här är den slutliga bilden:
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" ]Så, vad finns i
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 eofVid första starten ber Splunk om att ange ett användarnamn/lösenord, MEN dessa uppgifter används bara för att utföra administrativa kommandon för just denna installation, det vill säga, inuti containern. I vårt fall vill vi bara starta containern så att allt fungerar och loggarna flödar. Självklart är detta hårdkod, men jag har inte hittat andra sätt.
Därefter i scenariot utförs
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Detta är kredifilen för Splunk Universal Forwarder som kan laddas ner från webbgränssnittet.
Var man trycker för att ladda ner (i bilder)
Detta är ett vanligt arkiv som kan packas upp. Inuti finns certifikat och lösenord för att ansluta till vår SplunkCloud och outputs.conf med en lista över våra input-instansar. Denna fil kommer att vara aktuell tills du installerar om din Splunk-installation eller lägger till input-noder, om installationen är on-premise. Så det är inget att oroa sig för att lägga in den i containern.
Och det sista — restart. Ja, för att tillämpa ändringarna måste det startas om.
I vår inputs.conf lägger vi till loggar som vi vill skicka till Splunk. Det är inte nödvändigt att lägga till denna fil i bilden, om du till exempel distribuerar konfigurationer via puppet. Det främsta är att Forwardern ser konfigurationerna vid demonens start, annars kommer det att behövas .\/splunk restart.
Och vad är docker stats-skripten? Det finns en gammal lösning på GitHub från , skripten är tagna därifrån och har vidareutvecklats för att fungera med aktuella versioner av Docker (ce-17.*) och Splunk (7.*).
Med de erhållna uppgifterna kan man bygga sådana
dashboardar: (ett par bilder)
Källkoden för dashboards ligger i repot som anges i slutet av artikeln. Observera att det finns 2 valfält: 1 — valet av index (de söks efter mönster), valet av värd/container. Mönstret för indexet kommer du troligen att behöva uppdatera, beroende på namnen du använder.
Till sist vill jag påpeka funktionen start() på
entrypoint.sh
start() {
trap teardown EXIT
if [ -z $SPLUNK_INDEX ]; then
echo "'SPLUNK_INDEX' miljövariabel är tom eller inte definierad. Ska vara 'dev' eller '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 'startar' > /tmp/splunk-container.state"
${SPLUNK_HOME}/bin/splunk start
watch_for_failure
}I mitt fall använder vi en separat index för varje miljö och varje enskild enhet, oavsett om det är en applikation i containern eller en värdmaskin. Så kommer inte sökhastigheten att påverkas vid betydande datainsamling. För namngivning av index används en enkel regel: _. Så för att containern ska vara universell, ersätter vi innan demon startas sed-wildcard med miljöns namn. Variabeln med miljöns namn överförs via miljövariabler. Det låter roligt.
Det är också värt att notera att av någon anledning påverkas inte Splunk av förekomsten av docker-parametern. hostnameDen kommer fortfarande att skicka loggar med id:t för sin container i fältet host. Som en lösning kan man montera /etc/hostname från värdmaskinen och vid start göra en ersättning, liknande namn på index.
Exempel på 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:roResultat
Ja, det kan hända att lösningen inte är perfekt och definitivt inte universell för alla, eftersom det finns mycket «hård kod». Men baserat på detta kan alla skapa sin egen bild och lagra den i sin privata artifact-repo, ifall ni, av en händelse, behöver Splunk Forwarder just i Docker.
Länkar:
Källa: habr.com
