zabbix自动化监控基础
zabbix安装配置文档 2
一 zabbix-server 安装配置(基础配置) 2
二 zabbix agent安装配置 5
2.1 主动模式和被动模式 6
2.2 安装配置zabbix_agent 12
2.3 配置zabbix-server 前端(active)模式 18
2.4 自动发现 18
2.5 自动注册 21
附录: 22
1 自动发现(原理) 22
网络发现简介 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安装配置文档
一 zabbix-server 安装配置(基础配置)
# 软件版本 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
|
二 zabbix agent安装配置
2.1 主动模式和被动模式
主动模式的流程:
客户端每隔一段时间主动向服务端发起连接请求–>服务端收到请求,查询客户端需要取的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端口不会开启。
2.2 安装配置zabbix_agent
# 手动安装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
2.3 配置zabbix-server 前端(active)模式
1) 创建模板
创建一个主动模式的模板:
克隆一个模板,把所有的类型改为Zabbix agent(Active)主动模式:
克隆模板:Configuration–》Template–》Template OS Linux(选择需要克隆的模板)–》Full clone(最下面)–》Template name:Template OS Linux Active–》Add
把这个模板软连接的模板remove掉,,添加一个新的克隆的类型为主动的。另外,克隆模板成功后,记得修改类型,改为主动模式。
2.4 自动发现
zabbix自动发现主机,可以在ansible安装好zabbix客户端后,服务器能直接发现客户端
1)创建一个规则,名字自定义,ip范围是想要发现的主机范围。时间间隔,每多久发现一次。检查,建议用uptime,这样表明能用zabbix的自带的键值都能监控到,就可以添加该主机了。设置准则就不要用ip地址了,会出错的。然后更新就可以了。
2)接下来是操作,也就是你的动作主要要做什么,我添加了3点,在操作细节那里添加,分别是把发现的主机添加进来,第二点是发主机添加到Base Group组里,第三点是给主机与一个模板关联。最后点更新就可以了。
2.5 自动注册
zabbix客户端搭建好后,自动注册到zabbix服务端,这样可以降低zabbix服务端的负载。
附录:
1 自动发现(原理)
网络发现简介
网络发现有什么用?网络发现怎么配置?我们带着这两个问题开始我们的网络发现之旅。比如小明有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都为空。从这里我们能看到唯一标识是多重要,如果唯一标识不是唯一,那么有的主机会被认为是同一台
在了解了《网络发现规则》是什么之后,我们开始配置。首先,我们需要定义发现规则,用于扫描。步骤如下
2 自动发现(具体操作)
第一步
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自动注册》
3 自动注册
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我们可以用于区分各个主机,来达到我们各种需求。
4 zabbix low-level discover zabbix批量部署必备
1. 概述
本篇文章是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等)
2. Discovery之文件系统
众多服务器,难免系统以及分区会有所不同。一般存在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
3. 自定义LLD规则
系统已经内建了文件系统的{#FSNAME},网络的{#IFNAME},因为业务的特殊性,我们如何定义我们自己需要的名称呢?
编写脚本,脚本输出json数据,包含key和value
脚本加入zabbix_agentd.conf UserParameter
重启zabbix_agentd
使用定义好的名称配置low-level discovery
3.1 脚本范例
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"; |
3.2 结果范例
执行后得到如下数据,是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
5 zabbix自定义自动发现服务(low-level-discovery)监控系统服务
1 ) 概述
由于工作关系很久没有更新博客了,本文基于生产配置,是zabbix系列的另一补充;本次要讲的是zabbix Low-level discovery简称(LLD),我们在配置items(监控项)时,有时需要对类似的Items进行添加,换句话说,多台机器上的某一监控具有类似的items,如系统开放的服务,再如磁盘分区,网卡名称等,后两种zabbix已经自带,今天我们以自定义监控每个系统开放的服务来说明 LLD的使用逻辑;
和普通items获取不同的是,LLD 脚本在获取返回时,格式必须是json形式;
和自动发现不同的是,自动发现通过网络发现设备;而LLD是针对主机或模板中用来自动发现定义的items和添加触发器和图形的;
本次测试操作基于zabbix3.4.4 本文中的相关脚本和模板下载
2 ) LLD脚本
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
3) 添加模板和自动发现规则
这里需要在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服务启动
可以看到服务关闭和启动可以报警与恢复;至此自动发现服务已经可以正常使用啦!通过这个实例,希望大家能理解自动发现规则的原理逻辑!本文基于生产故有些截图带有涂;主要用于备忘与分享,如有错误之处欢迎留言!
6 解决现实中文乱码:
中文显示乱码 --> 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
7 zabbix_agent playbook 批量安装
使用playbook线上环境