Docker 中的 Splunk Universal Forwarder 作為系統日誌收集器

Docker 中的 Splunk Universal Forwarder 作為系統日誌收集器

Splunk 是幾種最知名的商業日誌收集和分析產品之一。 即使現在,當俄羅斯不再銷售時,這也不是不為該產品編寫說明/操作方法的理由。

任務:在不改變主機配置的情況下,從Splunk中的docker節點收集系統日誌

我想從官方的方法開始,這在使用 Docker 時看起來有點奇怪。
連結到 Docker 中心
我們有什麼:

1. 普林形象

$ docker pull splunk/universalforwarder:latest

2. 使用必要的參數啟動容器

$ docker run -d  -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest

3.我們進入容器

docker exec -it <container-id> /bin/bash

接下來,我們被要求轉到文檔中的已知地址。

並在容器啟動後配置:


./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart

等待。 什麼?

但驚喜還不止於此。 如果您以互動模式從官方鏡像運行容器,您將看到以下內容:

有點失望


$ 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 *********

ну и так далее...

偉大的。 該影像甚至不包含偽影。 也就是說,每次啟動時,都需要時間下載包含二進位檔案的存檔、解壓縮和設定。
docker-way 之類的怎麼樣?

不,謝謝。 我們將採取不同的路線。 如果我們在組裝階段執行所有這些操作怎麼辦? 那我們走吧!

為了不耽誤太久,我馬上給大家看最終的效果圖:

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" ]

那麼裡麵包含了什麼

首先開始.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 eof

第一次啟動時,Splunk 要求您提供登入/密碼,但此資料已被使用 執行該特定安裝(即容器內部)的管理指令。 在我們的例子中,我們只想啟動容器,以便一切正常並且日誌像河流一樣流動。 當然,這是硬編碼,但我還沒有找到其他方法。

進一步根據腳本執行

/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme

splunkclouduf.spl — 這是 Splunk Universal Forwarder 的憑證文件,可以從 Web 介面下載。

哪裡可以點擊下載(如圖)Docker 中的 Splunk Universal Forwarder 作為系統日誌收集器

Docker 中的 Splunk Universal Forwarder 作為系統日誌收集器
這是一個可以解壓縮的常規存檔。 裡面有用於連接到我們的 SplunkCloud 的憑證和密碼, 輸出.conf 以及我們的輸入實例的清單。 在您重新安裝 Splunk 安裝或新增輸入節點(如果安裝是本機安裝)之前,此檔案將一直相關。 因此,添加到容器內是沒有問題的。

最後一件事是重新啟動。 是的,要應用更改,您需要重新啟動它。

在我們的 輸入配置文件 我們新增要傳送到 Splunk 的日誌。 例如,如果您透過 puppet 分發配置,則無需將此檔案新增至映像中。 唯一的事情是轉發器在守護程序啟動時看到配置,否則它將需要 ./splunk重新啟動.

它們是什麼樣的 docker stats 腳本? Github 上有一個舊的解決方案 冷門人,這些腳本取自那裡並進行了修改,以適用於當前版本的 Docker (ce-17.*) 和 Splunk (7.*)。

利用獲得的數據,您可以建立以下內容

儀表板:(幾張圖片)Docker 中的 Splunk Universal Forwarder 作為系統日誌收集器

Docker 中的 Splunk Universal Forwarder 作為系統日誌收集器
破折號的源代碼位於文章末尾提供的連結中。 請注意,有 2 個選擇欄位:1 - 索引選擇(透過遮罩搜尋)、主機/容器選擇。 您可能需要更新索引掩碼,具體取決於您使用的名稱。

總之,我想提請您注意該功能 開始() в

入口點.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
}

就我而言,對於每個環境和每個單獨的實體,無論是容器中的應用程式還是主機中的應用程序,我們都使用單獨的索引。 這樣,當數據大量累積時,搜尋速度就不會受到影響。 使用一個簡單的規則來命名索引: _。 因此,為了使容器具有通用性,在啟動守護程序本身之前,我們將 口渴-th 環境名稱通配符。 環境名稱變數透過環境變數傳遞。 聽起來很有趣。

另外值得注意的是,由於某種原因,Splunk 不受 docker 參數存在的影響 主機。 他仍然會固執地發送日誌,並在主機欄位中包含他的容器的ID。 作為解決方案,您可以安裝 在/ etc /主機名 從主機並在啟動時進行類似於索引名稱的替換。

範例 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:ro

是的,也許這個解決方案並不理想,當然也不適合所有人,因為有很多 “硬編碼”。 但基於它,每個人都可以建立自己的映像並將其放入自己的私有工件中,如果碰巧您需要 Docker 中的 Splunk Forwarder。

引用:

文章中的解決方案
outcoldman 的解決方案啟發我們重複使用一些功能
的。 設定通用轉發器的文檔

來源: www.habr.com

添加評論