监控一台主机
被监控的机器需要安装zabbix-agent,agent跟server保持版本一致
#下载客户端zabbix-agent
方法一;
[root@web01 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-agent-5.0.36-1.el7.x86_64.rpm
方法二: 下载源
[root@web01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
#安装
[root@web01 ~]# yum install -y zabbix-agent
# 修改配置文件
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=172.16.1.71
Hostname=web01
# 启动并加入开机自启
[root@web01 ~]# systemctl start zabbix-agent
[root@web01 ~]# systemctl enable zabbix-agent
#浏览器访问
10.0.0.71
监控群组
- 按项目分
- 按应用分
# 接口
客户端:所有基本监控,自定义监控,都可以用客户端形式
SNMP:监控网络设备,交换机、路由器 Console口
JMX:专门监控Java内存,堆栈信息(老年代,新生代,永久代,full-gc)垃圾回收机制
IPMI:监控硬件协议
什么是垃圾回收机制?
zabbix5.0版本自定义监控项
创建模板,链接模板
创建监控项:
示例:监控服务器用户登录数量
## 监控项格式
Format: UserParameter=<key>,<shell command>
# 1.写脚本或者命令,取出想要监控的值
uptime|grep -Po '\d+(?= user)'
# 2.修改客户端配置文件
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=user.count,uptime|grep -Po '\d+(?= user)'
# 3.重启
[root@web01 ~]# systemctl restart zabbix-agent
# 4.页面添加监控
查看监控项
监控项不支持排错工具
#zabbix_get 是 Zabbix 监控系统提供的一个命令行工具,用于从远程主机获取监控数据。
用法:
zabbix_get -s <主机名或IP> -k <监控项键名>
参数解释:
-s <主机名或IP>:指定要获取数据的远程主机的主机名或IP地址。
-k <监控项键名>:指定要获取的监控项的键名,这是一个标识特定监控项的唯一字符串。
工作原理:
当执行 zabbix_get 命令时,它会通过 Zabbix 服务器获取与指定主机和监控项相关的数据。它首先与 Zabbix 服务器建立连接,然后通过 Zabbix API 发送请求,获取特定监控项的值,并将结果返回给用户
#下载安装
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-get-5.0.36-1.el7.x86_64.rpm
#示例
[root@zabbix ~]# zabbix_get -s 172.16.1.7 -k user.count
1
添加触发器
画图
自定义变量监控
监控进程
#添加nginx检测监控 //推荐把需要监控的项目写成不同的文件形式
[root@web01 ~]# vim /etc/zabbix/zabbix_agentd.d/process.conf
UserParameter=process.status[*],ps -ef|grep -v grep|grep -c $1
#监控项添加:
键值: process.status[nginx]
邮件告警
邮件告警流程:
先创建了触发器
触发器触发动作
动作调用指定的报警媒介类型
配置报警媒介类型
这里以QQ邮箱为例:
申请授权码
配置动作:
优化告警内容:
#警告自定义优化
#标题:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
#恢复自定义优化
#标题:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
配置收件人
故障报警:
恢复报警
html格式邮件警告
html和文本格式的区别在于创建媒介时选择Email (HTML),其次是在创建动作的时候,自定义消息内容换为html语法
#故障警告html
</head>
<body>
</style>
<table border="3" bordercolor="black" cellspacing="0px" cellpadding="4px" width="500px">
<tr class="guzhang" bgcolor="#0C1B3D" ><th colspan=2>
{TRIGGER.STATUS} 故障!!!故障!!!
<div>😂 😂 😂</div>
</tr>
<tr >
<td bgcolor="#F9B602" width="20%">告警主机</td>
<td bgcolor="#F9B602">{HOSTNAME1}</td>
</tr>
<tr >
<td bgcolor="#F9B602">告警别名</td>
<td bgcolor="#F9B602">{HOST.NAME} </td>
<tr >
<tr >
<td bgcolor="#F9B602">告警地址</td>
<td bgcolor="#F9B602">{HOST.IP}</td>
</tr>
<tr>
<td bgcolor="#F9B602">告警时间</td>
<td bgcolor="#F9B602">{EVENT.DATE} {EVENT.TIME}</td>
</tr>
<tr>
<td bgcolor="#F9B602">告警等级</td>
<td bgcolor="#F9B602">{TRIGGER.SEVERITY}</td>
</tr>
<tr>
<td bgcolor="#F9B602">告警信息</td>
<td bgcolor="#F9B602">{TRIGGER.NAME}</td>
</tr>
<tr>
<td bgcolor="#F9B602">告警项目</td>
<td bgcolor="#F9B602">{TRIGGER.KEY1}</td>
</tr>
<tr >
<td class='guzhang2' bgcolor="#FF3333">问题详情</td>
<td class='guzhang3' bgcolor="#FF3333">{ITEM.NAME}: {ITEM.VALUE} 😈 😈 😈</td>
</tr>
<tr>
<td bgcolor="#F9B602">当前状态</td>
<td bgcolor="#F9B602">{TRIGGER.STATUS}: {ITEM.VALUE1}</td>
</tr>
<tr>
<td bgcolor="#F9B602">事件ID</td>
<td bgcolor="#F9B602">{EVENT.ID}</td>
</tr>
</table>
</body>
#恢复故障警告信息
<head>
<style type="text/css">
table .guzhang {
color: red;
}
body{
background:url('https://seopic.699pic.com/photo/40007/7490.jpg_wh1200.jpg');
}
</style>
</head>
<body>
<table border="1" bordercolor="black" cellspacing="0px" cellpadding="4px" width="500px">
<tr bgcolor="#49c208"><th colspan=2>
{TRIGGER.STATUS} 故障修复完成
<div>😀 😀 😀</div>
</tr>
<tr >
<td bgcolor="lightgreen" width="20%">恢复主机</td>
<td bgcolor="yellow">{HOSTNAME1}</td>
</tr>
<tr>
<td bgcolor="lightgreen">恢复别名</td>
<td bgcolor="yellow">{HOST.NAME} </td>
<tr >
<td bgcolor="lightgreen">恢复地址</td>
<td bgcolor="yellow">{HOST.IP}</td>
</tr>
<tr>
<td bgcolor="lightgreen">恢复时间</td>
<td bgcolor="yellow">{EVENT.DATE} {EVENT.RECOVERY.TIME}</td>
</tr>
<tr>
<td bgcolor="lightgreen">恢复等级</td>
<td bgcolor="yellow">{TRIGGER.SEVERITY}</td>
</tr>
<tr>
<td bgcolor="lightgreen">恢复信息</td>
<td bgcolor="yellow">{TRIGGER.NAME}</td>
</tr>
<tr>
<td bgcolor="lightgreen">恢复项目</td>
<td bgcolor="yellow">{TRIGGER.KEY1}</td>
</tr>
<tr >
<td bgcolor="#49c208">恢复详情</td>
<td bgcolor="#49c208">{ITEM.NAME}: {ITEM.VALUE} ⚡ ⚡ ⚡</td>
</tr>
<tr>
<td bgcolor="lightgreen">当前状态</td>
<td bgcolor="yellow">{TRIGGER.STATUS}: {ITEM.VALUE1}</td>
</tr>
<tr>
<td bgcolor="lightgreen">事件ID</td>
<td bgcolor="yellow">{EVENT.ID}</td>
</tr>
</table>
</body>
故障警告:
恢复警告:
#如果在填写自定义动作发送信息的时候,点击新增报网页500错误,则授权以下目录权限即可
#授权
[root@zabbix-server conf.d]# chown -R apache.apache /var/opt/rh
企业微信告警
#企业微信群添加机器人生成webhook钩子
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ed7678f7-a038-47e0-a669-8a3bc5483fcf
#查看配置说明
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ed7678f7-a038-47e0-a669-8a3bc5483fcf' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "hello,world"
}
}'
#安装python3.6环境
yum install -y python36-devel
#安装requests模块
pip3.6 install requests
#创建脚本
vim /usr/lib/zabbix/alertscripts/wechat.py
#!/usr/bin/python3.6
#-*- coding: utf-8 -*-
import requests
import json
import sys
import os
headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=18496774-a212-4bf4-a761-4fa87e3c9876" #这个是企业微信机器人生成的webhook地址,修改为你的即可。
def msg(text):
json_text= {
"msgtype": "text",
"text": {
"content": text
},
}
print(requests.post(api_url,json.dumps(json_text),headers=headers).content)
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
----------------------------------------------------------------------------------------------------
#使用shell脚本实现
#!/usr/bin/bash
api_url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ed7678f7-a038-47e0-a669-
8a3bc5483fcf" #这个是企业微信机器人生成的webhook地址,修改为你的即可。
text=$1
cat > msg.json<<EOF
{
"msgtype": "text",
"text": {
"content": "$text"
}
}
EOF
curl "$api_url" \
-H 'Content-Type: application/json' \
-d "`cat msg.json`"
## 授权
[root@zabbix-server alertscripts]# chmod +x wechat.py
创建报警媒介
用户管理
关联动作
故障模拟:
多条件触发器
监控磁盘剩余使用率:
编辑配置文件
#客户端配置
[root@web01 zabbix_agentd.d]# free -m
total used free shared buff/cache available
Mem: 1980 96 1686 9 198 1712
Swap: 4091 0 4091
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/free.conf
UserParameter=mem.state,free -m|awk '/^Mem/{print $NF*100/$2}'
#服务端验证
[root@zabbix ~]# zabbix_get -s 172.16.1.7 -k mem.state
86.4646
添加监控项: //键值有误,正确为mem.state 更新时间改为10s
添加触发器:
监控swap
#客户端编辑配置文件
[root@web01 zabbix_agentd.d]# free -m
total used free shared buff/cache available
Mem: 1980 96 1686 9 198 1712
Swap: 4091 0 4091
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/free.conf
UserParameter=mem.state,free -m|awk '/^Mem/{print $NF*100/$2}'
UserParameter=swap.state,free -m|awk '/^Swap/{print $NF*100/$2}'
#服务端验证
[root@zabbix ~]# zabbix_get -s 172.16.1.7 -k swap.state
100
添加监控项: //键值有误,正确为swap.state 更新时间改为10s
添加到之前的触发器里:
常用触发器条件表达式
and #并且
or #或者
last() #比对最新的值
avg() #平均值
diff() #比对上一次文件的内容
nodata() #收不不到数据进行报警nodata(5m)
(5m) #表示最近5分钟得到值
(#5) #表示最近5次得到的值
zabbix自愈模式
添加ssh监控项
添加ssh触发器
创建自愈动作
修改配置文件,允许执行远程命令
#客户端修改配置文件
[root@web01 zabbix]# echo 'EnableRemoteCommands=1' >> /etc/zabbix/zabbix_agentd.conf
[root@web01 zabbix]# cat /etc/zabbix/zabbix_agentd.conf | tail -1
EnableRemoteCommands=1
#重启服务
[root@web01 zabbix]# systemctl restart zabbix-agent.service
#客户端zabbix用户sudo提权
visudo
%zabbix ALL=(ALL) NOPASSWD:ALL
# 2.客户端zabbix用户要/bin/bash登录
usermod zabbix -s /bin/bash
# 3.测试
[root@web01 zabbix]# su - zabbix -c 'sudo ls -l /'
su: warning: cannot change directory to /var/lib/zabbix: No such file or directory
total 16
lrwxrwxrwx. 1 root root 7 Apr 23 18:18 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Apr 23 18:27 boot
drwxr-xr-x 20 root root 3220 Aug 16 08:28 dev
drwxr-xr-x. 81 root root 8192 Aug 16 17:11 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Apr 23 18:18 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Apr 23 18:18 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x 121 root root 0 Aug 16 08:28 proc
dr-xr-x---. 3 root root 170 Aug 16 16:56 root
drwxr-xr-x 26 root root 800 Aug 16 08:29 run
lrwxrwxrwx. 1 root root 8 Apr 23 18:18 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x 13 root root 0 Aug 16 08:28 sys
drwxrwxrwt. 9 root root 161 Aug 16 17:08 tmp
drwxr-xr-x. 13 root root 155 Apr 23 18:18 usr
drwxr-xr-x. 20 root root 278 Apr 23 18:57 var
#警告是因为没有创建家目录导致,如果想消除警告,创建zabbix家目录即可
验证自愈
#关闭客户端ssh
root@web01 zabbix]# systemctl stop sshd
[root@web01 zabbix]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5993/rpcbind
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7042/master
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 48406/zabbix_agentd
tcp6 0 0 :::111 :::* LISTEN 5993/rpcbind
tcp6 0 0 ::1:25 :::* LISTEN 7042/master
tcp6 0 0 :::10050 :::* LISTEN 48406/zabbix_agentd
udp 0 0 0.0.0.0:111 0.0.0.0:* 5993/rpcbind
udp 0 0 0.0.0.0:605 0.0.0.0:* 5993/rpcbind
udp6 0 0 :::111 :::* 5993/rpcbind
udp6 0 0 :::605
修复://当zabbix检测到sshd服务断开后,会触发动作而恢复启动