一、自定义监控项
1.1自定义监控项原理
1)先明确获取监控指标数据的命令或脚本;
2)在被监控主机配置文件子目录(/etc/zabbix/zabbix_agent2.d/
)中创建以.conf后缀
的监控项配置文件,自定义获取监控指标数据的键值;
#监控项配置文件内容格式
UserParameter=键值名,获取值的命令/脚本路径
#用逗号隔开
3)在服务端Web管理页面中依次添加
模板 - 监控项 - 触发器 - 图形
4)关联监控主机和监控模板。
1.2 Zabbix监控Linux TCP连接状态实例
准备脚本
#!/bin/bash
tcp_conn_status(){
TCP_STAT=$1
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/tcp_conn.txt
TCP_NUM=$(grep "$TCP_STAT" /tmp/tcp_conn.txt | cut -d ' ' -f2)
if [ -z $TCP_NUM ];then
TCP_NUM=0
fi
echo $TCP_NUM
}
main(){
case $1 in
tcp_status)
tcp_conn_status $2;
;;
esac
}
main $1 $2
测试脚本
[root@localhost zabbix]# bash tcp_status.sh tcp_status ESTAB
2
[root@localhost zabbix]# bash tcp_status.sh tcp_status TIME-WAIT
72
[root@localhost zabbix]# chmod +x tcp_status.sh
修改客户端配置文件
[root@localhost etc]# vim zabbix_agentd.conf
UserParameter=linux_tcp_status[*],/usr/bin/bash /data/tcp_status.sh $1 $2
重启服务
[root@localhost etc]# systemctl restart zabbix-agent.service
[root@localhost etc]# systemctl status zabbix-agent.service
在主服务器上验证
[root@localhost ~]#zabbix_get -s 192.168.91.102 -p 10050 -k "linux_tcp_status["tcp_status","TIME-WAIT"]"
22
[root@localhost ~]#zabbix_get -s 192.168.91.102 -p 10050 -k "linux_tcp_status["tcp_status","ESTAB"]"
4
在web界面建立模板
类型通过检测模式来更改(分为主动式和被动式),还有默认的Zabbix客户端类型
继续添加监控项
如果是类似监控项可以选择克隆修改名称和键值即可使用设置触发器 添加图形
1.3 Zabbix监控nginx实例
安装nginx
[root@localhost data]# yum install epel-release.noarch -y
[root@localhost data]# yum install nginx -y
修改配置文件
[root@localhost data]# vim /etc/nginx/nginx.conf
location /status {
stub_status;
}
[root@localhost data]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost data]# systemctl restart nginx
准备脚本
#!/bin/bash
nginx_status_fun(){ #函数内容
NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号
NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令
nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){ #获取nginx_reading状态的数量
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
esac
}
main(){ #主函数内容
case $1 in #分支结构,用于判断用户的输入而进行响应的操作
nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数
nginx_status_fun $2 $3;
;;
*) #其他的输入打印帮助信息
echo $"Usage: $0 {nginx_status key}"
esac #分支结束符
}
main $1 $2 $3
测试脚本
[root@localhost data]# bash nginx.sh nginx_status 80 active
1
修改zabbix_agent配置文件
[root@localhost ~]# vim /apps/zabbix/etc/zabbix_agentd.conf
UserParameter=nginx_status[*],/usr/bin/bash /data/nginx.sh $1 $2 $3
在主服务器上测试
[root@localhost ~]#zabbix_get -s 192.168.91.102 -p 10050 -k "nginx_status["nginx_status","80","active"]"
1
web上操作
1.4 snmp监控实例
下载snmp
[root@s1 ~]# yum -y install net-snmp net-snmp-utils
修改配置文件
vim /etc/snmp/snmpd.conf
# sec.name source community
com2sec notConfigUser default 123456 #第一步:设置团体认密码,默认为public
s
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1 #创建一个view,并对其授权可访问的OID范围
view systemview included .1. #自定义授权,否则zabbix server无法获取数据
access notConfigGroup “” any noauth exact systemview none none #将组notConfigGroup关联至systemview 从而完成对组的授权
如果修改了密码需要在web上进行修改
主服务器进行测试
#在主服务器上 查看内储存
snmpwalk -v 2c -c public 192.168.10.10 .1.3.6.1.4.1.2021.4.4.0
Tip:snmp信息解释
CPU 负载:
1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1
5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2
15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3
内存使用:
Total Swap Size: .1.3.6.1.4.1.2021.4.3.0
Available Swap Space: .1.3.6.1.4.1.2021.4.4.0
Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0
Total RAM used: .1.3.6.1.4.1.2021.4.6.0
Total RAM Free: .1.3.6.1.4.1.2021.4.11.0
Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0
Total RAM Buffered: .1.3.6.1.4.1.2021.4.14.0
Total Cached Memory: .1.3.6.1.4.1.2021.4.15.0
硬盘使用:
Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1
Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1
Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1
Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1
Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1
Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1
Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1
系统信息:
sysDescr 1.3.6.1.2.1.1.1
sysObjectID 1.3.6.1.2.1.1.2
sysUpTime 1.3.6.1.2.1.1.3
sysContact 1.3.6.1.2.1.1.4
sysName 1.3.6.1.2.1.1.5
CPU 信息:
percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0
raw user cpu time: .1.3.6.1.4.1.2021.11.50.0
percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0
raw system cpu time: .1.3.6.1.4.1.2021.11.52.0
percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0
raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0
raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0
web操作
修改时间不然时间太长
1.5 邮件报警思路
1)在服务端web管理页面 [管理]-[报警媒介类型]中设置 媒介类型和报警消息内容;
2)在[User Settings] - [Profile] - [报警媒介] 中设置 类型、收件人、启用时间、严重级别;
3)在[配置] - [动作] - [触发动作] 中添加报警触发条件和操作内容;
4)测试。
可以直接修改 Email
名称:可以自定义
SMTP服务器: 写你对应邮箱的服务器,生产环境需要询问管理邮箱服务的同事
设置 zabbix 的用户
触发器 要和 zabbix 的用户关联
设置动作
注意 计算方式 不要使用 和 和是且的意思 修改监控项
1.6 zabbix自愈
当zabbix 监控到指定的监控项异常的时候,通过指定的操作使故障自动恢复,通常是重启服务等一些简单的操作,也可以调用脚本执行比较复杂的操作。
设置监控项和触发器,新建动作,在触发条件里面添加操作,在远程主机通过zabbix 客户端执行命令
1.开启zabbix sudo权限
2.配置允许允许特殊字符
3.配置远程命令
4.验证和测试
zabbix agent需要开启远程命令执行
vim /etc/zabbix/zabbix_agentd.conf
73 EnableRemoteCommands=1 #开启远程执行命令
287 UnsafeUserParameters=1 #允许远程执行命令的时候使用不安全的参数(特殊字符串)
root@zabbix-node4:~# systemctl restart zabbix-ag
zabbix用户授权
如果zabbix agent是使用zabbix用户启动的,那么要在zabbix 用户授权使用特权命令,负责有些命令zabbix没有权限执行,会导致定义好的自治愈策略因为权限拒绝为执行失败
[root@localhost etc]# vim /etc/sudoers
zabbix ALL=(ALL) NOPASSWD: ALL
创建动作
配置--动作--创建动作
二、 Zabbix批量添加主机
通过API,实现完全自动化添加删除agent、关联模板等操作
获取token
需要指定用的账户名 密码和id
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1
}' http://192.168.10.20/zabbix/api_jsonrpc.php
输出结果
[root@localhost ~]# curl -s -X POST -H 'Content-Type:application/json' -d '
> {
> "jsonrpc": "2.0",
> "method": "user.login",
> "params": {
> "user": "Admin",
> "password": "zabbix"
> },
> "id": 1
> }' http://192.168.10.20/zabbix/api_jsonrpc.php
{"jsonrpc":"2.0","result":"548e1e120bad44c714c9d46df49c751c","id":1}
返回值是548e1e120bad44c714c9d46df49c751c
2.1 添加单台主机
2.1.1 不带proxy 代理
配置解释
通过API添加主机命令格式:
API添加主机为预先知道要添加的主机IP、预先安装并配置好zabbix agent、预先知道要关联的模板ID/组ID等信
息,然后同API提交请求添加
# curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create", #定义方法,N多钟
"params": {
"host": "API Add Host Test", #自定义添加后的agent的名称
"interfaces": [
{
"type": 1, #类型为1表示agent,2是SNMP,3是IMPI,4是JMX
"main": 1, #主要接口
"useip": 1, #0是使用DNS,1是使用IP地址
"ip": "172.31.0.24", #添加的zabbix agent的IP地址
"dns": "",
"port": "10050" #agent端口
}
],
"groups": [
{
"groupid": "2" #添加到的组的ID
}
],
"templates": [
{
"templateid": "10001" #关联的模板的ID
}
]
},
"auth": "977781251d1222ebead6f05da1a9ec4d",
"id": 1
}' http://172.31.0.101/zabbix/api_jsonrpc.php | python3 -m json.tool
输出结果
[root@localhost ~]# curl -s -X POST -H 'Content-Type:application/json' -d '
> {
> "jsonrpc": "2.0",
> "method": "host.create",
> "params": {
> "host": "192.168.91.102",
> "interfaces": [
> {
> "type": 1,
> "main": 1,
> "useip": 1,
> "ip": "192.168.91.102",
> "dns": "",
> "port": "10050"
> }
> ],
> "groups": [
> {
> "groupid": "15"
> }
> ],
> "templates": [
> {
> "templateid": "10273"
> }
> ]
> },
> "auth": "689e61ccf47b1e634f40b27454222272",
> "id": 1
> }' http://192.168.91.100/zabbix/api_jsonrpc.php | python -m json.tool
{
"id": 1,
"jsonrpc": "2.0",
"result": {
"hostids": [
"10292"
]
}
}
2.1.2 使用代理
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "192.168.91.102",
"proxy_hostid": "10274",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "192.168.91.102",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "15"
}
],
"templates": [
{
"templateid": "10273"
}
]
},
"auth": "689e61ccf47b1e634f40b27454222272",
"id": 1
}' http://192.168.91.100/zabbix/api_jsonrpc.php | python -m json.tool
2.1.3 批量添加
cat zabbix-add-host.sh
#!/bin/bash
IP="
192.168.10.15
192.168.10.20
192.168.10.30
192.168.10.40
"
for i in ${IP};do
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'${i}'",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "'${i}'",
"name": "ky36_'${i}'",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "15"
}
],
"templates": [
{
"templateid": "10273"
}
]
},
"auth": "689e61ccf47b1e634f40b27454222272",
"id": 1
}' http://192.168.10.10/zabbix/api_jsonrpc.php | python -m json.tool