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
}

就我而言,对于每个环境和每个单独的实体,无论是容器中的应用程序还是主机中的应用程序,我们都使用单独的索引。 因此,搜索速度不会因数据的大量积累而受到影响。 命名索引的简单规则是: _。 因此,为了使容器具有通用性,在启动守护进程本身之前,我们将 口渴-ohm 通配符为环境名称。 具有环境名称的变量通过环境变量传递。 听起来很有趣。

还值得注意的是,由于某种原因,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 的解决方案启发了重用部分功能
的。 配置通用转发器的文档

来源: habr.com

添加评论