
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 ********* etc...
太好了 Docker映像不包含工件。 因此,每次运行容器时,都将下载二进制文件,解压缩它,对其进行配置。
那么docker-way呢? 在哪
不,谢谢 我们将选择正确的方式。 如果我们在构建阶段执行所有命令怎么办? 继续吧!
要跳过无聊的部分,有一个最终的图像:
Docker文件 # Depends on your preferences FROM centos:7 # Define env variables only once and don't define it any more ENV SPLUNK_HOME /splunkforwarder ENV SPLUNK_ROLE splunk_heavy_forwarder ENV SPLUNK_PASSWORD changeme ENV SPLUNK_START_ARGS --accept-license # Install required packages # wget - to download artifacts # expect - for the first run step of Splunk for build stage # jq - using in the shell scripts RUN yum install -y epel-release \ && yum install -y wget expect jq # Download, unpack, remove 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 # Everything is simple with shell scripts, but inputs.conf, splunkclouduf.spl and first_start.sh should have an explanation. I'll tell more about it below. 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/ # Grant execute permissions, add user, execute pre-configuration 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 scripts COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ] # It depends. If you need it locally - go on. 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会要求输入登录名/密码,但在此特定安装中,容器内的BUT凭证
仅可用于执行管理员的命令。 在我们的例子中,我们只需要运行容器,一切都应该工作而无需任何操作。 它可能看起来像“硬编码”,但是我还没有找到其他解决方案。
下一步是
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl-这是Splunk通用转发器凭据文件,您可以通过UI下载。
这是一个简单的存档,您可以轻松解压缩。 它包含-连接到我们的SplunkCloud的证书和密码; 具有输入节点列表的
outputs.conf 。 除非您重新安装Splunk安装或在内部部署时添加新的输入节点,否则此文件将是实际的。 无论如何,如果将其放在图像上,不会发生任何严重的情况。
最后一步-重新启动。 是的,要应用配置,需要重新启动它。
将日志添加到我们要发送到Splunk的
input.conf中。 如果通过Puppet交付配置,则无需将此配置添加到映像。 请记住,应该挂载配置文件。
什么是docker stat脚本? 您可以从
outcoldman的Github上找到解决方案,我从那里选择了脚本并进行了更新,以使其可以与Docker(ce-17。*)和Splunk(7. *)的实际版本一起使用。
您可以使用收集的数据构建精美的仪表板:
您可以在回购中找到仪表板源代码,我在本文末尾提到了该源代码。 注意第一个选择字段:选择索引(按掩码搜索)。 您将不得不更新蒙版。 这取决于您拥有的索引名称。
最后,我要注意里面的
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 }
就我而言,对于每种环境和每种服务,与主机或Docker应用程序无关,我们都创建一个单独的索引。 它防止索引中包含大量数据而降低搜索速度。 我们使用简单的命名转换规则:
<environment_name> _ <service / application / etc> 。 因此,要创建通用容器,我们用
sed将通配符替换为环境名称。 环境名称变量由环境变量继承。 听起来很有趣。
另外,我想指出的是,由于某些原因,Splunk不使用docker参数
hostname作为日志中的主机字段。 即使定义了主机名参数,它也会继续使用host = <forwarder_container_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
总结是的,也许,我的解决方案可能不是理想的,而且也不是所有人都通用的解决方案,因为它包含
“ hardcode” 。 但是这对于可以构建自己的映像并将其放置在私有注册表中的人可能会有所帮助。 特别是在Docker中需要Splunk转发器的情况下。
友情链接:
这个解决方案outcoldman的解决方案给了我重新使用某些功能的灵感官方文档页面。 通用转发器配置