zabbix安裝配置文檔 2php
一 zabbix-server 安裝配置(基礎配置) 2前端
二 zabbix agent安裝配置 5mysql
2.1 主動模式和被動模式 6linux
2.2 安裝配置zabbix_agent 12web
2.3 配置zabbix-server 前端(active)模式 18正則表達式
2.4 自動發現 18sql
2.5 自動註冊 21數據庫
附錄: 22json
1 自動發現(原理) 22vim
網絡發現簡介 22
2 自動發現(具體操做) 24
3 自動註冊 33
4 zabbix low-level discover zabbix批量部署必備 38
1. 概述 38
2. Discovery之文件系統 38
3. 自定義LLD規則 44
5 zabbix自定義自動發現服務(low-level-discovery)監控系統服務 47
1 ) 概述 47
2 ) LLD腳本 48
3) 添加模板和自動發現規則 52
6 解決現實中文亂碼: 65
7 zabbix_agent playbook 批量安裝 66
zabbix安裝配置文檔
# 軟件版本 4.0.4,172.20.50.11
# 參考地址 https://www.zabbix.com/download
# 導入repo包 rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm # 安裝配置數據庫 yum remove mariadb-libs -y # 上傳mysql相關包 mysql-community-client-5.7.22-1.el7.x86_64.rpm mysql-community-devel-5.7.23-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.23-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64.rpm mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-server-5.7.22-1.el7.x86_64.rpm
yum install * -y
vim /etc/my.cnf [mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock character_set_server = utf8 interactive_timeout = 120 wait_timeout = 120 symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] socket=/data/mysql/mysql.sock
# 在配置文件中[mysqld] 中添加skip-grant-tables 而且重啓mysqld服務,跳過受權表 FLUSH PRIVILEGES; GRANT ALL PRIVILEGES ON *.* TO 'zabbix'@'localhost' IDENTIFIED BY 'JkW&$y42PL5&y#cx'; GRANT ALL PRIVILEGES ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'JkW&$y42PL5&y#cx'; FLUSH PRIVILEGES; # 註釋 數據庫配置中skip-grant-tables 配置 # 建立zabbix庫 create database zabbix character set utf8 collate utf8_bin;
# 安裝zabbix相關包 yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent -y
# 初始化zabbix表結構 zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p JkW&$y42PL5&y#cx
[root@VM_4_84_centos mysql]# cat /etc/zabbix/zabbix_server.conf | egrep -v "^$|^#|#" LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid SocketDir=/var/run/zabbix DBName=zabbix DBUser=zabbix DBPassword=JkW&$y42PL5&y#cx DBSocket=/data/mysql/mysql.sock SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000
# 修改時區 vim /etc/httpd/conf.d/zabbix.conf php_value date.timezone Asia/Shanghai
# 啓動服務 systemctl restart zabbix-server zabbix-agent httpd systemctl enable zabbix-server zabbix-agent httpd
# 配置前端 http://172.20.50.11/zabbix
# 生成的配置信息 Database type MySQL Database server 172.20.50.11 Database port 3306 Database name zabbix Database user zabbix Database password ****************
Zabbix server 172.20.50.11 Zabbix server port 10051 Zabbix server name zabbix_server
# 配置信息路徑 Configuration file "/etc/zabbix/web/zabbix.conf.php" created.
# 初始帳號 Admin/zabbix
|
主動模式的流程:
客戶端每隔一段時間主動向服務端發起鏈接請求–>服務端收到請求,查詢客戶端須要取的item信息,發送給客戶端–>客戶端收集數據發送服務端–>結束。
被動模式的流程:
客戶端開一個端口默認10050,等待服務端來取數據,而後客戶端收集數據發送到服務端,而後結束。
zabbix agent檢測分爲主動(agent active)和被動(agent)兩種形式,主動與被動的說法均是相對於agent來討論的。
簡單說明一下主動與被動的區別以下:
主動:agent請求server獲取主動的監控項列表,並主動將監控項內須要檢測的數據提交給server/proxy
被動:server向agent請求獲取監控項的數據,agent返回數據。
zabbix agent通訊過程當中的協議均基於json格式,格式以下:
- "ZBXD\x01" (5 bytes) - data length (8 bytes). 1 will be formatted as 01/00/00/00/00/00/00/00 (eight bytes in HEX, 64 bit number) |
備註:爲了不內存耗盡,server限制每一個通訊鏈接最多使用128MB內存。
被動檢測:
server發起以下請求
<item key>\n
Aegent返回以下響應數據
<HEADER><DATALEN><DATA>[\0<ERROR>]
supported items通訊過程:
1) Server打開一個TCP鏈接
2) Server發送請求agent.ping\n
3) Agent接收到請求而且響應<HEADER><DATALEN>1
4) Server處理接收到的數據
關閉TCP鏈接:
not supported items通訊過程:
1) Server打開一個TCP鏈接
2) Server發送請求vfs.fs.size[/nono]\n
3) Agent接收請求而且返回響應數據 <HEADER><DATALEN>ZBX_NOTSUPPORTED\0Cannot obtain filesystem information: [2] No such file or directory
4) Server接收並處理數據, 將item的狀態改成「 not supported 」
5) 關閉TCP鏈接
主動檢測:
zabbix首先向ServerActive配置的IP請求獲取active items,獲取並提交active tiems數據值server或者proxy。zabbix多久獲取一次active items?它會根據配置文件中的RefreshActiveChecks的頻率進行,若是獲取失敗,那麼將會在60秒以後重試獲取ACTIVE ITEMS列表。
Agent請求:
<HEADER><DATALEN>{
"request":"active checks",
"host":"<hostname>"
}
Server響應列表:
<HEADER><DATALEN>{
"response":"success",
"data":[
{
"key":"log[/home/zabbix/logs/zabbix_agentd.log]",
"delay":30,
"lastlogsize":0,
"mtime":0
},
{
"key":"agent.version",
"delay":600,
"lastlogsize":0,
"mtime":0
},
{
"key":"vfs.fs.size[/nono]",
"delay":600,
"lastlogsize":0,
"mtime":0
}
]
}
|
|
備註:獲取到的items列表中的全部item屬性key, delay, lastlogsize ,mtime都必須存在,獲取列表的通訊過程以下:
1) Agent打開TCP鏈接(主動檢測變成Agent打開)
2) Agent請求items檢測列表
3) Server返回items列表
4) Agent 處理響應
5) 關閉TCP鏈接
6) Agent開始收集數據
7) 提交active items數據
Agent發送請求:
<HEADER><DATALEN>{ "request":"agent data", "data":[ { "host":"<hostname>", "key":"agent.version", "value":"2.4.0", "clock":1400675595, "ns":76808644 }, { "host":"<hostname>", "key":"log[/home/zabbix/logs/zabbix_agentd.log]", "lastlogsize":112, "value":" 19845:20140621:141708.521 Starting Zabbix Agent [<hostname>]. Zabbix 2.4.0 (revision 50000).", "clock":1400675595, "ns":77053975 }, { "host":"<hostname>", "key":"vfs.fs.size[/nono]", "state":1, "value":"Cannot obtain filesystem information: [2] No such file or directory", "clock":1400675595, "ns":78154128 } ], "clock": 1400675595, "ns": 78211329 } |
Server響應數據
{
"response":"success",
"info":"processed: 3; failed: 0; total: 3; seconds spent: 0.003534"
}
備註:若是有些數據提交失敗,好比host、item被刪除或者禁用,agent不會嘗試從新提交
主動檢測提交數據過程以下:
1) Agent創建TCP鏈接
2) Agent提交items列表收集的數據
3) Server處理數據,並返回響應狀態
4) 關閉TCP鏈接
被動模式agent配置:
[root@zabbix_client ]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
StartAgents=3
Server=172.20.50.11
ServerActive=172.20.50.11
Hostname=zabbix_client
HostMetadataItem=system.uname
systemctl restart zabbix-agent
由於zabbix監控模板默認使用的就是被動模式,因此zabbix-server端直接添加hosts默認使用的就是被動模式。
主動模式配置:
[root@zabbix_master zabbix-server-mysql-3.2.7]# grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
StartAgents=0
Server=172.20.50.11 # 注意,這裏雖然沒啥用,可是獲取能夠解決前端能夠蒐集數據可是顯示狀態爲紅色的bug
ServerActive=172.20.50.11
Hostname=172.20.50.11
Include=/etc/zabbix/zabbix_agentd.d/*.conf
客戶端agent模式,StartAgents=0設置爲0表示關閉被動模式,被監控端的 zabbix_agentd 不監聽本地端口,因此沒法在 netstat -tunpl 中查看到zabbix_agentd進程
取值範圍:0-100
默認值:3
zabbix啓動以後開啓被動監控的進程數量,若是設置爲0,那麼zabbix被動監控被禁用,而且不會監聽相應端口,也就是說10050端口不會開啓。
# 手動安裝zabbix_agent
tar xf zabbix_agents-4.0.0-centos7-amd64-openssl.tar.gz -C /opt/
mv /opt/zabbix_agents-4.0.0-centos7-amd64-openssl /opt/zabbix_agent
cd /opt/zabbix_agent
mkdir pids
mkdir log
useradd zabbix
chown -R zabbix.zabbix /opt/zabbix_agent
vim /etc/init.d/zabbix_agentd
#!/bin/bash
#
# chkconfig: - 90 10
# description: Starts and stops Zabbix Agent using chkconfig
# Tested on Fedora Core 2 - 5
# Should work on all Fedora Core versions
#
# @name: zabbix_agentd
# @author: Alexander Hagenah <hagenah@topconcepts.com>
# @created: 18.04.2006
#
# Modified for Zabbix 2.0.0
# May 2012, Zabbix SIA
#
# Source function library.
. /etc/init.d/functions
# Variables
# Edit these to match your system settings
# Zabbix-Directory
BASEDIR=/opt/zabbix_agent
# Binary File
BINARY_NAME=zabbix_agentd
# Full Binary File Call
FULLPATH=$BASEDIR/sbin/$BINARY_NAME
# config file
CONFIG=$BASEDIR/conf/zabbix_agentd.conf
# PID file
PIDFILE=/opt/zabbix_agent/pids/$BINARY_NAME.pid
# Establish args
ERROR=0
STOPPING=0
#
# No need to edit the things below
#
# application checking status
if [ -f $PIDFILE ] && [ -s $PIDFILE ]
then
PID=`cat $PIDFILE`
if [ "x$PID" != "x" ] && kill -0 $PID 2>/dev/null && [ $BINARY_NAME == `ps -e | grep $PID | awk '{print $4}'` ]
then
STATUS="$BINARY_NAME (pid `pidof $APP`) running.."
RUNNING=1
else
rm -f $PIDFILE
STATUS="$BINARY_NAME (pid file existed ($PID) and now removed) not running.."
RUNNING=0
fi
else
if [ `ps -e | grep $BINARY_NAME | head -1 | awk '{ print $1 }'` ]
then
STATUS="$BINARY_NAME (pid `pidof $APP`, but no pid file) running.."
else
STATUS="$BINARY_NAME (no pid file) not running"
fi
RUNNING=0
fi
# functions
start() {
if [ $RUNNING -eq 1 ]
then
echo "$0 $ARG: $BINARY_NAME (pid $PID) already running"
else
action $"Starting $BINARY_NAME: " $FULLPATH -c $CONFIG
touch /var/lock/subsys/$BINARY_NAME
fi
}
stop() {
echo -n $"Shutting down $BINARY_NAME: "
killproc $BINARY_NAME
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$BINARY_NAME
RUNNING=0
}
# logic
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $BINARY_NAME
;;
restart)
stop
sleep 10
start
;;
help|*)
echo $"Usage: $0 {start|stop|status|restart|help}"
cat <<EOF
start - start $BINARY_NAME
stop - stop $BINARY_NAME
status - show current status of $BINARY_NAME
restart - restart $BINARY_NAME if running by sending a SIGHUP or start if not running
help - this screen
EOF
exit 1
;;
esac
exit 0
chmod +x /etc/init.d/zabbix_agentd
cd zabbix_agentd/
mv userparameter_examples.conf userparameter_examples.conf.bak
mv serparameter_mysql.conf serparameter_mysql.conf.bak
[root@vm_110_2_centos conf]# cat /opt/zabbix_agent/conf/zabbix_agentd.conf
PidFile=/opt/zabbix_agent/pids/zabbix_agentd.pid
LogFile=/opt/zabbix_agent/logs/zabbix_agentd.log
LogFileSize=0
StartAgents=0
ServerActive=172.20.50.11
Server=172.20.50.11
Hostname=本機IP地址
Include=/opt/zabbix_agent/conf/zabbix_agentd/*.conf
UnsafeUserParameters=1
/etc/init.d/zabbix_agentd start
chkconfig zabbix_agentd on
1) 建立模板
建立一個主動模式的模板:
克隆一個模板,把全部的類型改成Zabbix agent(Active)主動模式:
克隆模板:Configuration–》Template–》Template OS Linux(選擇須要克隆的模板)–》Full clone(最下面)–》Template name:Template OS Linux Active–》Add
把這個模板軟鏈接的模板remove掉,,添加一個新的克隆的類型爲主動的。另外,克隆模板成功後,記得修改類型,改成主動模式。
zabbix自動發現主機,能夠在ansible安裝好zabbix客戶端後,服務器能直接發現客戶端
1)建立一個規則,名字自定義,ip範圍是想要發現的主機範圍。時間間隔,每多久發現一次。檢查,建議用uptime,這樣代表能用zabbix的自帶的鍵值都能監控到,就能夠添加該主機了。設置準則就不要用ip地址了,會出錯的。而後更新就能夠了。
2)接下來是操做,也就是你的動做主要要作什麼,我添加了3點,在操做細節那裏添加,分別是把發現的主機添加進來,第二點是發主機添加到Base Group組裏,第三點是給主機與一個模板關聯。最後點更新就能夠了。
zabbix客戶端搭建好後,自動註冊到zabbix服務端,這樣能夠下降zabbix服務端的負載。
網絡發現有什麼用?網絡發現怎麼配置?咱們帶着這兩個問題開始咱們的網絡發現之旅。好比小明有100臺服務器,不想一臺臺主機去添加,能不能讓zabbix自動添加主機呢,固然能夠,網絡發現即是這個功能,固然前提條件是全部服務器都已經安裝了agent或者snmp(其實也能夠不用,鑑於咱們大部分功能都用agent,因此請安裝上agent),server掃描配置好的ip段,自動添加host,自動給host link模板,自動加到主機組裏等等。網絡發現功能讓咱們能更快速的部署zabbix、簡化zabbix管理、而且在常常變更的環境裏面也不須要花太多的精力,畢竟網絡發現也能隨時變化。雖然網絡發現能幹不少事情,可是它沒法發現網絡拓撲。
zabbix網絡發現基於以下信息
ip範圍
可用的外部服務(FTP, SSH, WEB, POP3, IMAP, TCP, etc)
來自zabbix agent的信息
來自snmp agent的信息
網絡發現由兩個階段組成:discovery和actions
Discovery發現
zabbix按期掃描網絡發現規則中的ip範圍,每一個規則中都定義了一組須要檢測的服務,在這些ip範圍內一一掃描
網絡發現模塊每次檢測到service和host(ip)都會生成一個discovery事件,以下是事件
時間 |
條件 |
Service Up |
zabbix檢測到可用的service |
Service Down |
zabbix沒法檢測到service |
Host Up |
某個ip上至少有一個service是up狀態 |
Host Down |
全部service都無響應 |
Service Discovered |
一個service首次被發現或者在維護後重新歸隊 |
Service Lost |
service在up以後又丟失了 |
Host Discovered |
一個host首次被發現或者在維護後重新歸隊 |
Host Lost |
一個host在up以後又丟失了 |
Actions動做
zabbix全部action都是基於發現事件,例如:
發送通知
添加/移除主機
啓用/禁用主機
添加主機到組
從組中移除主機
主機link模板/unlink模板
執行遠程腳本命令
建立主機
discovery發現主機事件產生以後,接下來須要執行discovery action,在action中選擇添加主機操做、而且將主機加入某個組以及link某個模板等等。更具體操做請關注下一篇文章。那麼主機名怎麼定義呢?首先監控端(server/proxy)經過ip泛解析主機名(若是失敗了,不會從新嘗試),若是解析成功了,那麼zabbix將會使用這個主機名,不然直接使用ip地址。若是主機名相同怎麼辦?好比都叫ttlsa-server,那麼第一臺主機名會定義爲ttlsa-server,第二臺爲ttlsa-server_2,第三臺爲ttlsa-server_3,以此類推。action配置裏的條件包含設備類型、IP、狀態、uptime/downtime等等。
添加主機接口
主機接口規則以下:
服務檢測 - 例如,成功檢測到一個SNMP服務,那麼建立snmp接口
若是主機同時UIzabbix agent和snmp請求做出響應,那麼會同時建立這兩種接口
若是使用agent或者snmp做爲惟一性指標,先經過哪一個接口發現主機,那麼哪一個接口就做爲默認接口,其餘的做爲附加接口。
若是一開始只響應zabbix agent的檢測,那麼他只會建立agent接口。若是後面響應了snmp檢測,那麼他又會增長snmp接口
若是有三臺獨立的主機A\B\C,一開始使用IP地址來做爲惟一標識。能夠看到discovery有三條記錄。此時咱們修改發現規則,讓他們有相同的惟一標識。例如自定義一個keysystem.dis,這個key統一輸出值"ttlsa",這樣A的接口成了默認的,B和C都變成了附加到A主機上。咱們能夠發現一個很明顯的變化。在discovery接口中依舊有3條記錄,可是"discovered device"這列顯示的A主機的接口,」monitored host「這列顯示的都是A主機的名稱,」Uptime/downtime「這列只有A主機有值,B和C都爲空。從這裏咱們能看到惟一標識是多重要,若是惟一標識不是惟一,那麼有的主機會被認爲是同一臺
在瞭解了《網絡發現規則》是什麼以後,咱們開始配置。首先,咱們須要定義發現規則,用於掃描。步驟以下
第一步
Configuration >>Discovery>>Create rule,編輯網絡發現規則
如上配置,zabbix每30秒會掃描10.9.7.88與10.9.32.106-107。會使用key:agent.uanme來判斷客戶端是否存在,而且以IP地址做爲惟一性的標識。
規則屬性
屬性 |
描述 |
Name |
規則名稱,惟一 |
Discovery by proxy |
誰執行當前發現規則: |
IP range |
發現規則中的ip範圍,格式以下 |
Delay (in sec) |
規則執行完畢以後,要多久才執行下一次。 |
Checks |
支持的checks: SSH, LDAP, SMTP, FTP, HTTP, HTTPS, POP, NNTP, IMAP, TCP, Telnet, Zabbix agent, SNMPv1 agent, SNMPv2 agent, SNMPv3 agent, ICMP ping. |
Device uniqueness criteria |
設備惟一標識: |
Enabled |
是否啓用當前規則 |
第二步
Monitorning>>Discovery,能夠看到已經發現了兩臺主機,ip地址做爲他們的惟一標識。確保這個標識的惟一性,不然zabbix會認爲他們是一臺主機。
第三步
目前僅僅是能夠找到主機,並未自動添加到Host中,接下來完成幾個步驟:
1. 加入到Linux Servers組
2.Linux link linux模板、windows link windows模板
3. 主機在線時長10分鐘的主機添加到HOST中
4. 離線1天以上的主機從Host中移除
建立Action
咱們須要建立兩個Action,一份正對windows,一份針對Linux。咱們下面演示一下Linux服務器
Action添加主機
configuration>>action>>Event source(選discover)>>create action
首先,配置名稱,以及定義消息內容,這些使用默認的便可
Action
條件配置
操做
回到HOST中,咱們能夠發現已經把主機加到列表裏了,而且也Linux了模板以及加到了相應的組裏
移除主機
configuration>>action>>Event source(選discover)>>create action
首先,配置名稱,以及定義消息內容,這些使用默認的便可
移除主機
action
條件
動做
移除主機我就不演示了。
經過使用discovery,zabbix可以自動完成添加到host等等一系列動做,這一切都是基於這個規則來實現的。那麼若是離開這個規則,我能完成這一系列動做嗎?答案是確定的,請關注下一篇文章《Active agent自動註冊》
1. 概述
上一篇內容《zabbix自動發現配置》,大概內容是zabbix server去掃描一個網段,把在線的主機添加到Host列表中(若是是使用zabbix agent去檢測,適用於被動模式)。咱們本篇內容與上篇相反,此次是Active agent主動聯繫zabbix server,最後由zabbix server將這些agent加到host裏。對於須要部署特別多服務器的人來講,這功能至關給力。全部服務器批量裝好zabbix agent,server配置好trigger,全部的服務器都配置好了,很是快速。
2. 配置
2.1配置文件修改
指定server ip
1 2 |
# cat /usr/local/zabbix-2.2.2/etc/zabbix_agentd.conf | grep -E ^ServerActive ServerActive=66.175.222.232 |
修改Hostname
1 2 |
# cat /usr/local/zabbix-2.2.1/etc/zabbix_agentd.conf | grep -E ^Hostname Hostname=auto-reg-for-ttlsa-01 |
關於主機名:若是zabbix_agentd.conf配置有定義Hostname,那麼zabbix會使用這個Hostname命名,不然agent的主機名(hostname得來的)
修改metadataitem
1 2 |
cat /usr/local/zabbix-2.2.1/etc/zabbix_agentd.conf | grep HostMetadataItem= HostMetadataItem=system.uname |
2.2 配置action
步驟:configuration>>action>>Event source(選擇Auto registration)>>Create Action,咱們按以下步驟來定義個action
2.2.1 action選項卡
定義Action名稱,以及發送消息的主題和內容,使用默認的就好了
2.2.2 Conditions選項卡
Host metadata包含Linux字符的主機將會觸發 2.2.3的操做,什麼是metadata,文章的下半段會專門講解。
2.2.3 operations選項卡
知足條件的active host發起請求,server會完成三個動做:
把agent加到host列表
把agent加入linux servers組
agent主機link模板Template OS linux
3. 查看結果
查看/tmp/zabbix_server.log咱們能看到以下內容:
1 |
16585:20150203:161110.910 enabling Zabbix agent checks on host "auto-reg-for-ttlsa-01": host became available |
看到如上內容,代表host增長成功,此時此刻的host列表以下:
4. HostMetadataItem與HostMetadata
做用:用於標示主機,經過該符號可以把主機區別開來。好比咱們常常用它來區分linux與windows系統,這樣才能分別給他們設置組與template等等
4.1 HostMetadataItem用法
1 |
HostMetadataItem=system.uname |
它的值來之key
4.2 HostMetadata用法
1 |
HostMetadata: Linux hehehehehehehehe xxxxx |
他的值是直接定義的
經過使用各式各樣的metadata咱們能夠用於區分各個主機,來達到咱們各類需求。
本篇文章是zabbix發現的最後一篇,回顧一下前面幾篇文章
《zabbix發現介紹》整個功能的介紹
《zabbix發現配置》server經過配置好的規則,自動添加host、group、template
《zabbix Active agent自動註冊》與discovery相反,功能基本相同,active聯繫server,server自動添加host、group、template
以上目的都是發現host、添加host,本文的low-level discovery更底層點,用於發現item、trigger、graph等等。咱們最經常使用如:filesystem(如/、/home、/proc、C:、D:等),network(eth0,eth1等)
衆多服務器,不免系統以及分區會有所不一樣。通常存在linux和windows兩種系統,linux下分區有/、/data、/proc等等,windows有C:D:E:等,A服務器有/data分區,B服務器可能有/site分區。他有什麼分區,我便監控什麼分區,這就是low-level discovery的功能。
2.1 建立模板
建立模板A_Template_For_Discovery,.....過程省略....
2.2 配置discovery規則
configuration>>templates>>找到模板「A_Template_For_Discovery」>>Discovery(0)>>Create discovery rule
屬性說明:
Keep lost resources period(in days):數據保留天數,默認30天
Fileter:Macro爲{#FSNAME},key 「vfs.fs.discovery」返回json數據列表,裏面內容爲{#FSNAME}做爲key,/、/data、C:等等做爲value。regext可使用表達式,例如"^/data|/C:",若是想經過{#FSTYPE}來過濾,那麼Macro寫{#FSTYPE},regexp寫^(ext2|ext3|swap)$,或者引入zabbix中定義好的的正則表達式,@表達式名稱。關於《zabbix正則表達式》請繼續關注ttlsa。
2.3 建立Item prototypes
其實就是一個建立一個item,configuration>>templates>>找到模板「A_Template_For_Discovery」>>Discovery(1)>>find file system>>Item prototypes (0)>>create Item prototypes
2.4 建立Trigger
當剩餘量小於20%觸發warnning
configuration>>templates>>找到模板「A_Template_For_Discovery」>>Discovery(1)>>find file system>>Trigger prototypes (0)>>Create trigger prototypes
與普通的trigger區別在{#FSNAME}
2.4 建立graph
繪製簡單圖表
configuration>>templates>>找到模板「A_Template_For_Discovery」>>Discovery(1)>>find file system>>Graph prototypes (0)>>Create Graph prototypes
系統已經內建了文件系統的{#FSNAME},網絡的{#IFNAME},由於業務的特殊性,咱們如何定義咱們本身須要的名稱呢?
編寫腳本,腳本輸出json數據,包含key和value
腳本加入zabbix_agentd.conf UserParameter
重啓zabbix_agentd
使用定義好的名稱配置low-level discovery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/perl
$first = 1; print "{\n"; print "\t\"data\":[\n\n";
for (`cat /proc/mounts`) { ($fsname, $fstype) = m/\S+ (\S+) (\S+)/; $fsname =~ s!/!\\/!g;
print "\t,\n" if not $first; $first = 0;
print "\t{\n"; print "\t\t\"{#FSNAME}\":\"$fsname\",\n"; print "\t\t\"{#FSTYPE}\":\"$fstype\"\n"; print "\t}\n"; }
print "\n\t]\n"; print "}\n"; |
執行後獲得以下數據,是json格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
{ "data":[
{ "{#FSNAME}":"\/", "{#FSTYPE}":"rootfs" } , { "{#FSNAME}":"\/proc", "{#FSTYPE}":"proc" } , { "{#FSNAME}":"\/sys", "{#FSTYPE}":"sysfs" } , { "{#FSNAME}":"\/dev", "{#FSTYPE}":"devtmpfs" } , { "{#FSNAME}":"\/dev\/pts", "{#FSTYPE}":"devpts" } , { "{#FSNAME}":"\/dev\/shm", "{#FSTYPE}":"tmpfs" } , { "{#FSNAME}":"\/", "{#FSTYPE}":"ext4" } , { "{#FSNAME}":"\/proc\/bus\/usb", "{#FSTYPE}":"usbfs" } , { "{#FSNAME}":"\/proc\/xen", "{#FSTYPE}":"xenfs" } , { "{#FSNAME}":"\/proc\/sys\/fs\/binfmt_misc", "{#FSTYPE}":"binfmt_misc" } ] } |
更多參考
http://blog.51cto.com/dyc2005/2178939
https://www.zabbix.com/documentation/3.4/zh/manual/discovery/low_level_discovery
因爲工做關係好久沒有更新博客了,本文基於生產配置,是zabbix系列的另外一補充;本次要講的是zabbix Low-level discovery簡稱(LLD),咱們在配置items(監控項)時,有時須要對相似的Items進行添加,換句話說,多臺機器上的某一監控具備相似的items,如系統開放的服務,再如磁盤分區,網卡名稱等,後兩種zabbix已經自帶,今天咱們以自定義監控每一個系統開放的服務來講明 LLD的使用邏輯;
和普通items獲取不一樣的是,LLD 腳本在獲取返回時,格式必須是json形式;
和自動發現不一樣的是,自動發現經過網絡發現設備;而LLD是針對主機或模板中用來自動發現定義的items和添加觸發器和圖形的;
本次測試操做基於zabbix3.4.4 本文中的相關腳本和模板下載
1、獲取開放的服務
任何獲取items都要基於程序腳本,LLD發現也不例外,如下是獲取系統開放服務腳本discovery_services.sh
# cat /usr/local/zabbix-3.4.4/scripts/discovery_services.sh
#!/bin/bash
proarray=($(find /var/run/ -name "*.pid" 2> /dev/null||egrep -v '(rpc|php_daemon|haldaemon|irqbalance|console-kit-daemon)' |awk -F'/' '{print $NF}'|awk -F'.' '{print $1}')) # 排除不監控的服務
length=${#proarray[@]}
printf "{\n"
printf '\t'"\"data\":["
printf "\t"
printf '\n\t\t{'
printf "\"{#PRO_NAME}\":\"iptables\"}" #必需要添加的iptables
printf ","
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf "\"{#PRO_NAME}\":\"${proarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
說明:以上腳本基於 /var/run下的pid進行監控開放的服務,因此若是是公司運維人員自已經開發的管理腳本服務,pid文件請按默認的放到/var/run下 ,這樣就不會漏掉,再說大部分系統或知名程序都遵照這一規定,你爲何不能遵照呢?
在一臺監控機器上執行以下:
記住這裏的{#PRO_NAME} 這個就是自動發現規則中的宏變量;另外這個腳本返回的是json格式;
2、檢查系統狀態
對獲取的服務進行檢查
# cat /usr/local/zabbix-3.4.4/scripts/program_status.sh
#!/bin/bash
procjetName="${1:-NULL}"
LOCK_PATH="/var/lock/subsys"
RUN_PATH="/var/run"
ret_ok=1
ret_critical=3
ret_unknown=4
if [[ ${procjetName} == "NULL" ]] ; then
echo ${ret_unknown}
fi
if [ -f "${LOCK_PATH}/${procjetName}" ] || [ -f "${RUN_PATH}/${procjetName}.pid" ] || [ -f "${RUN_PATH}/${procjetName}/${procjetName}.pid" ] ; then
echo ${ret_ok}
else
echo ${ret_critical}
fi
以上腳本檢查若是服務存在則返回1 不然返回 3 ,若是服務不存在則返回4
檢查的原則就是在/var/run/下是否有和服務同名的pid文件存在,或/var/run/服務/服務.pid存在,對於像iptabls這種則檢查 /var/run/subsys/服務.pid 三種狀況知足一種便可;
運行效果以下:
對iptables服務檢查 返回 1說明 iptables正常
關閉iptables 再次進行檢查:
而對httpd服務進行檢查,因爲本機根本沒有httpd服務,因此返回的是3
3、定義items
# cat /usr/local/zabbix-3.4.4/etc/zabbix_agentd.conf.d/LLD_Services.conf
UserParameter=services.scan,/bin/bash /usr/local/zabbix-3.4.4/scripts/discovery_services.sh
UserParameter=services.status[*],/bin/bash /usr/local/zabbix-3.4.4/scripts/program_status.sh $1
這裏須要在web頁上添加,和添加items很相似;
1、建立模板
進入web端;單擊 配置--模板--配置模板--建立模板-- 這裏模板名叫 「Ickey Services status」 --建立應用集("Services_status") 如圖:
2、建立自動發現規則(LLD)
如上圖點自動發現規則在模板中建立 自動發現規則 -- 建立自動發現規則 如圖:
這裏須要注意的是 鍵值: servies.scan 即item 是在2.3小節的配置文件中定義的,不可亂寫
再配置上圖中的過濾器 配置變量(宏)如圖:
此處的{#PRO_NAME}就是上面2.1節中腳本返回的變量; -- 保存
3、建立 配置 監控項原型
如圖:
填寫名稱,等相關信息如圖:
此處須要注意的$1 和鍵值 是 2.3 定義items中的$1 也便是服務名; 保存;
4、建立觸發器類型
如圖:
說明:觸發器名稱:便是 「服務名」 is down
表達式的意思就是 當發現某服務返回的值不是 1時發出警告
保存 這個 模板中的自動發現規則 就完成啦
可是這裏存在一個問題,當咱們機器上yum工具時,會在/var/run下生成yum.pid這樣就會偵測到一個新服務,yum,但yum執行完後yum.pid會被刪除,此時觸發器就會報yum is down,爲了解決這類問題,咱們能夠修改觸發器報警策略,修改爲以下:
意思就是,最後狀態不是1 同時一小時前的狀態是1;這樣那此在/var/run生成臨時pid的程序就不會被觸發;
接下來就是在主機上應用模板,能夠批量添加;這裏就忽略了;
5、測試
看下效果圖:
能夠看到此主機應用了模板後已經能夠拿到監控項數據了,咱們來關閉這臺主機的防火牆服務試試,看看觸發器是否正常;
如圖:
再把iptables服務啓動
能夠看到服務關閉和啓動能夠報警與恢復;至此自動發現服務已經能夠正常使用啦!經過這個實例,但願你們能理解自動發現規則的原理邏輯!本文基於生產故有些截圖帶有塗;主要用於備忘與分享,若有錯誤之處歡迎留言!
中文顯示亂碼 --> Windows 系統獲取字體 --> 上傳到zabbix服務器 --> 替換字體 --> 問題解決
windows --> 控制面板 --> 字體 --> simkai.ttf (這個字體看着順眼一些)-->上傳到zabbix_server 中
cd /usr/share/fonts/dejavu; mv DejaVuSans.ttf DejaVuSans.ttf.bak # 這個字體是zabbix正在使用的字體
cp /root/ simkai.ttf /usr/share/fonts/dejavu/DejaVuSans.ttf
使用playbook線上環境