
Splunk是用于收集和分析日志的最受认可的几种商业产品之一。 即使现在,当不再在俄罗斯销售时,这也不是不对该产品写说明/使用方法的理由。
任务 :在不更改主机配置的情况下从Splunk中的Docker节点收集系统日志
我想从一种正式的方法开始,使用docker时看起来很奇怪。
链接到Docker集线器我们有什么:
1. Pullim图片
$ 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和所有这些呢?
不用了 我们将走另一条路。 如果我们在组装阶段执行所有这些操作怎么办? 那我们走吧!
为了避免长时间拖拉,我将立即显示最终图像:
Docker文件 # 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" ]
因此,其中包含的内容
第一次启动时,Splunk要求输入用户名/密码,但是此数据
仅用于执行此特定安装的管理命令,即在容器内部。 在我们的例子中,我们只想启动容器,以便一切正常,原木像水一样流动。 当然,这是硬编码,但是我还没有找到其他方法。
进一步在脚本上执行
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl-这是Splunk通用转发器的信用文件,可以从Web界面下载。
这是一个常规存档,您可以解压缩。 内部-用于连接到我们的SplunkCloud和output.conf以及输入实例列表的证书和密码。 该文件将一直存在,直到您重新安装Splunk安装或添加输入节点(如果安装为本地安装)为止。 因此,可以将其添加到容器中。
最后一个是重新启动。 是的,要应用更改,您需要重新启动它。
在
inputs.conf中,添加要发送到Splunk的日志。 例如,如果您通过p分散配置,则无需将此文件添加到映像。 最主要
的是 ,转发器在守护程序启动时会看到配置,否则将需要
./splunk重新启动 。
什么docker stats脚本? github有一个来自
outcoldman的旧解决方案,脚本是从那里获取的,并最终确定与当前版本的Docker(ce-17。*)和Splunk(7. *)一起使用。
利用获得的数据,您可以构建这样的
这些设计的源代码位于文章末尾指出的萝卜中。 请注意,有2个选择字段:1-选择索引(通过掩码搜索),选择主机/容器。 您可能必须更新索引掩码,具体取决于您使用的名称。
总之,我想注意一下
start()函数
入口点 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 }
就我而言,对于每个环境和每个单独的实体,无论是容器中的应用程序还是主机中的应用程序,我们都使用单独的索引。 因此,搜索速度不会受到大量数据积累的影响。 一个简单的规则用于命名索引:
<environment_name> _ <service / application / etc> 。 因此,为了使容器具有通用性,在直接启动守护程序之前,我们用环境名称替换
sed通配符。 具有环境名称的变量通过环境变量传递。 听起来很有趣。
同样值得注意的是,由于某些原因,Splunk不受docker
hostname参数的影响。 无论如何,他将持续地将日志从他的容器ID发送到主机字段。 作为解决方案,您可以从主机上挂载
/ etc / hostname ,并在启动时进行类似于索引名的替换。
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转发器。
参考文献:
本文的解决方案Outcoldman解决方案的灵感在于重用部分功能的。 通用转发器设置文档