背景
- 在部署实施zabbix代理的时候,最怕遇到客户有多个版本的Linux操作系统,比如有Redhat,Centos,Ubuntu或者Suse。不同的发行版本又有不同的版本,如redhat 6,redhat7,Suse11,Suse12等等,针对不同发行版的不同版本,我们需要根据源代码,在该操作系统版本进行编译后,生成可执行程序,然后分发到各自的大版本相同的操作系统上面去,进行实施监控。
- 方法步骤其实不难,无非就是准备一个同操作系统环境,安装gcc和相应的库文件,然后开始编译安装生成可执行程序。这种太枯燥了,不符合SRE理念,再者,如果哪天zabbix代理出现严重漏洞或者大功能升级,我们又需要将这些繁琐的工作再进行一遍,实在是费时费力,同时还得维护多个操作系统模版,非常低效率。
解决思路
- Docker是一项非常好玩的技术,他可以在一台机器上面虚拟出多个Linux操作系统环境,目前支持Centos,Ubuntu以及Suse这些操作系统,其他的可以移步到docker的镜像官网进行查看
https://hub.docker.com/search?q=&type=image&category=os
- 我们可以在docker下面,利用Dockerfile来生成我们的代理程序,具体实现思路如下:
- 选取镜像
- 将zabbix源代码添加到镜像中
- 准备编译环境
- 编译并清理环境
- 将编译后的程序打包
- 执行容器时将打包好的代理放到宿主机指定目录
实战
- 按照思路,我们编写Dockerfile文件内容如下:
FROM centos:7
MAINTAINER xiaojinran@foxmail.com
ADD *.tar.gz /zabbix
RUN yum install -y gcc pcre-devel make && cd /zabbix/* && ./configure --enable-agent --prefix /zabbix_agent && make && make install && tar -cvzf /tmp/zbx_agent_$(cat ChangeLog|grep "Changes for"|head -n 1|awk '{print $3}')_$(cat /etc/redhat-release |sed 's/ /_/g').tar.gz /zabbix_agent && rm -rf /zabbix_agent && rm -rf /zabbix/zabbix-*
VOLUME /zabbix_agents
CMD cp /tmp/*.tar.gz /zabbix_agents
- 文件内容说明如下:
- FROM 指定选取哪个镜像
- MAINTAINER 指定生成后的镜像的维护信息
- RUN 在镜像中执行相应的指令,这里为准备编译环境,并且进行编译,打包,这里建议将在镜像中执行的指令都在一个RUN里面执行,这样可以减小镜像层数,从而是最终镜像体积会小点。
- VOLUME 指定挂载目录,可以用于启动后容器内容的持久化
- CMD 指定启动容器时需要执行的指令,这里将打包好的代理程序拷贝到挂载目录,从而可以在宿主机上面进行保存
- 准备好zabbix源代码程序,将其放在Dockerfile所在的目录下
[docker@docker zabbix]$ ls
Dockerfile zabbix-4.4.4.tar.gz
[docker@docker zabbix]$ docker image build .
...
....
Successfully built 52ec17ef539c
- 顺利的话可以生成一个镜像,里面包含了我们的所需要的代理程序压缩包,我们用这个镜像生成一个容器,并立即销毁掉
[docker@docker zabbix]$ docker container run -d -v /zabbix_agents:/zabbix_agents 52ec17ef539c |xargs docker rm
e18e4709c7a201254138fc5adaf97407cde4bf088eab17f311ed5b1ef13ac49e
- 可以看到在我们的宿主机的目录上有个这个代理程序了。
[docker@docker zabbix]$ ll /zabbix_agents/
total 1056
-rw-r--r-- 1 root root 1079698 Jan 8 00:29 zbx_agent_4.4.4_CentOS_Linux_release_7.7.1908_(Core).tar.gz
引申
- 如果我们需要centos的其他版本,只需要在FROM中,加载不同版本的镜像即可,或者zabbix代理源码更新后,我们只需要将新的源代码进行拷贝,重新执行生成镜像和容器即可,非常方便,同样的,Suse也是可以使用该方法,由于Ubuntu,Suse包管理方式不同,但实际原理和思路是一致,只需要修改RUN里面的命令即可。