一、说明
1.1 背景
由于centos停止支持的缘故,被迫从centos转换到了OpenEuler-22.03。最初抱着偷懒的想法,尝试直接安装centos7版本的zabbix-agent的rpm包,但是由于openssl版本过高导致无法安装。低版本的openssl本身就是一个安全隐患,既然系统预置的版本已经升级,那么自然没有降回去的道理。
虽然zabbix-agent通过源代码编译也很简单,但是需要安装的主机数量实在太多,逐台编译就显得很不现实,最终决定尝试将源代码打包为rpm,从而简化批量安装的工作。
1.2 环境
- 操作系统:OpenEuler-22.03
- zabbix版本:zabbix-6.0.19
二、准备工作
2.1 必要工具
- 安装编译所需工具:
yum install -y gcc
yum install -y pcre-devel
yum install -y make
- 安装构建rpm包所需工具:
yum install -y rpm-build
yum install -y rpmdevtools
2.2 获取源代码
从官网主页(https://www.zabbix.com/download_sources)可以直接下载各版本的最新源代码,例如6.0.42(截止目前最新)。
如果想要下载相对较旧的版本,例如6.0.19,可以在官网仓库(http://repo.zabbix.com/zabbix)根据操作系统和版本下载src.rpm包。相比之下,OpenEuler与centos7最为接近,我们下载对应的zabbix-6.0.19版本:http://repo.zabbix.com/zabbix/6.0/rhel/7/SRPMS/zabbix-6.0.19-release1.el7.src.rpm。
可以使用rpm2cpio package.src.rpm | cpio -idmv命令将tar.gz格式的源代码包解压到当前目录下。
三、编译安装
3.1 创建用户
groupadd --system zabbix
useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix
3.2 编译
- 默认配置编译
命令如下:
./configure --enable-agent
make
make install
如果使用默认的编译命令,则配置文件默认为/usr/local/etc/zabbix_agentd.conf;可执行文件默认为:/usr/local/sbin/zabbix_agentd、/usr/local/bin/zabbix_get和/usr/local/bin/zabbix_sender;其他配置参考配置文件,例如日志文件根据配置文件中的配置,为默认值/tmp/zabbix-agent.log;
- 自定义配置编译命令
有时默认的配置不能满足需求,例如对文件的位置有要求,可以对一些配置进行修改。示例编译命令如下:
./configure --prefix=/opt/zabbix --sysconfdir=/etc/zabbix --enable-agent --disable-dependency-tracking
make
make install
以上配置,则zabbix-agent会被安装于/opt/zabbix目录下,可执行文件为该目录下的sbin目录和bin目录,配置文件为/etc/zabbix/zabbix_agentd.conf,日志则以zabbix_agentd.conf文件为准,需要注意的是,zabbix-agent是以zabbix用户身份运行的,所以日志目录必须对zabbix用户具备读写权限。
3.3 运行
3.3.1 修改配置文件
配置文件中有以下几个需要注意的参数:
| 参数 | 说明 |
|---|---|
| Server | server或proxy地址 |
| ServerActive | 如果agent为主动模式则填写server或proxy地址,如果为被动模式则注释掉 |
| Hostname | 与web界面主机名称一致 |
| PidFile | pid文件路径 |
| LogFile | log文件路径 |
这里因为只是测试编译是否成功,所以可以完全不改,只看进程能否正常启动即可。
3.3.2 运行
- 启动agent:默认配置编译,可以直接以root身份使用
zabbix_agentd命令运行agent,如果编译时修改过安装目录,则运行此目录下/sbin目录的zabbix_agentd文件。 - 停止agent:先用
ps -ef | grep zabbix_agentd命令查得主进程pid,然后使用kill -15 主进程pid命令
3.4 注册为服务
在/usr/lib/systemd/system/目录下新增文件zabbix-agent.service,示例内容为:
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target[Service]
Environment="CONFFILE=/usr/local/etc/zabbix_agentd.conf"
EnvironmentFile=-/etc/sysconfig/zabbix-agent
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/usr/local/sbin/zabbix_agentd -c $CONFFILE
ExecStop=/usr/bin/kill -SIGTERM $MAINPID
RestartSec=10s
User=zabbix
Group=zabbix[Install]
WantedBy=multi-user.target
注意,其中的Environment、PIDFile、ExecStart所涉及的目录,需要根据实际情况进行修改。
完成后即可用systemctl命令控制服务了:
chmod 644 zabbix-agent.service
systemctl daemon-reload
systemctl start zabbix-agent
四、自制rpm包安装(自制spec文件)
构建rpm包的相关内容,可以参考之前的文章:使用rpmbuild将源代码制成rpm包
4.1 创建SPEC文件
在~/rpmbuild/SPECS目录下创建zabbix.spec文件,内容如下:
Name: zabbix
Version: 6.0.19
Release: 1%{?dist}
Summary: The Enterprise-class open source monitoring solution
Group: Applications/Internet
License: GPLv2+
URL: http://www.zabbix.com/
Source0: zabbix-6.0.19.tar.gz
BuildRequires: gcc, make, pcre-devel%description
Zabbix is the ultimate enterprise-level software designed for real-time monitoring of millions of metrics collected from tens of thousands of servers, virtual machines and network devices.%prep
%setup -q%build
%configure --enable-agent
make %{?_smp_mflags}%install
%make_install%pre
/usr/sbin/groupadd --system zabbix
/usr/sbin/useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin -c "Zabbix Monitoring System" zabbix%files
%attr(0644, zabbix, zabbix) %{_sysconfdir}/zabbix_agentd.conf
%attr(0755, zabbix, zabbix) %{_sbindir}/zabbix_agentd
%attr(0755, zabbix, zabbix) %{_bindir}/zabbix_get
%attr(0755, zabbix, zabbix) %{_bindir}/zabbix_sender
%attr(0644, zabbix, zabbix) %{_datadir}/man/man1/zabbix_get.1.gz
%attr(0644, zabbix, zabbix) %{_datadir}/man/man1/zabbix_sender.1.gz
%attr(0644, zabbix, zabbix) %{_datadir}/man/man8/zabbix_agentd.8.gz%postun
if [ $1 -eq 0 ]; then/usr/sbin/userdel zabbix
fi
几个注意点:
- %pre:创建用户和用户组,否则安装的时候会报错
- %files:部署文件到系统中,如果文件有遗漏,编译的时候会报错
- %postun:卸载完成后删除用户,由于会连组一起删除,因此就不需要另外删除用户组了
4.2 创建、安装及运行
- 创建rpm包:
rpmbuild -bb ~/rpmbuild/SPECS/zabbix.spec - 安装rpm包:以root运行
rpm -ivh 用户主目录/rpmbuild/RPMS/x86_64/zabbix-6.0.19-1.x86_64.rpm - 运行:以root直接运行
zabbix_agentd即可
五、后记
5.1 存在问题
上述方法创建的rpm包,虽然能够安装使用,但是相比官方提供的rpm包,仍然存在不少问题:
- spec文件在健壮性上存在不足,例如创建用户之前没有检查用户是否已经存在,导致rpm包的移植性可能存在问题。如果操作系统环境本身存在一些修改,例如安全加固、定制化修改,那么最好进行适配后重新编译。
- 某些文件的位置有所不同:
| 编译安装 | 自制rpm包 | 官方rpm包 | |
|---|---|---|---|
| 配置文件 | /usr/local/etc/zabbix_agentd.conf | /etc/zabbix_agentd.conf | /etc/zabbix/zabbix_agentd.conf |
| 可执行文件 | /usr/local/sbin/zabbix_agentd | /usr/sbin/zabbix_agentd | /usr/sbin/zabbix_agentd |
| 默认日志文件 | /tmp/zabbix-agent.log | /tmp/zabbix-agent.log | /varl/log/zabbix-agent.log |
| PID文件 | /tmp/zabbix_agentd.pid | /tmp/zabbix_agentd.pid | /run/zabbix/zabbix_agentd.pid |
- 官网rpm包安装之后,zabbix-agent已经注册为服务,可以用systemctl进行控制。
以上差异,是因为官方创建rpm包时,不仅是一个源代码压缩包,还有很多其他文件(例如配置文件、service文件和补丁文件),所以安装完成时,实际配置已经和源代码里的原始内容不一致了。
后期计划通过修改、简化官方的spec文件,使自己创造的rpm包尽量和官方包保持一致。
5.2 命令笔记
- 测试用户:id zabbix
- 测试用户组:getent group zabbix
- 清理目录:为重新创建rpm包做准备
rm -rf BUILD/* && rm -rf BUILDROOT/* && rm -rf RPMS/*