Splunk je jedním z několika nejznámějších komerčních produktů pro sběr a analýzu logů. I když se nyní prodeje v Rusku již neprovádějí, není to důvod k tomu, abychom nepsali návody/testy k tomuto produktu.
Úkol: sbírat systémové logy z docker uzlů v Splunku, aniž byste měnili konfiguraci hostitelské mašiny
Začneme oficiálním přístupem, který se při použití Dockeru zdá být poněkud zvláštní.
Co máme:
1. Stáhnout obraz
$ docker pull splunk/universalforwarder:latest2. Spustit kontejner s potřebnými parametry
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=' splunk/universalforwarder:latest3. Přihlásit se do kontejneru
docker exec -it /bin/bashPoté nás požádají, abychom přešli na známou adresu v dokumentaci.
A nakonfigurovat kontejner po jeho spuštění:
./splunk add forward-server :
./splunk add monitor /var/log
./splunk restart
Počkejte. Co?
Ale tímto překvapení nekončí. Pokud spustíte kontejner z oficiálního obrazu v interaktivním režimu, uvidíte následující:
Trochu zklamání
$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest
HRÁNÍ [Spuštění výchozího nastavení Splunk] *******************************************************************************************************************************************************************************************************
Úterý 09. dubna 2019 13:40:38 +0000 (0:00:00.096) 0:00:00.096 *********
ÚKOL [Shromažďování faktů] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Úterý 09. dubna 2019 13:40:39 +0000 (0:00:01.520) 0:00:01.616 *********
ÚKOL [Získání aktuálního hostname] ***************************************************************************************************************************************************************************************************************
změněno: [localhost]
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.599) 0:00:02.215 *********
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.054) 0:00:02.270 *********
ÚKOL [nastavit_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.075) 0:00:02.346 *********
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.067) 0:00:02.413 *********
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.060) 0:00:02.473 *********
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.051) 0:00:02.525 *********
Úterý 09. dubna 2019 13:40:40 +0000 (0:00:00.056) 0:00:02.582 *********
Úterý 09. dubna 2019 13:40:41 +0000 (0:00:00.216) 0:00:02.798 *********
doplněno: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml pro localhost
Úterý 09. dubna 2019 13:40:41 +0000 (0:00:00.087) 0:00:02.886 *********
ÚKOL [splunk_common : Aktualizace vlastnictví adresáře Splunk] *****************************************************************************************************************************************************************************************
ok: [localhost]
Úterý 09. dubna 2019 13:40:41 +0000 (0:00:00.324) 0:00:03.210 *********
doplněno: /opt/ansible/roles/splunk_common/tasks/get_facts.yml pro localhost
Úterý 09. dubna 2019 13:40:41 +0000 (0:00:00.094) 0:00:03.305 *********
no a tak dále...
Skvělé. V obrázku není ani artefakt. To znamená, že pokaždé při spuštění bude trvat čas stáhnout archiv s binárními soubory, rozbalit a nastavit.
A co docker-way a vše takové?
Ne, děkuji. Půjdeme jinou cestou. Co kdybychom všechny tyto operace provedli během fáze sestavení? Tak jdeme na to!
Abych to dlouho neprotahoval, hned ukážu konečný obrázek:
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" ]A tak, co obsahuje
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 eofPři prvním spuštění, Splunk žádá o zadaní uživatelského jména/hesla, ale tyto údaje se používají pouze k provádění administrativních příkazů této konkrétní instalace, tedy uvnitř kontejneru. V našem případě chceme pouze spustit kontejner, aby všechno fungovalo a logy se valily proudem. Samozřejmě, je to hardcode, ale jiné způsoby jsem nenašel.
Další podle scénáře se provádí
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changemesplunkclouduf.spl — Jedná se o soubor s přihlašovacími údaji pro Splunk Universal Forwarder, který si můžete stáhnout z webového rozhraní.
Kde kliknout pro stažení (na obrázcích)
Toto je běžný archiv, který lze rozbalit. Uvnitř jsou certifikáty a heslo pro připojení k našemu SplunkCloud a outputs.conf se seznamem našich input instancí. Tento soubor bude aktuální, dokud znovu nenainstalujete svou instalaci Splunku nebo nepřidáte input nody, pokud je instalace on-premise. Není tedy nic špatného na tom, že jej přidáte do kontejneru.
A nakonec — restart. Ano, pro aplikaci změn je třeba ho restartovat.
V našem inputs.conf přidáváme logy, které chceme posílat do Splunku. Není nutné přidávat tento soubor do obrazu, pokud například distribuujete konfigurace pomocí puppet. Hlavní je, aby Forwarder viděl konfigurace při startu démona, jinak bude potřeba .\/splunk restart.
A co to jsou skripty docker stats? Na GitHubu existuje staré řešení od , skripty byly převzaty odsud a upraveny pro práci s aktuálními verzemi Dockeru (ce-17.*) a Splunku (7.*).
S získanými daty lze vytvářet takové
dashboardy: (pár obrázků)
Zdrojový kód dashboardů je v repozitáři uvedeném na konci článku. Všimněte si, že jsou tam dvě výběrová pole: 1 — výběr indexu (hledá se podle masky), výběr hostitele/kontejneru. Maska indexu pravděpodobně budete muset aktualizovat v závislosti na názvech, které používáte.
Na závěr chci upozornit na funkci start() v
entrypoint.sh
start() {
trap teardown EXIT
if [ -z $SPLUNK_INDEX ]; then
echo "Proměnná prostředí 'SPLUNK_INDEX' je prázdná nebo není definována. Měla by být 'dev' nebo '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 'spouští se' > /tmp/splunk-container.state"
${SPLUNK_HOME}/bin/splunk start
watch_for_failure
}V mém případě používáme pro každé prostředí a každou jednotlivou entitu, ať už se jedná o aplikaci v kontejneru nebo hostitelskou stroj, samostatný index. Tím nebude trpět rychlost vyhledávání při významném hromadění dat. Pro pojmenovávání indexů používáme jednoduché pravidlo: _. Takže, abychom byl kontejner univerzální, měníme před spuštěním samotného démona sed- wildcard na název prostředí. Proměnná s názvem prostředí se předává prostřednictvím proměnných prostředí. Zní to vtipně.
Je třeba také poznamenat, že na Splunk nemá vliv přítomnost docker parametru z nějakého důvodu. hostnameI tak bude stále posílat logy s ID svého kontejneru do pole host. Jako řešení lze namontovat /etc/hostname z hostitelské mašiny a při startu provést změnu podobnou jménům indexů.
Příklad docker-compose.yml
verze: '2'
služby:
splunk-forwarder:
obraz: "${IMAGE_REPO}\/docker-stats-splunk-forwarder:${IMAGE_VERSION}"
prostředí:
SPLUNK_INDEX: ${ENVIRONMENT}
svazky:
- \/etc\/hostname:\/etc\/hostname:ro
- \/var\/log:\/var\/log
- \/var\/run\/docker.sock:\/var\/run\/docker.sock:roVýsledek
Ano, je možné, že řešení není ideální a rozhodně není univerzální pro všechny, protože existuje mnoho „hardcodu“. Ale na jeho základě si každý může vytvořit svůj obraz a uložit ho do svého privátního archiváře, pokud, jak se stalo, potřebujete Splunk Forwarder právě v Dockeru.
Odkazy:
Zdroj: habr.com
