Zabbix Agent 4.0.48 自动化安装脚本

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

📌 注意事项

  1. 权限要求:脚本必须以 root 用户运行
  2. 源码包位置zabbix-xxx.tar.gz 必须与脚本在同一目录
  3. 网络要求:需要能访问 yum 源以安装依赖包
  4. 防火墙配置:确保 Zabbix Server 能访问 Agent 的 10050 端口
  5. 重复执行:脚本支持重复执行,已安装的部分会自动跳过
  6. 配置备份:首次运行会自动备份原始配置文件为 .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

评论

  1. Windows Chrome 122.0.6261.95
    9 小时前
    2026-2-28 20:33:18

    支持一波!

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇