Zabbix Agent 4.0.48 自动化安装脚本
📋 概述
本脚本用于自动化安装和配置 Zabbix Agent 4.0.48(其他版本自行切换),支持从源码编译安装,适用于需要监控的 Linux 服务器。
🖥️ 测试环境
- ✅ Kylin Linux Advanced Server V10 (Halberd) – 已测试通过
- 🔄 CentOS 7/8, Rocky Linux 8 – 理论兼容
📦 文件清单
zabbix_install/
├── install_zabbix.sh # 安装脚本
├── zabbix-4.0.48.tar.gz # Zabbix 源码包
└── README.md # 说明文档(本文件)
⚙️ 功能特性
- ✅ 自动检测脚本所在目录,支持任意路径部署
- ✅ 自动安装编译依赖(gcc、make 等)
- ✅ 源码编译安装 Zabbix Agent
- ✅ 自动创建 zabbix 用户和组
- ✅ 自动配置系统参数优化
- ✅ 生成 systemd 服务文件
- ✅ 自动配置主被动模式
- ✅ 根据 IP 自动生成主机名
- ✅ 支持断点续传(已安装部分自动跳过)
📋 前置要求
系统要求
- Linux 操作系统(支持 systemd)
- root 权限
- 网络连接(用于安装依赖包)
必需文件
zabbix-4.0.48.tar.gz源码包必须与脚本放在同一目录,下载地址:https://cdn.zabbix.com/zabbix/sources/oldstable/4.0/
🚀 使用方法
1. 准备文件
将整个 zabbix_install 目录上传到目标服务器:
# 示例:上传到 /usr/local/src/
scp -r zabbix_install root@target-server:/usr/local/src/
2. 修改配置(可选)
编辑 install_zabbix.sh,根据实际环境修改以下配置:
# Zabbix Server 配置
readonly ZABBIX_SERVER_IP="10.192.67.50" # 主动模式服务器地址
readonly ZABBIX_SERVER_LIST="10.196.69.70,..." # 被动模式服务器列表
# 安装路径配置
readonly ZABBIX_INSTALL_DIR="/usr/local/zabbix_agent" # 安装目录
readonly ZABBIX_LOG_DIR="/var/log/zabbix" # 日志目录
3. 执行安装
# 进入脚本目录
cd /usr/local/src/zabbix_install
# 添加执行权限
chmod +x install_zabbix.sh
# 执行安装(需要 root 权限)
./install_zabbix.sh
4. 验证安装
# 检查服务状态
systemctl status zabbix_agentd
# 查看进程
ps -ef | grep zabbix_agentd
# 查看日志
tail -f /var/log/zabbix/zabbix_agentd.log
📁 安装目录结构
安装完成后的目录结构:
/usr/local/zabbix_agent/ # 安装目录
├── bin/ # 可执行文件
├── etc/
│ ├── zabbix_agentd.conf # 配置文件
│ └── zabbix_agentd.conf.bak # 配置文件备份
└── sbin/
└── zabbix_agentd # Agent 主程序
/var/log/zabbix/ # 日志目录
├── zabbix_agentd.log # 运行日志
└── zabbix_agentd.pid # PID 文件
🔧 服务管理
基本命令
# 启动服务
systemctl start zabbix_agentd
# 停止服务
systemctl stop zabbix_agentd
# 重启服务
systemctl restart zabbix_agentd
# 查看状态
systemctl status zabbix_agentd
# 开机自启
systemctl enable zabbix_agentd
# 禁用自启
systemctl disable zabbix_agentd
查看日志
# 实时查看日志
tail -f /var/log/zabbix/zabbix_agentd.log
# 查看最近 100 行日志
tail -n 100 /var/log/zabbix/zabbix_agentd.log
📝 配置说明
主要配置项
| 配置项 | 说明 | 默认值 |
|---|---|---|
PidFile |
PID 文件路径 | /var/log/zabbix/zabbix_agentd.pid |
LogFile |
日志文件路径 | /var/log/zabbix/zabbix_agentd.log |
LogFileSize |
日志文件大小限制(0=不限制) | 0 |
Server |
被动模式服务器列表 | 配置的服务器 IP 列表 |
ServerActive |
主动模式服务器地址 | 配置的服务器 IP |
Hostname |
主机名 | 自动生成(host + IP 最后一段) |
修改配置
# 编辑配置文件
vim /usr/local/zabbix_agent/etc/zabbix_agentd.conf
# 修改后重启服务
systemctl restart zabbix_agentd
🔍 故障排查
1. 服务启动失败
# 查看详细错误信息
systemctl status zabbix_agentd -l
# 查看日志
tail -f /var/log/zabbix/zabbix_agentd.log
2. 编译失败
# 查看编译日志
cat /tmp/zabbix_build.log
# 检查依赖包是否安装
rpm -qa | grep -E "gcc|make|pcre"
3. 连接问题
# 检查防火墙
firewall-cmd --list-all
# 检查端口监听
netstat -tunlp | grep 10050
# 测试网络连通性
telnet <zabbix_server_ip> 10051
🔄 卸载方法
# 停止服务
systemctl stop zabbix_agentd
systemctl disable zabbix_agentd
# 删除服务文件
rm -f /usr/lib/systemd/system/zabbix_agentd.service
# 删除安装目录
rm -rf /usr/local/zabbix_agent
# 删除日志目录
rm -rf /var/log/zabbix
# 删除用户(可选)
userdel zabbix
# 重载 systemd
systemctl daemon-reload
📌 注意事项
- 权限要求:脚本必须以 root 用户运行
- 源码包位置:
zabbix-xxx.tar.gz必须与脚本在同一目录 - 网络要求:需要能访问 yum 源以安装依赖包
- 防火墙配置:确保 Zabbix Server 能访问 Agent 的 10050 端口
- 重复执行:脚本支持重复执行,已安装的部分会自动跳过
- 配置备份:首次运行会自动备份原始配置文件为
.bak
📄 版本历史
- v1.0.0 (2026-02-27)
- 初始版本
- 支持 Zabbix Agent 4.0.48 自动化安装
- 支持 Kylin Linux V10 系统
- 支持相对路径部署
- 优化配置文件修改逻辑,避免重复配置
脚本如下
#!/bin/bash
# **********************************************************
# Version: 1.0.0
# Update: 2026-02-27
# Desc: Zabbix Agent自动化安装脚本
# 测试环境:
# - Kylin Linux Advanced Server V10 (Halberd) - 已测试通过
# - CentOS 7/8, Rocky Linux 8 - 理论兼容
# **********************************************************
# ------------------------------
# 常量声明
# ------------------------------
readonly EXIT_CODE_NORMAL=0
readonly EXIT_CODE_ERROR=1
readonly EXIT_CODE_WITHOUT_PERMISSION=2
readonly LOG_LEVEL_INFO='INFO'
readonly LOG_LEVEL_ERROR='ERROR'
readonly LOG_LEVEL_WARN='WARN'
# ------------------------------
# 全局变量
# ------------------------------
# 获取脚本所在目录的绝对路径
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly ZABBIX_VERSION="4.0.48"
readonly ZABBIX_INSTALL_DIR="/usr/local/zabbix_agent"
# 源码包和解压目录设置为脚本所在目录
readonly ZABBIX_SOURCE_DIR="${SCRIPT_DIR}/zabbix-${ZABBIX_VERSION}"
readonly ZABBIX_TARBALL="${SCRIPT_DIR}/zabbix-${ZABBIX_VERSION}.tar.gz"
readonly ZABBIX_LOG_DIR="/var/log/zabbix"
readonly ZABBIX_USER="zabbix"
readonly ZABBIX_GROUP="zabbix"
# Zabbix Server配置(可根据实际环境修改)
readonly ZABBIX_SERVER_IP="10.192.67.50"
readonly ZABBIX_SERVER_LIST="10.196.69.70,10.196.68.166,10.196.69.71,10.192.67.33,10.192.67.35,10.192.67.40,10.192.67.50"
# ------------------------------
# 日志函数
# ------------------------------
log() {
local now=$(date '+%Y-%m-%d %H:%M:%S')
printf '[%s][%s]: %s\n' "$now" "$1" "$2"
}
# 权限检查
check_root_permission() {
if [ "$EUID" -ne 0 ]; then
log "$LOG_LEVEL_ERROR" "请以root权限运行脚本!"
exit $EXIT_CODE_WITHOUT_PERMISSION
fi
}
# 安装依赖包
install_dependencies() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 安装依赖包 ====="
log "$LOG_LEVEL_INFO" "安装编译依赖包..."
yum install -y gcc bzip2 perl net-tools vim pcre pcre-devel
if [ $? -ne 0 ]; then
log "$LOG_LEVEL_ERROR" "依赖包安装失败!"
return 1
fi
log "$LOG_LEVEL_INFO" "安装开发工具组..."
yum groupinstall -y "Development Tools" > /dev/null 2>&1
if [ $? -eq 0 ]; then
log "$LOG_LEVEL_INFO" "依赖包安装成功"
else
log "$LOG_LEVEL_WARN" "开发工具组安装失败,但可能不影响后续安装"
fi
log "$LOG_LEVEL_INFO" "===== 完成: 安装依赖包 ====="
}
# 解压Zabbix源码包
extract_zabbix_source() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 解压Zabbix源码包 ====="
# 检查源码包是否存在
if [ ! -f "$ZABBIX_TARBALL" ]; then
log "$LOG_LEVEL_ERROR" "Zabbix源码包不存在: $ZABBIX_TARBALL"
return 1
fi
# 检查是否已解压
if [ -d "$ZABBIX_SOURCE_DIR" ]; then
log "$LOG_LEVEL_INFO" "检测到源码目录已存在,跳过解压..."
return 0
fi
log "$LOG_LEVEL_INFO" "解压 zabbix-${ZABBIX_VERSION}.tar.gz..."
tar zxf "$ZABBIX_TARBALL" -C "$SCRIPT_DIR"
if [ $? -eq 0 ] && [ -d "$ZABBIX_SOURCE_DIR" ]; then
log "$LOG_LEVEL_INFO" "源码包解压成功"
else
log "$LOG_LEVEL_ERROR" "源码包解压失败!"
return 1
fi
log "$LOG_LEVEL_INFO" "===== 完成: 解压Zabbix源码包 ====="
}
# 编译安装Zabbix Agent
compile_and_install() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 编译安装Zabbix Agent ====="
local BUILD_LOG="/tmp/zabbix_build.log"
# 检查是否已安装
if [ -d "$ZABBIX_INSTALL_DIR" ] && [ -f "$ZABBIX_INSTALL_DIR/sbin/zabbix_agentd" ]; then
log "$LOG_LEVEL_INFO" "检测到Zabbix Agent已安装,跳过编译..."
return 0
fi
# 检查源码目录是否存在
if [ ! -d "$ZABBIX_SOURCE_DIR" ]; then
log "$LOG_LEVEL_ERROR" "源码目录不存在: $ZABBIX_SOURCE_DIR"
return 1
fi
log "$LOG_LEVEL_INFO" "配置编译参数..."
cd "$ZABBIX_SOURCE_DIR" || return 1
./configure --prefix="$ZABBIX_INSTALL_DIR" --enable-agent >> "$BUILD_LOG" 2>&1
if [ $? -ne 0 ]; then
log "$LOG_LEVEL_ERROR" "配置编译参数失败!查看日志: $BUILD_LOG"
return 1
fi
log "$LOG_LEVEL_INFO" "开始编译并安装(使用 $(nproc) 核心,请稍候...)"
make -j$(nproc) >> "$BUILD_LOG" 2>&1 && make install >> "$BUILD_LOG" 2>&1
if [ $? -eq 0 ] && [ -f "$ZABBIX_INSTALL_DIR/sbin/zabbix_agentd" ]; then
log "$LOG_LEVEL_INFO" "Zabbix Agent编译安装成功"
# 清理编译日志
rm -f "$BUILD_LOG"
else
log "$LOG_LEVEL_ERROR" "Zabbix Agent编译安装失败!查看日志: $BUILD_LOG"
return 1
fi
log "$LOG_LEVEL_INFO" "===== 完成: 编译安装Zabbix Agent ====="
}
# 创建Zabbix用户和目录
create_user_and_directories() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 创建Zabbix用户和目录 ====="
# 创建zabbix组(如果不存在)
if ! getent group "$ZABBIX_GROUP" &> /dev/null; then
log "$LOG_LEVEL_INFO" "创建zabbix组..."
groupadd "$ZABBIX_GROUP"
else
log "$LOG_LEVEL_INFO" "zabbix组已存在,跳过创建"
fi
# 创建zabbix用户(如果不存在)
if ! id "$ZABBIX_USER" &> /dev/null; then
log "$LOG_LEVEL_INFO" "创建zabbix用户..."
useradd -g "$ZABBIX_GROUP" -s /sbin/nologin -M "$ZABBIX_USER"
else
log "$LOG_LEVEL_INFO" "zabbix用户已存在,跳过创建"
fi
# 创建日志目录
if [ ! -d "$ZABBIX_LOG_DIR" ]; then
log "$LOG_LEVEL_INFO" "创建日志目录: $ZABBIX_LOG_DIR"
mkdir -p "$ZABBIX_LOG_DIR"
fi
# 设置目录权限
chown -R "${ZABBIX_USER}:${ZABBIX_GROUP}" "$ZABBIX_LOG_DIR"
log "$LOG_LEVEL_INFO" "日志目录权限设置完成"
log "$LOG_LEVEL_INFO" "===== 完成: 创建Zabbix用户和目录 ====="
}
# 配置Zabbix Agent
configure_zabbix_agent() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 配置Zabbix Agent ====="
local config_file="$ZABBIX_INSTALL_DIR/etc/zabbix_agentd.conf"
# 检查配置文件是否存在
if [ ! -f "$config_file" ]; then
log "$LOG_LEVEL_ERROR" "配置文件不存在: $config_file"
return 1
fi
# 备份原始配置文件
if [ ! -f "${config_file}.bak" ]; then
log "$LOG_LEVEL_INFO" "备份原始配置文件..."
cp "$config_file" "${config_file}.bak"
fi
# 获取主机名(使用IP最后一段)
local ip_addr=$(ip addr show | grep -E 'inet.*brd' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d '/' -f1 | head -n 1)
local hostname="Linux-server"
if [ -n "$ip_addr" ]; then
local ip_last_octet=$(echo "$ip_addr" | awk -F '.' '{print $4}')
hostname="host${ip_last_octet}"
fi
log "$LOG_LEVEL_INFO" "修改配置文件..."
# 配置PidFile路径(只匹配非注释行,如果不存在则追加)
if grep -q "^PidFile=" "$config_file"; then
sed -i "s|^PidFile=.*|PidFile=${ZABBIX_LOG_DIR}/zabbix_agentd.pid|" "$config_file"
else
sed -i "/^[# ]*PidFile=/a PidFile=${ZABBIX_LOG_DIR}/zabbix_agentd.pid" "$config_file"
fi
# 配置LogFile路径(只匹配非注释行,如果不存在则追加)
if grep -q "^LogFile=" "$config_file"; then
sed -i "s|^LogFile=.*|LogFile=${ZABBIX_LOG_DIR}/zabbix_agentd.log|" "$config_file"
else
sed -i "/^[# ]*LogFile=/a LogFile=${ZABBIX_LOG_DIR}/zabbix_agentd.log" "$config_file"
fi
# 配置LogFileSize(只匹配非注释行,如果不存在则追加)
if grep -q "^LogFileSize=" "$config_file"; then
sed -i 's|^LogFileSize=.*|LogFileSize=0|' "$config_file"
else
sed -i "/^[# ]*LogFileSize=/a LogFileSize=0" "$config_file"
fi
# 配置Server地址(只匹配非注释行,如果不存在则追加)
if grep -q "^Server=" "$config_file"; then
sed -i "s|^Server=.*|Server=${ZABBIX_SERVER_LIST}|" "$config_file"
else
sed -i "/^[# ]*Server=/a Server=${ZABBIX_SERVER_LIST}" "$config_file"
fi
# 配置ServerActive地址(只匹配非注释行,如果不存在则追加)
if grep -q "^ServerActive=" "$config_file"; then
sed -i "s|^ServerActive=.*|ServerActive=${ZABBIX_SERVER_IP}|" "$config_file"
else
sed -i "/^[# ]*ServerActive=/a ServerActive=${ZABBIX_SERVER_IP}" "$config_file"
fi
# 配置Hostname(只匹配非注释行,如果不存在则追加)
if grep -q "^Hostname=" "$config_file"; then
sed -i "s|^Hostname=.*|Hostname=${hostname}|" "$config_file"
else
sed -i "/^[# ]*Hostname=/a Hostname=${hostname}" "$config_file"
fi
log "$LOG_LEVEL_INFO" "配置文件修改完成"
log "$LOG_LEVEL_INFO" " - Server: ${ZABBIX_SERVER_LIST}"
log "$LOG_LEVEL_INFO" " - ServerActive: ${ZABBIX_SERVER_IP}"
log "$LOG_LEVEL_INFO" " - Hostname: ${hostname}"
log "$LOG_LEVEL_INFO" "===== 完成: 配置Zabbix Agent ====="
}
# 配置系统服务
configure_systemd_service() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 配置系统服务 ====="
local init_script="/etc/init.d/zabbix_agentd"
local systemd_service="/usr/lib/systemd/system/zabbix_agentd.service"
# 检查是否已存在systemd服务文件
if [ -f "$systemd_service" ]; then
log "$LOG_LEVEL_INFO" "检测到systemd服务文件已存在,跳过配置..."
return 0
fi
# 复制init脚本
# if [ -f "$ZABBIX_SOURCE_DIR/misc/init.d/fedora/core/zabbix_agentd" ]; then
# log "$LOG_LEVEL_INFO" "复制init启动脚本..."
# cp "$ZABBIX_SOURCE_DIR/misc/init.d/fedora/core/zabbix_agentd" "$init_script"
# chmod +x "$init_script"
# # 修改BASEDIR路径
# sed -i "s|^BASEDIR=.*|BASEDIR=${ZABBIX_INSTALL_DIR}|" "$init_script"
# else
# log "$LOG_LEVEL_WARN" "未找到init脚本,将创建systemd服务文件"
# fi
# 创建systemd服务文件
log "$LOG_LEVEL_INFO" "创建systemd服务文件..."
cat > "$systemd_service" <<EOF
[Unit]
Description=Zabbix Agent
After=syslog.target network.target
[Service]
Type=forking
PIDFile=${ZABBIX_LOG_DIR}/zabbix_agentd.pid
ExecStart=${ZABBIX_INSTALL_DIR}/sbin/zabbix_agentd -c ${ZABBIX_INSTALL_DIR}/etc/zabbix_agentd.conf
ExecStop=/bin/kill -SIGTERM \$MAINPID
User=${ZABBIX_USER}
Group=${ZABBIX_GROUP}
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
EOF
# 重新加载systemd配置
systemctl daemon-reload
log "$LOG_LEVEL_INFO" "systemd服务文件创建完成"
log "$LOG_LEVEL_INFO" "===== 完成: 配置系统服务 ====="
}
# 启动Zabbix Agent服务
start_zabbix_service() {
log "$LOG_LEVEL_INFO" "===== 开始执行: 启动Zabbix Agent服务 ====="
# 停止可能正在运行的进程
log "$LOG_LEVEL_INFO" "停止旧的zabbix_agentd进程..."
pkill -9 zabbix_agentd 2>/dev/null
sleep 2
# 启动服务
log "$LOG_LEVEL_INFO" "启动zabbix_agentd服务..."
systemctl start zabbix_agentd
if [ $? -ne 0 ]; then
log "$LOG_LEVEL_ERROR" "服务启动失败!"
return 1
fi
# 设置开机自启
log "$LOG_LEVEL_INFO" "设置开机自启..."
systemctl enable zabbix_agentd
# 等待服务启动
sleep 3
# 检查服务状态
if systemctl is-active --quiet zabbix_agentd; then
log "$LOG_LEVEL_INFO" "Zabbix Agent服务启动成功"
# 显示服务状态
local status=$(systemctl status zabbix_agentd | grep "Active:" | awk '{print $2, $3}')
log "$LOG_LEVEL_INFO" "服务状态: $status"
# 检查进程
local pid=$(pgrep -f zabbix_agentd | head -n 1)
if [ -n "$pid" ]; then
log "$LOG_LEVEL_INFO" "进程PID: $pid"
fi
else
log "$LOG_LEVEL_ERROR" "Zabbix Agent服务启动失败!"
systemctl status zabbix_agentd
return 1
fi
log "$LOG_LEVEL_INFO" "===== 完成: 启动Zabbix Agent服务 ====="
}
# ------------------------------
# 主程序入口
# ------------------------------
main() {
# 检查权限
check_root_permission
# 执行各个模块
install_dependencies && \
extract_zabbix_source && \
compile_and_install && \
create_user_and_directories && \
configure_zabbix_agent && \
configure_systemd_service && \
start_zabbix_service
if [ $? -eq 0 ]; then
log "$LOG_LEVEL_INFO" "Zabbix Agent安装配置完成!"
exit $EXIT_CODE_NORMAL
else
log "$LOG_LEVEL_ERROR" "Zabbix Agent安装配置失败!"
exit $EXIT_CODE_ERROR
fi
}
main
支持一波!