網(wǎng)環(huán)境下的自動(dòng)化監(jiān)控系統(tǒng)搭建)
簡(jiǎn)介本資源是一套面向Linux運(yùn)維工程師與監(jiān)控系統(tǒng)初學(xué)者的Zabbix 5.0離線一鍵部署方案專(zhuān)為無(wú)外網(wǎng)環(huán)境如內(nèi)網(wǎng)、生產(chǎn)隔離區(qū)下的快速落地設(shè)計(jì)顯著降低Zabbix服務(wù)端與客戶(hù)端的安裝配置門(mén)檻。壓縮包共6個(gè)文件含2個(gè)Shell腳本zabbix.sh用于服務(wù)端全自動(dòng)部署zabbix-agent.sh負(fù)責(zé)客戶(hù)端交互式安裝、2個(gè)RPM離線包歸檔offline_rpm.tar與zabbix-agent-rpm.tar、2個(gè)關(guān)鍵說(shuō)明文檔使用說(shuō)明.txt與執(zhí)行路徑提示.txt整體大小47.8MB結(jié)構(gòu)精簡(jiǎn)、依賴(lài)明確。已有1644人學(xué)習(xí)下載適用于CentOS 7環(huán)境下的標(biāo)準(zhǔn)化監(jiān)控體系建設(shè)。用戶(hù)可直接執(zhí)行腳本完成MySQL、Zabbix Server、Web界面及Agent的全鏈路部署預(yù)置默認(rèn)賬號(hào)密碼Admin/zabbix、數(shù)據(jù)庫(kù)密碼123456并支持后續(xù)手動(dòng)修改Server IP后重啟生效附帶清晰的交互提示與配置回溯路徑大幅縮短部署驗(yàn)證周期。1. 項(xiàng)目概述為什么我們需要一個(gè)Zabbix 5.0的離線一鍵安裝方案在運(yùn)維監(jiān)控領(lǐng)域Zabbix的地位無(wú)需多言它就像我們運(yùn)維工程師的“眼睛”和“耳朵”時(shí)刻盯著服務(wù)器集群的健康狀況。但每次部署Zabbix尤其是新版本都像是一場(chǎng)小型戰(zhàn)役。你得先搞定操作系統(tǒng)版本然后處理各種依賴(lài)包沖突接著是數(shù)據(jù)庫(kù)、Web服務(wù)器、Zabbix組件本身的編譯或安裝最后還得配置網(wǎng)絡(luò)、權(quán)限、防火墻……一套流程下來(lái)半天時(shí)間就沒(méi)了。更頭疼的是很多生產(chǎn)環(huán)境特別是金融、政企或涉密單位服務(wù)器是嚴(yán)格的內(nèi)網(wǎng)隔離環(huán)境根本無(wú)法連接互聯(lián)網(wǎng)。這時(shí)候你拿著官方那套需要在線yum install或apt-get install的文檔直接就傻眼了。這就是我動(dòng)手搞這個(gè)“Zabbix 5.0離線腳本一鍵安裝”項(xiàng)目的初衷。它不是一個(gè)簡(jiǎn)單的安裝包合集而是一個(gè)完整的、經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的離線部署解決方案。核心目標(biāo)就一個(gè)讓你在沒(méi)有任何外網(wǎng)連接的Linux服務(wù)器上通過(guò)執(zhí)行一個(gè)腳本就能自動(dòng)、快速、穩(wěn)定地部署好包含服務(wù)端、客戶(hù)端在內(nèi)的完整Zabbix 5.0監(jiān)控系統(tǒng)。腳本里已經(jīng)打包了所有必需的RPM/DEB包、配置文件、初始化腳本和詳細(xì)的使用說(shuō)明真正做到開(kāi)箱即用。這個(gè)方案特別適合以下幾類(lèi)場(chǎng)景一是全新的、物理隔離的生產(chǎn)環(huán)境初始化部署二是需要快速搭建測(cè)試或演示環(huán)境不想在環(huán)境準(zhǔn)備上浪費(fèi)時(shí)間三是作為標(biāo)準(zhǔn)化交付的一部分確保不同環(huán)境部署的一致性減少人為操作失誤。如果你正在為內(nèi)網(wǎng)服務(wù)器監(jiān)控發(fā)愁或者厭倦了每次部署都要重復(fù)那些繁瑣的步驟那這個(gè)項(xiàng)目就是為你準(zhǔn)備的。2. 方案整體設(shè)計(jì)與核心思路拆解2.1 離線部署的核心挑戰(zhàn)與解決思路離線安裝聽(tīng)起來(lái)只是“把包下載下來(lái)然后裝上去”但實(shí)際操作中陷阱重重。第一個(gè)大坑就是依賴(lài)地獄。Zabbix服務(wù)端依賴(lài)PHP、Nginx/Apache、數(shù)據(jù)庫(kù)MySQL/PostgreSQL這些軟件本身又有一大堆庫(kù)文件依賴(lài)。在離線環(huán)境下你沒(méi)法自動(dòng)解析和下載這些依賴(lài)必須手動(dòng)把所有依賴(lài)包都找齊并且要確保版本完全匹配一個(gè)不對(duì)就可能導(dǎo)致安裝失敗或運(yùn)行時(shí)崩潰。我的解決思路是在一個(gè)與目標(biāo)服務(wù)器操作系統(tǒng)版本、架構(gòu)完全一致的、可聯(lián)網(wǎng)的“構(gòu)建機(jī)”上利用系統(tǒng)包管理器的下載功能一次性拉取所有需要的包及其依賴(lài)。例如對(duì)于CentOS/RHEL 7/8我會(huì)使用yum install --downloadonly --downloaddir./zabbix_packages命令對(duì)于Ubuntu/Debian則使用apt-get download和apt-cache depends來(lái)遞歸獲取。這樣得到的包集合其依賴(lài)關(guān)系在目標(biāo)離線機(jī)上是天然滿足的。第二個(gè)挑戰(zhàn)是安裝流程的自動(dòng)化與原子性。我們不能只是把一堆包扔給用戶(hù)讓用戶(hù)手動(dòng)按順序安裝。那樣容易出錯(cuò)且無(wú)法回滾。因此腳本必須智能地處理安裝順序如先裝數(shù)據(jù)庫(kù)再裝Zabbix服務(wù)端最后裝前端并能檢測(cè)每一步的成功與否一旦失敗就清理現(xiàn)場(chǎng)或給出明確提示。2.2 技術(shù)棧選型與版本鎖定為什么選擇Zabbix 5.0 LTS5.0是一個(gè)重要的長(zhǎng)期支持版本相比4.0它在性能特別是歷史數(shù)據(jù)查詢(xún)、安全性和易用性上都有顯著提升并且官方支持周期長(zhǎng)適合用于生產(chǎn)環(huán)境。雖然已有6.0、7.0但5.0的生態(tài)最成熟社區(qū)資料最多對(duì)于追求穩(wěn)定的企業(yè)環(huán)境來(lái)說(shuō)是更穩(wěn)妥的選擇。在底層組件上我做了如下標(biāo)準(zhǔn)化選型Web服務(wù)器 Nginx。相比ApacheNginx在靜態(tài)資源處理和并發(fā)連接上表現(xiàn)更優(yōu)資源占用也更低是現(xiàn)代Web應(yīng)用的標(biāo)配。數(shù)據(jù)庫(kù) MySQL 8.0 或 MariaDB 10.5。Zabbix 5.0官方推薦MySQL 8.0或MariaDB 10.5以充分利用其性能改進(jìn)。腳本會(huì)優(yōu)先檢測(cè)并適配。PHP 7.2 - 7.4。Zabbix 5.0前端要求PHP 7.2以上。我們鎖定在7.4這個(gè)廣泛兼容且性能良好的版本。數(shù)據(jù)采集方式 Zabbix Agent 2。對(duì)于新部署的客戶(hù)端我優(yōu)先集成Zabbix Agent 2。它是下一代Agent用Go語(yǔ)言重寫(xiě)性能更好支持更多開(kāi)箱即用的監(jiān)控項(xiàng)且配置更靈活。當(dāng)然腳本也兼容傳統(tǒng)的Zabbix Agent。注意版本鎖死是離線包穩(wěn)定性的生命線。我提供的離線包是基于特定操作系統(tǒng)小版本如CentOS 7.9構(gòu)建的。如果你目標(biāo)機(jī)的系統(tǒng)版本不一致比如是CentOS 7.6可能會(huì)遇到glibc等核心庫(kù)版本不兼容的問(wèn)題。因此最佳實(shí)踐是嚴(yán)格按照文檔說(shuō)明使用相同版本的系統(tǒng)進(jìn)行部署。2.3 腳本架構(gòu)設(shè)計(jì)模塊化與高可維護(hù)性整個(gè)一鍵安裝腳本不是一個(gè)巨型的、幾千行的Shell文件而是采用了模塊化設(shè)計(jì)。這樣結(jié)構(gòu)清晰也方便后期維護(hù)和定制。zabbix_offline_installer/ ├── bin/ │ ├── 01_install_dependencies.sh # 安裝基礎(chǔ)依賴(lài)和第三方包 │ ├── 02_setup_database.sh # 安裝并配置數(shù)據(jù)庫(kù) │ ├── 03_install_zabbix_server.sh # 安裝Zabbix服務(wù)端 │ ├── 04_install_zabbix_web.sh # 安裝Zabbix前端 │ ├── 05_install_zabbix_agent2.sh # 安裝Zabbix Agent 2 │ └── common.sh # 公共函數(shù)庫(kù)日志、錯(cuò)誤處理、顏色輸出 ├── packages/ # 核心所有離線RPM/DEB包 │ ├── centos-7/ │ ├── centos-8/ │ └── ubuntu-20.04/ ├── configs/ # 配置文件模板 │ ├── zabbix_server.conf.j2 │ ├── nginx_zabbix.conf.j2 │ └── zabbix_agent2.conf.j2 ├── scripts/ # 輔助腳本如數(shù)據(jù)庫(kù)初始化、服務(wù)管理 ├── README.md # 詳細(xì)使用說(shuō)明 └── install.sh # 主入口腳本負(fù)責(zé)調(diào)度各模塊主腳本install.sh的工作流非常清晰首先進(jìn)行環(huán)境檢測(cè)操作系統(tǒng)、內(nèi)存、磁盤(pán)空間然后根據(jù)用戶(hù)選擇安裝服務(wù)端還是客戶(hù)端按順序調(diào)用對(duì)應(yīng)的模塊腳本。每個(gè)模塊腳本執(zhí)行前會(huì)檢查前置條件執(zhí)行后會(huì)驗(yàn)證結(jié)果。這種設(shè)計(jì)讓整個(gè)安裝過(guò)程像流水線一樣可控。3. 離線資源包的制作與管理3.1 構(gòu)建離線包倉(cāng)庫(kù)一個(gè)不能出錯(cuò)的步驟這是整個(gè)項(xiàng)目最基礎(chǔ)也是最容易出錯(cuò)的一環(huán)。你需要在一個(gè)純凈的、可聯(lián)網(wǎng)的虛擬機(jī)構(gòu)建機(jī)上完成。對(duì)于CentOS/RHEL系統(tǒng)安裝yum-utils和createrepo工具。創(chuàng)建一個(gè)目錄用于存放所有包例如/opt/zabbix-offline/centos7。使用repotrack或yumdownloader來(lái)下載指定軟件包及其所有依賴(lài)。repotrack更徹底它會(huì)遞歸拉取所有依賴(lài)。# 安裝工具 yum install -y yum-utils createrepo # 下載Zabbix官方倉(cāng)庫(kù)的Release包 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm # 使用repotrack下載所有需要的包到本地目錄 repotrack --download_path/opt/zabbix-offline/centos7 \ zabbix-server-mysql \ zabbix-web-mysql-scl \ zabbix-nginx-conf-scl \ zabbix-agent2 \ nginx \ mariadb-server \ mariadb進(jìn)入包目錄創(chuàng)建本地YUM倉(cāng)庫(kù)元數(shù)據(jù)。cd /opt/zabbix-offline/centos7 createrepo .執(zhí)行成功后會(huì)生成一個(gè)repodata文件夾?,F(xiàn)在這個(gè)目錄就是一個(gè)完整的本地YUM倉(cāng)庫(kù)了。對(duì)于Ubuntu/Debian系統(tǒng)過(guò)程類(lèi)似但工具不同。你需要使用apt-rdepends來(lái)列出所有依賴(lài)然后用apt-get download逐個(gè)下載。也可以使用apt-offline這類(lèi)工具來(lái)生成離線包集合。下載后需要用dpkg-scanpackages命令創(chuàng)建Packages.gz文件以形成本地APT倉(cāng)庫(kù)。實(shí)操心得構(gòu)建機(jī)的“純凈”至關(guān)重要。構(gòu)建機(jī)上已安裝的軟件可能會(huì)影響依賴(lài)關(guān)系的解析導(dǎo)致下載的包集合不完整。我建議使用Docker容器或一個(gè)全新安裝的虛擬機(jī)來(lái)充當(dāng)構(gòu)建機(jī)確保環(huán)境干凈。另外務(wù)必記錄下構(gòu)建機(jī)的完整系統(tǒng)版本號(hào)cat /etc/redhat-release或lsb_release -a并在提供給用戶(hù)的文檔中明確說(shuō)明。3.2 依賴(lài)包的精簡(jiǎn)與完整性校驗(yàn)用repotrack下載的包可能會(huì)非常大超過(guò)1GB因?yàn)樗怂锌赡艿囊蕾?lài)。我們需要做一些精簡(jiǎn)但必須非常小心。排除內(nèi)核和內(nèi)核模塊包這些包通常不需要且容易引發(fā)兼容性問(wèn)題??梢栽谙螺d命令后加上--excludekernel*。手動(dòng)檢查核心依賴(lài)重點(diǎn)確保glibc,openssl-libs,libxml2,mysql-connector-odbc如果用到數(shù)據(jù)庫(kù)監(jiān)控等基礎(chǔ)庫(kù)的版本與目標(biāo)機(jī)兼容。完整性校驗(yàn)下載完成后可以嘗試在構(gòu)建機(jī)本身通過(guò)file://協(xié)議配置一個(gè)臨時(shí)本地源然后模擬安裝一次看是否能成功。這是驗(yàn)證包集合完整性的最有效方法。# 在構(gòu)建機(jī)上臨時(shí)測(cè)試本地倉(cāng)庫(kù) cat /etc/yum.repos.d/local-zabbix.repo EOF [local-zabbix] nameLocal Zabbix Repo baseurlfile:///opt/zabbix-offline/centos7 enabled1 gpgcheck0 EOF # 清理緩存并測(cè)試安裝使用--downloadonly模式不真正安裝 yum clean all yum install --downloadonly zabbix-server-mysql如果這一步?jīng)]有報(bào)缺失依賴(lài)的錯(cuò)誤說(shuō)明包集合基本是完整的。4. 一鍵安裝腳本的詳細(xì)實(shí)現(xiàn)解析4.1 主控腳本環(huán)境檢測(cè)與流程調(diào)度install.sh是這個(gè)項(xiàng)目的總指揮。它的首要任務(wù)是“認(rèn)識(shí)”它所在的環(huán)境。#!/bin/bash # 引入公共函數(shù)庫(kù)定義顏色、日志函數(shù)、錯(cuò)誤處理函數(shù) source ./bin/common.sh LOG_FILE/var/log/zabbix_offline_install.log exec 2${LOG_FILE} # 將標(biāo)準(zhǔn)錯(cuò)誤也重定向到日志文件 # 1. 檢測(cè)操作系統(tǒng) detect_os() { if [ -f /etc/redhat-release ]; then OScentos # 提取主版本號(hào)如 7 或 8 OS_VERSION$(grep -oE [0-9]\.[0-9] /etc/redhat-release | cut -d. -f1) elif [ -f /etc/lsb-release ]; then . /etc/lsb-release OS${DISTRIB_ID,,} # 轉(zhuǎn)為小寫(xiě) OS_VERSION$DISTRIB_RELEASE else log_error 不支持的操作系統(tǒng) exit 1 fi log_info 檢測(cè)到操作系統(tǒng): ${OS} ${OS_VERSION} } # 2. 檢測(cè)硬件資源示例內(nèi)存 check_memory() { local MEM_KB$(grep MemTotal /proc/meminfo | awk {print $2}) local MEM_GB$((MEM_KB / 1024 / 1024)) if [ $MEM_GB -lt 2 ]; then log_warn 內(nèi)存小于2GB運(yùn)行Zabbix服務(wù)端可能會(huì)比較吃力建議增加內(nèi)存。 read -p 是否繼續(xù)(y/N): -n 1 -r if [[ ! $REPLY ~ ^[Yy]$ ]]; then exit 0 fi fi } # 3. 用戶(hù)交互選擇安裝模式 select_install_mode() { echo -e ${GREEN}請(qǐng)選擇安裝模式${NC} echo 1) 安裝Zabbix服務(wù)端包含數(shù)據(jù)庫(kù)、Web前端、Server echo 2) 僅安裝Zabbix客戶(hù)端Agent 2 read -p 請(qǐng)輸入數(shù)字 (1 或 2): MODE case $MODE in 1) INSTALL_MODEserver ;; 2) INSTALL_MODEagent ;; *) log_error 無(wú)效選擇; exit 1 ;; esac } # 主函數(shù) main() { log_info 開(kāi)始Zabbix離線一鍵安裝流程... detect_os check_memory select_install_mode # 根據(jù)操作系統(tǒng)和模式調(diào)用不同的安裝模塊 if [ $INSTALL_MODE server ]; then source ./bin/01_install_dependencies.sh source ./bin/02_setup_database.sh source ./bin/03_install_zabbix_server.sh source ./bin/04_install_zabbix_web.sh log_success Zabbix服務(wù)端安裝完成 echo -e ${CYAN}訪問(wèn)地址: http://$(hostname -I | awk {print $1})/zabbix${NC} echo -e ${CYAN}默認(rèn)用戶(hù)名/密碼: Admin / zabbix${NC} else source ./bin/05_install_zabbix_agent2.sh log_success Zabbix客戶(hù)端安裝完成 fi } # 執(zhí)行主函數(shù) main $這個(gè)主腳本邏輯清晰它不做具體的安裝工作只負(fù)責(zé)協(xié)調(diào)和檢查。所有具體的臟活累活都交給了各個(gè)模塊腳本。4.2 關(guān)鍵模塊詳解數(shù)據(jù)庫(kù)初始化與安全配置以02_setup_database.sh為例看看我們?nèi)绾翁幚鞰ySQL/MariaDB的安裝和Zabbix數(shù)據(jù)庫(kù)的初始化。#!/bin/bash source ./bin/common.sh setup_database() { log_info 開(kāi)始安裝和配置數(shù)據(jù)庫(kù)... local DB_PACKAGE # 判斷并安裝數(shù)據(jù)庫(kù)軟件 if command -v mysql /dev/null; then log_info MySQL/MariaDB 已存在跳過(guò)安裝。 else if [ $OS centos ]; then yum localinstall -y ./packages/${OS}-${OS_VERSION}/mariadb*.rpm systemctl enable mariadb systemctl start mariadb DB_PACKAGEmariadb fi # ... Ubuntu 類(lèi)似處理 fi # 運(yùn)行數(shù)據(jù)庫(kù)安全初始化腳本設(shè)置root密碼、移除匿名用戶(hù)等 log_info 運(yùn)行數(shù)據(jù)庫(kù)安全初始化... # 這里使用一個(gè)預(yù)置的答案文件實(shí)現(xiàn)非交互式初始化 mysql_secure_installation EOF Y ${DB_ROOT_PASSWORD} ${DB_ROOT_PASSWORD} Y Y Y Y EOF # 創(chuàng)建Zabbix數(shù)據(jù)庫(kù)和用戶(hù) log_info 創(chuàng)建Zabbix數(shù)據(jù)庫(kù)和用戶(hù)... mysql -uroot -p${DB_ROOT_PASSWORD} EOF CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8 COLLATE utf8_bin; CREATE USER IF NOT EXISTS zabbixlocalhost IDENTIFIED BY ${ZBX_DB_PASSWORD}; GRANT ALL PRIVILEGES ON zabbix.* TO zabbixlocalhost; FLUSH PRIVILEGES; EOF # 導(dǎo)入Zabbix初始數(shù)據(jù) schema log_info 導(dǎo)入Zabbix數(shù)據(jù)庫(kù)Schema... # 找到Zabbix Server包提供的SQL文件位置 local SQL_PATH$(find /usr/share -name create.sql.gz 2/dev/null | head -1) if [ -n $SQL_PATH ]; then zcat $SQL_PATH | mysql -uzabbix -p${ZBX_DB_PASSWORD} zabbix else # 備用方案使用我們腳本目錄下預(yù)置的SQL文件 gunzip -c ./scripts/zabbix_schema.sql.gz | mysql -uzabbix -p${ZBX_DB_PASSWORD} zabbix fi log_success 數(shù)據(jù)庫(kù)配置完成。 }注意事項(xiàng)數(shù)據(jù)庫(kù)密碼的安全處理。腳本中直接使用變量DB_ROOT_PASSWORD和ZBX_DB_PASSWORD。在真實(shí)場(chǎng)景中絕對(duì)不應(yīng)該將密碼硬編碼在腳本里。我的做法是在首次運(yùn)行主腳本時(shí)提示用戶(hù)輸入這些密碼或者從一個(gè)安全的配置文件中讀取。示例腳本為了清晰展示了邏輯實(shí)際交付的版本會(huì)有更安全的密碼管理機(jī)制。4.3 配置文件模板與動(dòng)態(tài)渲染直接使用軟件包默認(rèn)的配置文件往往不行我們需要根據(jù)用戶(hù)環(huán)境動(dòng)態(tài)調(diào)整。我使用了簡(jiǎn)單的模板替換技術(shù)。configs/zabbix_server.conf.j2模板文件片段# 這是一個(gè)Jinja2風(fēng)格的模板{{ }}內(nèi)的變量會(huì)被替換 LogFile/var/log/zabbix/zabbix_server.log LogFileSize100 PidFile/var/run/zabbix/zabbix_server.pid SocketDir/var/run/zabbix DBHostlocalhost DBNamezabbix DBUserzabbix DBPassword{{ ZBX_DB_PASSWORD }} # 這里將被實(shí)際密碼替換 DBPort3306 ListenPort10051在安裝腳本中使用sed命令進(jìn)行替換# 渲染Zabbix Server配置文件 ZBX_DB_PASSWORDYourSecurePassword123 # 應(yīng)從安全位置獲取 sed -e s/{{ ZBX_DB_PASSWORD }}/${ZBX_DB_PASSWORD}/g \ ./configs/zabbix_server.conf.j2 /etc/zabbix/zabbix_server.conf對(duì)于更復(fù)雜的配置比如Nginx的server塊、PHP-FPM的池配置都采用同樣的模板化方式確保最終生成的配置文件是符合當(dāng)前部署環(huán)境需求的。5. 客戶(hù)端Agent 2的靜默部署與自動(dòng)注冊(cè)5.1 Agent 2的離線安裝與批量部署客戶(hù)端安裝腳本05_install_zabbix_agent2.sh的目標(biāo)是盡可能靜默、無(wú)交互。它需要接收來(lái)自命令行的參數(shù)或者從一個(gè)配置文件中讀取關(guān)鍵信息主要是Zabbix Server的IP地址。#!/bin/bash source ./bin/common.sh install_agent2() { local SERVER_IP$1 local SERVER_ACTIVE_IP${2:-$SERVER_IP} log_info 開(kāi)始安裝Zabbix Agent 2目標(biāo)Server: ${SERVER_IP} # 安裝Agent 2包 if [ $OS centos ]; then yum localinstall -y ./packages/${OS}-${OS_VERSION}/zabbix-agent2*.rpm fi # ... Ubuntu 類(lèi)似 # 配置Agent local CONF_FILE/etc/zabbix/zabbix_agent2.conf cp ${CONF_FILE} ${CONF_FILE}.bak sed -i s/^Server.*/Server${SERVER_IP}/ ${CONF_FILE} sed -i s/^ServerActive.*/ServerActive${SERVER_ACTIVE_IP}/ ${CONF_FILE} # 設(shè)置主機(jī)名通常使用服務(wù)器自身主機(jī)名便于在Zabbix Web中識(shí)別 sed -i s/^Hostname.*/Hostname$(hostname -f)/ ${CONF_FILE} # 啟動(dòng)并啟用服務(wù) systemctl enable zabbix-agent2 systemctl start zabbix-agent2 firewall-cmd --permanent --add-port10050/tcp 2/dev/null firewall-cmd --reload 2/dev/null log_success Zabbix Agent 2 安裝并啟動(dòng)完成。 }對(duì)于成百上千臺(tái)服務(wù)器的批量部署我們可以將這個(gè)腳本和離線包上傳到一臺(tái)跳板機(jī)然后使用ansible、pssh或簡(jiǎn)單的for循環(huán)配合scp和ssh實(shí)現(xiàn)全網(wǎng)客戶(hù)端的自動(dòng)化安裝和配置。5.2 自動(dòng)注冊(cè)Auto Registration配置手動(dòng)在Zabbix Web界面添加每一臺(tái)主機(jī)是噩夢(mèng)。Zabbix Agent 2支持自動(dòng)注冊(cè)客戶(hù)端主動(dòng)向Server報(bào)到Server根據(jù)預(yù)設(shè)的規(guī)則自動(dòng)創(chuàng)建主機(jī)并鏈接模板。服務(wù)端配置Zabbix Web界面進(jìn)入管理 - 自動(dòng)注冊(cè)。創(chuàng)建一條新的自動(dòng)注冊(cè)動(dòng)作。在條件里可以設(shè)置規(guī)則例如“主機(jī)名符合正則表達(dá)式.*prod.*的自動(dòng)添加”。在操作里定義添加主機(jī)時(shí)的動(dòng)作添加到“Linux servers”主機(jī)組鏈接“Template OS Linux by Zabbix agent”模板并啟用主機(jī)??蛻?hù)端配置除了上面腳本中配置的ServerActive參數(shù)還可以在zabbix_agent2.conf中配置HostMetadata或HostMetadataItem向服務(wù)端發(fā)送更多元數(shù)據(jù)如環(huán)境標(biāo)簽envproduction讓自動(dòng)注冊(cè)規(guī)則更精確。這樣只要客戶(hù)端安裝啟動(dòng)服務(wù)端就能自動(dòng)發(fā)現(xiàn)并開(kāi)始監(jiān)控它實(shí)現(xiàn)了真正的“一鍵部署自動(dòng)上線”。6. 安裝后的必須檢查與優(yōu)化調(diào)優(yōu)6.1 安裝成功性驗(yàn)證清單腳本跑完不代表萬(wàn)事大吉。作為一名負(fù)責(zé)任的運(yùn)維你必須進(jìn)行以下檢查服務(wù)狀態(tài)檢查systemctl status zabbix-server zabbix-agent2 nginx mariadb php-fpm確保所有服務(wù)都是active (running)狀態(tài)沒(méi)有紅色的failed字樣。端口監(jiān)聽(tīng)檢查ss -tlnp | grep -E (10051|10050|80|3306)確認(rèn)10051Zabbix Server監(jiān)聽(tīng)用于接收Agent數(shù)據(jù)。10050Zabbix Agent監(jiān)聽(tīng)用于Server主動(dòng)拉取。80或443Nginx監(jiān)聽(tīng)提供Web訪問(wèn)。3306MySQL監(jiān)聽(tīng)。Web界面登錄 打開(kāi)瀏覽器訪問(wèn)http://服務(wù)器IP/zabbix。應(yīng)該能看到Zabbix的安裝引導(dǎo)頁(yè)面如果是首次訪問(wèn)或者登錄頁(yè)面。使用默認(rèn)憑據(jù)Admin/zabbix登錄。登錄后第一件事就是修改Admin密碼數(shù)據(jù)流驗(yàn)證在Web界面的監(jiān)測(cè) - 主機(jī)中查看本機(jī)Zabbix server是否已被監(jiān)控且“可用性”是否為綠色。查看最新數(shù)據(jù)是否能獲取到CPU、內(nèi)存、磁盤(pán)等基礎(chǔ)監(jiān)控項(xiàng)的數(shù)據(jù)。6.2 性能與安全初步調(diào)優(yōu)默認(rèn)安裝配置是為了兼容性性能上并非最優(yōu)。安裝后建議立即進(jìn)行幾項(xiàng)關(guān)鍵調(diào)優(yōu)1. Zabbix Server 配置調(diào)優(yōu)/etc/zabbix/zabbix_server.confStartPollers 預(yù)啟動(dòng)的輪詢(xún)器進(jìn)程數(shù)。監(jiān)控主機(jī)少于500臺(tái)設(shè)置50-100超過(guò)1000臺(tái)可以設(shè)置200-300。觀察Busy poller的百分比保持在80%以下。StartPreprocessors 預(yù)處理進(jìn)程如果用了很多依賴(lài)項(xiàng)或JavaScript預(yù)處理需要增加。默認(rèn)3可調(diào)到10-20。HistoryCacheSize和TrendCacheSize 歷史數(shù)據(jù)和趨勢(shì)數(shù)據(jù)緩存大小。公式HistoryCacheSize 監(jiān)控項(xiàng)數(shù)量 * 每天寫(xiě)入次數(shù) * 2天 * 1.2冗余。如果監(jiān)控項(xiàng)多務(wù)必調(diào)大否則會(huì)頻繁寫(xiě)入磁盤(pán)拖慢性能。例如1萬(wàn)個(gè)監(jiān)控項(xiàng)可設(shè)為128M或256M。Timeout 與Agent、DB等的通信超時(shí)。網(wǎng)絡(luò)不穩(wěn)定可適當(dāng)調(diào)高如Timeout10。2. 數(shù)據(jù)庫(kù)調(diào)優(yōu)MySQL/MariaDBZabbix的性能瓶頸90%在數(shù)據(jù)庫(kù)。必須調(diào)整my.cnf。[mysqld] innodb_buffer_pool_size 2G # 關(guān)鍵設(shè)置為可用內(nèi)存的50%-70%。如果服務(wù)器內(nèi)存16G可設(shè)為8G-10G。 innodb_log_file_size 512M innodb_flush_log_at_trx_commit 2 # 平衡性能與數(shù)據(jù)安全從1改為2可大幅提升寫(xiě)入性能。 max_connections 500 character_set_server utf8mb4 collation_server utf8mb4_bin修改innodb_log_file_size后需要安全地重建日志文件步驟稍復(fù)雜建議在初次安裝后、數(shù)據(jù)量不大時(shí)操作。3. 前端PHP調(diào)優(yōu)調(diào)整/etc/php-fpm.d/www.conf或?qū)?yīng)PHP版本配置pm.max_children 動(dòng)態(tài)模式下的最大子進(jìn)程數(shù)。根據(jù)服務(wù)器內(nèi)存調(diào)整每個(gè)PHP-FPM進(jìn)程約消耗30-50M內(nèi)存。4G內(nèi)存可設(shè)80-100。pm.start_servers/pm.min_spare_servers/pm.max_spare_servers 根據(jù)并發(fā)訪問(wèn)量調(diào)整。7. 常見(jiàn)問(wèn)題與故障排查實(shí)錄即使有了一鍵腳本在實(shí)際的離線環(huán)境中你仍可能遇到各種“驚喜”。下面是我在多次部署中踩過(guò)的坑和解決方法。7.1 安裝階段典型問(wèn)題問(wèn)題1執(zhí)行腳本時(shí)報(bào)錯(cuò)依賴(lài)包 xxx 需要 yyy 1.2.3但 yyy-1.2.2 將被安裝原因離線包倉(cāng)庫(kù)中的依賴(lài)包版本低于所需版本。這通常是因?yàn)闃?gòu)建機(jī)的YUM/APT源不是最新的或者下載時(shí)包含了錯(cuò)誤的倉(cāng)庫(kù)。解決檢查構(gòu)建機(jī)是否使用了正確的、版本最新的Zabbix官方源。在構(gòu)建機(jī)上嘗試手動(dòng)yum install你要的軟件看它實(shí)際拉取的版本是什么然后用yumdownloader或repotrack精確下載那個(gè)版本的包。最徹底的方法在構(gòu)建機(jī)上用Docker模擬一個(gè)純凈的目標(biāo)系統(tǒng)環(huán)境再執(zhí)行下載操作。問(wèn)題2安裝MySQL/MariaDB時(shí)服務(wù)啟動(dòng)失敗原因最常見(jiàn)的是/var/lib/mysql目錄權(quán)限不對(duì)或者之前有殘留數(shù)據(jù)。排查systemctl status mariadb # 查看詳細(xì)錯(cuò)誤 journalctl -xe -u mariadb # 查看系統(tǒng)日志 ls -la /var/lib/mysql # 檢查目錄權(quán)限應(yīng)為 mysql:mysql解決# 停止服務(wù) systemctl stop mariadb # 備份后清空數(shù)據(jù)目錄如果是全新安裝 mv /var/lib/mysql /var/lib/mysql.bak # 重新初始化數(shù)據(jù)庫(kù)謹(jǐn)慎會(huì)丟失所有數(shù)據(jù) mysql_install_db --usermysql --datadir/var/lib/mysql # 修復(fù)權(quán)限 chown -R mysql:mysql /var/lib/mysql # 再次啟動(dòng) systemctl start mariadb問(wèn)題3訪問(wèn)Zabbix Web頁(yè)面提示數(shù)據(jù)庫(kù)連接錯(cuò)誤原因Zabbix Server配置文件/etc/zabbix/zabbix_server.conf中的數(shù)據(jù)庫(kù)密碼錯(cuò)誤。數(shù)據(jù)庫(kù)沒(méi)有為zabbix用戶(hù)授權(quán)本地訪問(wèn)權(quán)限。數(shù)據(jù)庫(kù)服務(wù)沒(méi)啟動(dòng)。排查systemctl status mariadb確認(rèn)數(shù)據(jù)庫(kù)運(yùn)行。mysql -uzabbix -p用腳本中設(shè)置的密碼嘗試登錄。如果失敗檢查密碼和用戶(hù)權(quán)限。檢查/etc/zabbix/zabbix_server.conf中的DBPassword是否與數(shù)據(jù)庫(kù)中的一致。查看Zabbix Server日志tail -f /var/log/zabbix/zabbix_server.log通常會(huì)有明確的錯(cuò)誤信息。7.2 運(yùn)行階段典型問(wèn)題問(wèn)題4Zabbix Server日志中大量出現(xiàn)“cannot allocate memory”或“fork failed”原因系統(tǒng)內(nèi)存或進(jìn)程數(shù)不足。Zabbix Server的StartPollers等參數(shù)設(shè)置過(guò)高或者系統(tǒng)內(nèi)核參數(shù)vm.overcommit_memory、kernel.pid_max限制。解決臨時(shí)降低/etc/zabbix/zabbix_server.conf中的StartPollers、StartDiscoverers等進(jìn)程數(shù)。調(diào)整系統(tǒng)內(nèi)核參數(shù)需重啟生效# 編輯 /etc/sysctl.conf vm.overcommit_memory 1 # 允許內(nèi)存過(guò)量分配 kernel.pid_max 65535 # 增加最大進(jìn)程數(shù) # 執(zhí)行 sysctl -p 使生效最根本的為服務(wù)器增加物理內(nèi)存。問(wèn)題5Zabbix Web前端圖形亂碼或中文顯示為方框原因服務(wù)器缺少中文字體。解決在Zabbix Server所在機(jī)器上安裝中文字體并重新生成圖形緩存。# CentOS yum install -y wqy-microhei-fonts # 重啟Zabbix Server和Web服務(wù) systemctl restart zabbix-server php-fpm nginx # 也可以直接刪除圖形緩存讓其重新生成 rm -rf /var/lib/zabbix/*.png問(wèn)題6監(jiān)控?cái)?shù)據(jù)不更新Zabbix Agent狀態(tài)為“灰色”不支持原因Server和Agent之間網(wǎng)絡(luò)不通或者Agent配置的Hostname與Server端添加主機(jī)時(shí)填寫(xiě)的“主機(jī)名稱(chēng)”不匹配。排查在Server端執(zhí)行zabbix_get -s 客戶(hù)端IP -k agent.ping看是否能返回1。在客戶(hù)端檢查/etc/zabbix/zabbix_agent2.conf中的Hostname值。在Zabbix Web的“主機(jī)”配置中檢查“主機(jī)名稱(chēng)”是否與Agent配置文件中的Hostname完全一致大小寫(xiě)敏感。檢查客戶(hù)端防火墻是否放行了10050端口。為了方便查閱我將最常見(jiàn)的問(wèn)題和解決思路整理成了下表問(wèn)題現(xiàn)象可能原因排查命令/位置解決方案服務(wù)啟動(dòng)失敗1. 依賴(lài)缺失2. 配置文件錯(cuò)誤3. 端口占用systemctl status 服務(wù)名journalctl -xe -u 服務(wù)名netstat -tlnp | grep 端口號(hào)檢查對(duì)應(yīng)服務(wù)日志修正配置或解決沖突Web頁(yè)面502錯(cuò)誤1. PHP-FPM未運(yùn)行2. Nginx配置錯(cuò)誤systemctl status php-fpmnginx -t啟動(dòng)PHP-FPM檢查Nginx配置文件語(yǔ)法數(shù)據(jù)庫(kù)連接失敗1. 密碼錯(cuò)誤2. 用戶(hù)權(quán)限不足3. 數(shù)據(jù)庫(kù)服務(wù)未啟動(dòng)mysql -u用戶(hù) -p/var/log/zabbix/zabbix_server.log核對(duì)密碼授予權(quán)限啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)監(jiān)控?cái)?shù)據(jù)延遲高1.StartPollers不足2. 數(shù)據(jù)庫(kù)性能瓶頸3. 磁盤(pán)IO慢查看Server日志Busy poller比例監(jiān)控?cái)?shù)據(jù)庫(kù)服務(wù)器負(fù)載增加StartPollers優(yōu)化數(shù)據(jù)庫(kù)配置檢查磁盤(pán)客戶(hù)端顯示“不支持”1. 網(wǎng)絡(luò)不通2.Hostname不匹配3. 防火墻阻止zabbix_get -s IP -k agent.ping對(duì)比Web主機(jī)名與agent配置開(kāi)通防火墻端口確保主機(jī)名一致這個(gè)一鍵安裝腳本和配套的離線資源包是我在多次內(nèi)網(wǎng)部署中不斷打磨出來(lái)的成果。它解決的核心痛點(diǎn)就是“環(huán)境隔離”和“部署效率”。對(duì)于運(yùn)維團(tuán)隊(duì)來(lái)說(shuō)它意味著可以將Zabbix的部署時(shí)間從以“小時(shí)”甚至“天”為單位縮短到“分鐘”級(jí)并且能保證不同環(huán)境之間高度一致減少了大量重復(fù)勞動(dòng)和人為錯(cuò)誤。腳本本身是起點(diǎn)你可以基于它根據(jù)自己公司的網(wǎng)絡(luò)架構(gòu)、安全規(guī)范進(jìn)行二次開(kāi)發(fā)比如集成到內(nèi)部的CMDB系統(tǒng)或者與自動(dòng)化運(yùn)維平臺(tái)對(duì)接實(shí)現(xiàn)更廣泛的自動(dòng)化部署。本文還有配套的精品資源點(diǎn)擊獲取