Splunk är en av flera av de mest kända kommersiella stockinsamlings- och analysprodukterna. Inte ens nu, när försäljningen inte längre sker i Ryssland, är detta inte en anledning att inte skriva instruktioner/how-to för denna produkt.
Uppgift: samla in systemloggar från dockarnoder i Splunk utan att ändra värddatorns konfiguration
Jag skulle vilja börja med det officiella tillvägagångssättet, som ser lite konstigt ut när du använder Docker.
Vad har vi:
1. Pullim bild
$ docker pull splunk/universalforwarder:latest2. Starta behållaren med nödvändiga parametrar
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest3. Vi går in i containern
docker exec -it <container-id> /bin/bashDärefter uppmanas vi att gå till en känd adress i dokumentationen.
Och konfigurera behållaren efter att den startar:
./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart
Vänta. Vad?
Men överraskningarna slutar inte där. Om du kör behållaren 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 [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 *********
ну и так далее...
Bra. Bilden innehåller inte ens en artefakt. Det vill säga, varje gång du startar kommer det att ta tid att ladda ner arkivet med binärer, packa upp och konfigurera.
Hur är det med docker-way och allt det där?
Nej tack. Vi tar en annan väg. Vad händer om vi utför alla dessa operationer på monteringsstadiet? Då går vi!
För att inte dröja för länge visar jag den slutliga bilden direkt:
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 dig att ge den ett inloggning/lösenord, MEN denna data används endast för att utföra administrativa kommandon för just den installationen, det vill säga inuti behållaren. I vårt fall vill vi bara sjösätta containern så att allt fungerar och stockarna flyter som en flod. Naturligtvis är detta hårdkod, men jag har inte hittat några andra sätt.
Vidare enligt skriptet exekveras
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Det här är en referensfil för Splunk Universal Forwarder, som kan laddas ner från webbgränssnittet.
Var man kan klicka för att ladda ner (i bilder)
Detta är ett vanligt arkiv som kan packas upp. Inuti finns certifikat och ett lösenord för att ansluta till vårt SplunkCloud och outputs.conf med en lista över våra indatainstanser. Den här filen kommer att vara relevant tills du installerar om din Splunk-installation eller lägger till en ingångsnod om installationen är lokal. Därför är det inget fel med att lägga det inuti behållaren.
Och det sista är omstart. Ja, för att tillämpa ändringarna måste du starta om den.
I vår inputs.conf vi lägger till loggarna 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 marionett. Det enda är att Forwarder ser konfigurationerna när demonen startar, annars kommer den att behöva ./splunk omstart.
Vilken typ av docker-statistikskript är det? Det finns en gammal lösning på Github från , skripten togs därifrån och modifierades för att fungera med nuvarande versioner av Docker (ce-17.*) och Splunk (7.*).
Med erhållen data kan du bygga följande
instrumentpaneler: (ett par bilder)
Källkoden för bindestreck finns i länken i slutet av artikeln. Observera att det finns 2 valda fält: 1 - indexval (sökt med mask), val av värd/behållare. Du kommer sannolikt att behöva uppdatera indexmasken, beroende på vilka namn du använder.
Avslutningsvis vill jag uppmärksamma er på funktionen Start() в
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
}I mitt fall, för varje miljö och varje enskild enhet, vare sig det är en applikation i en container eller en värdmaskin, använder vi ett separat index. På så sätt kommer sökhastigheten inte att lida när det finns en betydande ackumulering av data. En enkel regel används för att namnge index: _. Därför, för att behållaren ska vara universell, innan vi startar själva demonen, ersätter vi törst-th jokertecken till namnet på miljön. Miljönamnsvariabeln skickas genom miljövariabler. Låter roligt.
Det är också värt att notera att Splunk av någon anledning inte påverkas av närvaron av docker-parametern hostname. Han kommer fortfarande envist att skicka loggar med id för sin container i värdfältet. Som lösning kan du montera / Etc / hostname från värddatorn och vid uppstart gör ersättningar som liknar indexnamn.
Exempel 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:roTotalt
Ja, lösningen kanske inte är idealisk och absolut inte universell för alla, eftersom det finns många "svår kod". Men baserat på det kan alla bygga sin egen bild och lägga den i sin privata artifactory, om du som det händer behöver Splunk Forwarder i Docker.
Länkar:
Källa: will.com
