Zabbix 核心功能
使用现有模板和监控项监控主机和应用
内置模板参考链接
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates
使用现有模板和监控项监控主机流程
-
在被监控的主机上安装Zabbix Agent ,建议和 Zabbix Server 同一个版本
-
配置 Zabbix agent的配置文件关键两项,并重启服务生效
-
Server = <Zabbix_Server_IP> Hostname=<本机IP> -
在Zabbix Server 上使用 zabbix_get 工具测试是否正常连接被监控主机
-
在Zabbix Server 添加被监控主机
-
在Zabbix WEB 添加已有的模板至被监控的主机
-
在Zabbix WEB 观察是否有新数据生成
监控 Linux 主机
监控前先确保被监控主机已经安装好 Zabbix agent 并启动
LInux 主机模板参考链接:
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/os/linux
添加主机
在web页面 配置 主机里面添加
关联内置模板
模板是一些事先定义好的相关监控项的集合,直接关联模板,比一个一个加入监控项要方便很多
模板分为内置模板和自定义模板
内置模板参考
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates
内置的监控项
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/itemtypes/zabbix
关联内置模板: Template OS linux
确认成功
等一会儿可以看到下面 ZBX 变绿色,表示成功
查看监控数据
修改自动发现的时间间隔
默认分区和网络的监控间隔较长,修改间隔到合适时长
通常生产中一个主机的监控项可能有100个左右,为了控制监控压力,在实现高可用的情况下,时间间隔也不宜太短,一般使用5分钟的时间间隔较常见
在配置 主机 自动发现配置自动发现规则
过一会可以看到磁盘的数据
可以观察到网卡的流量
监控 Windows 主机
注意: 要监控 Windows 需要提前关掉 Windows 防火墙和其它防火墙软件,如火绒等,否则可能会失败
安装 Zabbix Agent2
https://www.zabbix.com/cn/download_agents?version=6.0+LTS&release=6.0.5&os=Windows&os_version=Any&hardware=amd64&encryption=OpenSSL&packaging=Archive&show_legacy=0
下载链接
https://cdn.zabbix.com/zabbix/binaries/stable/6.0/6.0.5/zabbix_agent2-6.0.5-windows-amd64-openssl.msi
https://cdn.zabbix.com/zabbix/binaries/stable/6.0/6.0.5/zabbix_agent2-6.0.5-windows-amd64-openssl-static.zip
https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.24/zabbix_agent-5.0.24-windows-amd64-openssl.msi
https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.24/zabbix_agent2-5.0.24-windows-amd64-openssl.msi
验证端口
C:\Users\lbtoo>netstat -an| find "10050"
TCP 0.0.0.0:10050 0.0.0.0:0 LISTENING
TCP [::]:10050 [::]:0 LISTENING
如果下载的 Archive 包,解压缩,修改zabbix_agent2.conf
#修改配置文件 c:\zabbix_agents2\conf\zabbix_agent2.conf
...
Server=zabbix.ayaka.org
ServerActive=zabbix.ayaka.org
Hostname=windows10
#以管理员身份运行cmd,将zabbix命令注册为服务、然后启动该服务;
c:\zabbix_agent2\bin\zabbix_agentd.exe -c c:\zabbix_agent2\conf\zabbix_agent2.conf --install
#查看端口
netstat -an|find "10050"
在Zabbix Server 测试连接agent
[root@zabbix-server ~]#zabbix_get -s 10.0.0.1 -k agent.ping
1
通过Web 配置 Zabbix Server 监控 Windows 主机
关联内置模板 windows by Zabbix agent
稍等一分钟, ZBX字体变绿
查看最新数据
查看图形显示
监控 Nginx 服务
nginx 模板参考:
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/nginx_http
安装和配置nginx服务
#Ubuntu系统
[root@ubuntu2204 ~]#apt update && apt -y install nginx
[root@ubuntu2204 ~]#vim /etc/nginx/sites-enabled/default
server {
.....
#添加下面三行,Zabbix默认监控/basic_status,此处为/status,需要和zabbix的模板定义的路径要保持一致
location /status {
stub_status;
}
......
}
[root@ubuntu2204 ~]#nginx -s reload
#红帽系统
[root@centos8 ~]#yum -y install nginx
[root@centos8 ~]#vim /etc/nginx/nginx.conf
http {
server {
location / {
}
#添加下面三行,Zabbix默认监控/basic_status,此处为/status,需要和zabbix的模板定义的路径要保持一致
location = /status {
stub_status;
}
}
}
[root@centos8 ~]#systemctl enable --now nginx
查看 nginx 内置模板和修改宏定义
使用内置模板: Template App Nginx by HTTP (不需要安装zabbix agent)或者Template App Nginx byZabbix agent (需要安装zabbix agent)
Zabbix 内置宏定义{$NGINX.STUB_STATUS.PATH}默认值为 basic_status
修改模板中的宏定义值status页面的URL
修改模板的时间间隔
为方便观察结果,修改模板中监控项的更新的时间间隔为1m
添加监控的主机并关联模板
使用内置模板: Template App Nginx by HTTP 或者Template App Nginx by Zabbix agent
查看监控数据
监控 PHP-FPM 服务
php-fpm 模板参考:
https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/php-fpm_agent
在前面nginx基础上实现 php-fpm 服务
#Ubuntu安装配置PHP-FPM
[root@ubuntu2204 ~]#apt update && apt -y install php-fpm nginx
[root@ubuntu2204 ~]#vim /etc/php/8.1/fpm/pool.d/www.conf
;listen = 127.0.0.1:9000
listen = /run/php/php8.1-fpm.sock
pm.status_path = /php_status #Zabbix系统默认监控路径/status
ping.path = /ping
[root@ubuntu2204 ~]#systemctl restart php8.1-fpm.service
#红帽系统安装配置PHP-FPM
[root@centos8 ~]#yum -y install php-fpm nginx
[root@centos8 ~]#vim /etc/php-fpm.d/www.conf
listen=127.0.0.1:9000
pm.status_path = /php_status #Zabbix系统默认监控路径/status
ping.path = /ping
[root@centos8 ~]#systemctl enable --now php-fpm.service
#修改nginx的配置
#Ubuntu22.04
[root@ubuntu2204 ~]#vim /etc/nginx/sites-enabled/default
server {
.......
location ~ \.php|/php_status|/ping$ {
root /data/php;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
......
#红帽系统
[root@centos8 ~]#vim /etc/nginx/nginx.conf
.....
location / {
}
location = /status {
stub_status;
}
location ~ ^/(ping|php_status)$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
#fastcgi_pass 127.0.0.1:9000;
#fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
.......
[root@centos8 ~]#systemctl restart nginx
#浏览器测试访问
修改内置模板
注意: 选择正确的模板
使用 Zabbix 内置模板 Template App PHP-FPM by Zabbix agent
注意: Template App PHP-FPM by HTTP 有问题,需要修改宏定义
修改内置模板的监控间隔
内置的宏{$PHP_FPM.STATUS.PAGE} 默认值为status,需要修改为当前PHP实际的路径
修改内置模板的宏定义,注意要和前面php-fpm的路径相匹配
关联内置模板到监控的主机
使用 Zabbix 内置模板 Template App PHP-FPM by Zabbix agent
查看监控结果
自定义模板 Templates 和监控项 Items
上面对Linux系统的监控是使用系统内置模板的监控项,虽然 Zabbix 内置的模板及其包括的监控项已经很丰富
但是内置的监控项可能不一定适合当前环境,或者有些不需要的监控项,或者需要的监控项并没有提供
因此实际生产中仍可能需要通过自定义监控项来满足当前环境的监控需求
自定义模板和监控项实现过程
- 在Zabbix 被监控主机上编写自定义监控项的取值的脚本,并加执行权限
- 在Zabbix 被监控主机上的配置文件中添加自定义监控项,指定 key 和 对 key 赋值的脚本及参数
- 在Zabbix Server 上使用 zabbix_get 工具测试是否能取到自定义监控项信息
- 在Zabbix Web 创建模板,在模板中添加自定义监控项
- 在Zabbix Web 将模板关联至被监控的主机
- 导出自定义模板可以在其它 Zabbix Server 复用
除了自定义模板,也可以从zabbix网站查找适合自已的模板
https://www.zabbix.com/cn/integrations
自定义监控项
系统内置的监控项如下
https://www.zabbix.com/documentation/6.0/zh/manual/config/items/itemtypes/zabbix_agent
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/itemtypes/zabbix_agent
内置的监控项无法满足要求,可以自定义监控项
自定义监控项配置
监控项键值的格式
https://www.zabbix.com/documentation/7.0/zh/manual/config/items/item/key
https://www.zabbix.com/documentation/6.0/zh/manual/config/items/item/key
客户端可以自定义监控项,在Zabbix Agent 配置文件添加内容,格式如下
#cat /etc/zabbix/zabbix_agentd.conf
#cat /etc/zabbix/zabbix_agent2.conf
UserParameter=<key>,<shell command>
Include=/etc/zabbix/zabbix_agentd.d/*.conf
#或者创建独立的自定义文件
#cat /etc/zabbix/zabbix_agentd.d/*.conf
#cat /etc/zabbix/zabbix_agent2.d/*.conf
UserParameter=<key>,<shell command>
说明:
- key 必须整个系统唯一。注意大小写是敏感的, Key名允许的字符如下
0-9a-zA-Z_-.
key 使用 [*] 用于定义该key接受括号内的参数。参数需在配置监控项时给出;参数禁止使用下列字符:
\ ’ ” ` * ? [ ] { } ~ $ ! & ; ( ) <>
- Command:命令用于生成key对应的值。
可以在命令中使用位置引用1 … 9来引用监控项Key中的相应参数。Zabbix解析监控项Key的[]中包含的参数,并相应地替换1,…,9。0会替换为完整的原始命令(在对0,…,9执行替换之前的命令)运行。不管位置参数(0,…,$9)是用双引号( “ )还是单引号( ’ )括起来,都会解析位置引用
测试监控项
在Zabbix Agent 上执行测试
#不需要重启服务:
zabbix_agentd -t "在客户端定义的key名[arg1,arg2,...]"
zabbix_agent2 -t "在客户端定义的key名[arg1,arg2,...]"
在Zabbix Server上可以使用zabbix_get工具获取自定义监控项
#需要重启服务:systemctl restart zabbix-agent2.service
zabbix_get -s 客户端IP -p 10050 -k "在客户端定义的key名[arg1,arg2,...]"
- 如果用脚本实现首行必须加shebang机制
- 如果编译安装的程序,需要写程序的完整路径
宏Macros
另外 Zabbix 支持用户自定义宏,即支持变量定义
自定义宏格式为: {$macrosz_name}
官方文档
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros
自定义监控项配置案例
范例:取根文件系统的空间利用率
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
[root@centos8 ~]#cat /etc/zabbix/zabbix_agent2.d/test.conf
UserParameter=root_filesystem_use,df|awk -F' +|%' '$7 == "/" {print $5 }'
#客户端测试
[root@centos8 ~]#zabbix_agent -t root_filesystem_use
[root@centos8 ~]#zabbix_agent2 -t root_filesystem_use
#重启服务后服务器端才能获取数据
[root@centos8 ~]#systemctl restart zabbix-agent.service
#服务器端测试
[root@zabbix-server ~]#yum -y install zabbix-get
[root@zabbix-server ~]#apt -y install zabbix-get
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "root_filesystem_use"
范例:自定义监控项实现连接数
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=tcp_state_estab,ss -ant|grep -c ESTAB
[root@centos8 ~]#systemctl restart zabbix-agent.service
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state_estab"
5
范例:实现自定义监控项的参数
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=test[*],echo $1
[root@centos8 ~]#systemctl restart zabbix-agent.service
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "test[This is a test item]"
This is a test item
范例:利用自定义监控项的参数功能监控MySQL的存活状态
[root@centos8 ~]#yum -y install mysql-server
[root@centos8 ~]#systemctl enable --now mysqld
[root@centos8 ~]#mysql
mysql> create user test@'localhost' identified by '123456';
[root@centos8 ~]#mysqladmin -utest -p123456 ping
mysqladmin: [Warning] Using a password on the command line interface can be
insecure.
mysqld is alive
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=mysql.ping[*],mysqladmin -u$1 -p$2 ping 2>/dev/null| grep -c alive
[root@centos8 ~]#systemctl restart zabbix-agent.service
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "mysql.ping[test,123456]"
1
[root@centos8 ~]#systemctl stop mysqld
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "mysql.ping[test,123456]"
0
自定义模板
什么是模板
所谓模板,就是一些相关的监控项的集合,还可以在模板中包括图形,触发器等
为什么需要模板?
- 为每个主机单独添加相同的一组监控项比较麻烦,例如:100台主机增加一个tcp80的监控项
- 修改监控项比较麻烦,例如:100台服务器的监控项将80改成8080
- 删除每个主机的同一组监控项,例如:100台服务器的监控项删除
- 删除主机会连同主机的监控项一起被删除;不能复用监控项
所以可以使用模板的方式,来解决上述的一些问题
自定义模板使用流程
- 创建模板,模板必须属于某个主机组(一般属于主机组Templates)
- 在模板中创建监控项、图形、触发器
- 创建需要监控的主机,然后关联对应的模板
- 更改模板的监控项目,所以使用模板的都会自动更改
- 导出模板,后期可以至其他系统继续使用
监控项的值映射 Value Mapping
https://www.zabbix.com/documentation/6.0/zh/manual/config/items/mapping?hl=%E5%80%BC%E6%98%A0%E5%B0%84
https://www.zabbix.com/documentation/5.0/zh/manual/config/items/mapping?hl=%E5%80%BC%E6%98%A0%E5%B0%84
什么是值映射
为了接收到的值能更“人性化”的显示,可以通过值映射方式,将数值与字符串之间进行关系绑定
示例:
http 响应码
'200' → 'OK'
'403' → 'Forbidden'
'404' → 'Not Found'
创建值映射
Zabbix 6.0 以上版本配置
要定义一个值映射:
- 打开主机或者模板配置表单
- 前往 值映射 标签
- 点击 增加 来增加一个新映射
- 点击一个已存在的值映射名字来进行编辑
Zabbix 5.0 以下版本配置
定义值映射: 管理 --- 一般 --- 界面设置的从下拉列表中选择--- 值映射
使用值映射
添加监控项时,在查看值处选中上面创建的值映射名称
查看结果
触发器 Triggers
触发器介绍
触发器其实就是一些条件的定义,一个触发器是根据一个监控项的返回值,将之与预先设置的阈值进行对比,当监控项返回了不符合预定义的值范围后,就进行触发下一步操作的警戒线,一般要对创建的监控项设置触发器以及触发方式和值的大小
可以在指定主机上创建触发器,只是针对指定主机有效
也可以在指定模板上创建触发器,则使用此模板的所有主机都有效,一个模板中可以有多触发器
触发器中使用的表达式是非常灵活的。可以使用它们去创建关于监控统计的复杂逻辑测试。
触发器严重性
触发器严重性表示触发器的重要程度
Zabbix支持下列6种触发器的严重程度:
| 严重性 | 颜色 |
|---|---|
| 未分类 | 灰色 |
| 信息 | 浅蓝色 |
| 警告 | 黄色 |
| 一般严重 | 橙色 |
| 严重 | 浅红色 |
| 灾难 | 红色 |
严重性功能
- 通过不同的颜色区分不同的严重程度
- 报警音频,不同的音频代表不同的严重程度
- 用户媒介,不同的用户媒介(通知渠道)代表不同的严重程度。例如,短信 - 高严重性,email - 其他。
- 不同的严重性通过触发器执行对应的条件动作
触发器表达式格式
一个简单的表达式格式:
{<server|template>:<key>.<function>(<parameter>)}<operator><constant>
触发器官方文档
https://www.zabbix.com/documentation/6.0/zh/manual/config/triggers/expression
函数官方文档
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/triggers/functions
https://www.zabbix.com/documentation/5.0/en/manual/appendix/triggers/functions
触发器表达式常用函数
| 函数名称 | 说明 | 范例 |
|---|---|---|
| avg() | 监控项的平均值 | avg(#5) → 最新5个值的平均值 avg(1h) → 最近一小时的平均值 avg(1h,1d) → 一天前的一小时内的平均值 |
| min() | 监控项的最小值 | CPU使用率最近5分钟的最小值大于6: system.cpu.load.min(5m)>6 CPU最近5次最小的值大于2: system.cpu.load.min(#5)>2 |
| max() | 监控项的最大值 | max(#5) → 最新5个值的最大值 max(1h) → 最近一小时的最大值 |
| last() | 最后的第几个值 | 注意last的 #num 参数和在其它函数中的作用不同。 例如:返回值为 3, 7, 2, 6, 9 last() 通常等同于 last(#1) last(#5) - 第五个最新值 (注意:不是五个最新值,此例返回值为 9) last(#10,30) 表示每隔30s采样一次,取倒数第10个值 |
| diff() | 比对上一次文件的内容 | 返回值为1,表示发生变化;返回值为0,表示没有变化 |
| nodata() | 监控一段时间内是否返回数据 | 时间不少于30秒 (因为timer处理器每30秒调用一次) 返回1 - 指定评估期没有接收到数据 返回0 - 其它 |
运算符
触发器支持下列运算符(在执行中优先级递减)
| 优先级 | 运算符 | 定义 | 未知值(Unknown)注释 |
|---|---|---|---|
| 1 | - | 负 | Unknown → Unknown |
| 2 | not | 逻辑非 | Unknown → Unknown |
| 3 | * | 乘 | Unknown → Unknown |
| / | 除 | Unknown / 0 → error; 1.2 / Unknown → Unknown | |
| 4 | + | 加 | 1.2 + Unknown → Unknown |
| - | 减 | 1.2 - Unknown → Unknown | |
| 5 | < | 小于 (A<B ⇔ A<B-0.000001) | Unknown → Unknown |
| <= | 小于等于 (A<=B ⇔ A<=B+0.000001) | Unknown → Unknown | |
| > | 大于 (A>B ⇔ A>B+0.000001) | ||
| >= | 大于等于 (A>=B ⇔ A>=B-0.000001) | ||
| 6 | = | 相等 (A=B ⇔ A>=B-0.000001 and A<=B+0.000001) | |
| <> | 不等于 (A<>B ⇔ (A<B-0.000001) or (A>B+0.000001)) | ||
| 7 | and | 逻辑与 | * and Unknown → 0; 1 and Unknown → Unknown ;Unknown and ** Unknown->Unknown |
| 8 | or | 逻辑或 | * or Unknown → 1; 0 or Unknown → Unknown;Unknown or ** Unknown -> Unknown |
not, and and or 运算符区分大小写,而且必须为小写。它们也必须被空格或括号包围。
所有运算符中, 除了 - 和 not ,都有左到右的关联性。 - 和 not是非结合的(意味着**-(-1)和not (not 1)应该用--1** and not not 1代替).
计算结果:
- <, <=, >, >=, =, <> 如果指定的关系为真,运算符将会在触发器表达式中产生‘1’。如果指定的关系为假,则返回‘0’。如果至少有一个运算数未知,则结果未知;
- and 对于已知的运算对象,如果两个运算对象的比较不等于“0”,则运算符将会在触发器表达式中产生“1”,否则,它产生“0”;对于未知的运算对象,如果两个运算对象的比较等于“0”,则会产生“0”,否则,则会产生“Unknown”;
- or 对于已知的运算对象,如果其中任意一个运算对象的比较不等于“0”,则运算符会在触发器表达式中产生“1”,否则,它产生“0”;对于未知的运算对象进行“or”运算,则只有当一个运算对象的比较不等于“0”,才会产生“1”,否则,它会产生“Unknown”;
- 如果操作数的值不等于“0”,则已知操作数的逻辑否定运算符not的结果是“0”;如果操作数的值等于“0”,则为“1”。对于未知的操作数not产生“Unknown”。
官方触发器示例
https://www.zabbix.com/documentation/5.0/zh/manual/config/triggers/expression
#示例
www.zabbix.com 主机的处理器负载过高
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5
'www.zabbix.com:system.cpu.load[all,avg1]' 给出了被监控参数的简短名称。它指定了服务器是“www.zabbix.com”,监控项的键值是“system.cpu.load[all,avg1]”。通过使用函数“last()”获取最新的值。最后,“>5”意味着当www.zabbix.com最新获取的处理器负载值大于5时触发器就会处于异常状态。
#示例
www.zabbix.com is overloaded
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
当前处理器负载大于5或者最近10分钟内最小值大于2,表达式为true。
#示例
/etc/passwd文件被修改
使用函数diff:
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff()}=1
当文件/etc/passwd的checksum值与最近的值不同时,表达式为true。
类似的,表达式可以用于监控重要文件的修改, 如/etc/passwd, /etc/inetd.conf, /kernel等
#示例
有用户正在从互联网上下载一个大文件
使用min函数:
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
在过去5分钟内,eth0上接收字节数大于100kb时,表达式为true。
#示例
SMTP服务群集的两个节点都停止。 注意在一个表达式中使用两个不同的主机:
{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0 and
{smtp2.zabbix.com:net.tcp.service[smtp].last()}=0
当SMTP服务器smtp1.zabbix.com和smtp2.zabbix.com都停止,表达式为true
#示例
Zabbix agent需要升级
使用str()函数:
{www.zabbix.com:agent.version.str("beta8")}=1
如果Zabbix agent版本是beta8(可能是1.0beta8),则表达式为真。
#示例
服务器无法访问
{www.zabbix.com:icmpping.count(30m,0)}>5
当主机“www.zabbix.com”在30分钟内超过5次不可达,则表达式为真。
#示例
3分钟内没有心跳检查
使用nodata()函数:
{www.zabbix.com:tick.nodata(3m)}=1
要使用这个触发器,'tick'必须定义成一个Zabbix[:manual/config/items/itemtypes/trapper|trapper]]监控项。主机应该使用zabbix_sender定期发送这个监控项的数据。
如果在180秒内没有接收到数据,则触发值变为异常状态。
注意:nodata可以在任何类型的监控项中使用。
#示例
夜间的CPU负载
使用time()函数:
{zabbix:system.cpu.load[all,avg1].min(5m)}>2 and
{zabbix:system.cpu.load[all,avg1].time()}>000000 and
{zabbix:system.cpu.load[all,avg1].time()}<060000
仅在夜间(00:00-06:00),触发器状态变可以变为真。
#示例
检查客户端本地时间是否与Zabbix服务器时间同步
使用fuzzytime()函数:
{MySQL_DB:system.localtime.fuzzytime(10)}=0
当MySQL_DB服务器的本地时间与Zabbix server之间的时间相差超过10秒,触发器将变为异常状态。
#示例
比较今天的平均负载和昨天同一时间的平均负载(使用第二个“时间偏移”参数)。
{server:system.cpu.load.avg(1h)}/{server:system.cpu.load.avg(1h,1d)}>2
如果最近一小时平均负载超过昨天相同小时负载的2倍,触发器将触发。
#示例
使用了另一个监控项的值来获得触发器的阈值:
{Template PfSense:hrStorageFree[{#SNMPVALUE}].last()}<{TemplatePfSense:hrStorageSize[{#SNMPVALUE}].last()}*0.1
如果剩余存储量下降到10%以下,触发器将触发。
#示例
使用评估结果获取超过阈值的触发器数量
({server1:system.cpu.load[all,avg1].last()}>5) +
({server2:system.cpu.load[all,avg1].last()}>5) +
({server3:system.cpu.load[all,avg1].last()}>5)>=2
如果表达式中至少有两个触发器大于5,触发器将触发。
滞后
有时我们需要一个OK和问题状态之间的区间值,而不是一个简单的阈值。
例如,我们希望定义一个触发器,当机房温度超过20C时,触发器会出现异常,我们希望它保持在那种状态,直到温度下降到15C以下。
为了做到这一点,我们首先定义问题事件的触发器表达式。然后在事件成功迭代中选择‘恢复表达式’,并为OK事件输入恢复表达式。
注意,只有首先解决问题事件才会评估恢复表达式。如果问题条件仍然存在,则不能通过恢复表达式来解决问题。
示例 1
机房温度过高。
问题表达式:
{server:temp.last()}>20
恢复表达式
{server:temp.last()}<=15
示例 2
磁盘剩余空间过低。
问题表达式: it is less than 10GB for last 5 minutes
{server:vfs.fs.size[/,free].max(5m)}<10G
恢复表达式: it is more than 40GB for last 10 minutes
{server:vfs.fs.size[/,free].min(10m)}>40G
开启 Zabbix Server的声音提示
用户设置 报警媒介 正在发送消息
自定义触发器
配置单条件触发器
自定义单条件触发器:设置内存低于 30% 进行告警,点击对应主机→ 创建触发器获取内存还剩余的百分比:
剩余 30% 可用,则需要告警通知;剩余 50% 可用,就算恢复;
编辑触发器表达式
#问题表达式:
{Webserverb:mem_use_percent.last()}<30
#恢复表达式:
{Webserver:mem.use_percent.last()}>60
#测试内存
dd if=/dev/zero of=/dev/null bs=1000M count=1024
配置多条件触发器
自定义多条件触发器:设置空闲内存低于 30%并且swap使用大于1% 进行告警
#增加swap的自定义监控项
UserParameter=swap_use,free |awk '/^Swap/{print $3*100/$2}'
#编辑触发器表达式
#问题表达式:
{Webserver:mem_unuse_percent.last()}<=30 and {Web:swap_use.last()}>=1
#恢复表达式:
{Webserver:mem_unuse_percent.last()}>=50
#使用命令压测
dd if=/dev/zero of=/dev/null bs=500M count=1024
#只满足内存低于30%,所以不会警告
dd if=/dev/zero of=/dev/null bs=1000M count=1024
#内存低于30%,并且swap使用超过1%
触发器依赖关系
什么是触发器依赖
有时候一台主机的可用性依赖于另一台主机。如果一台路由器宕机,则路由器后端的服务器将变得不可用。
如果这两者都设置了触发器,你可能会收到关于两个主机宕机的通知,然而只有路由器是真正故障的。
这就是主机之间某些依赖关系可能有用的地方,设置依赖关系的通知会被抑制,而只发送根本问题的通知。
触发器依赖关系示例
例如,主机位于路由器2后面,路由器2在路由器1后面。
Zabbix - 路由器1 - 路由器2 - 主机
如果路由器1宕机,显然主机和路由器2也不可达,然而我们不想收到主机、路由器1和路由器2都宕机的3条通知。
因此,在这种情况下我们定义了两个依赖关系:
'主机宕机' 触发器依赖于 '路由器2宕机' 触发器
'路由器2宕机' 触发器依赖于 '路由器1宕机' 触发器
触发器依赖案例
依赖场景环境说明
假设:充当R 路由节点,H 充当主机节点
- 模拟当H节点的80端口如果不存活,需要检查R节点的80端口是否存活
- 如果R路由节点的80端口存活,则触发H主机节点的80端口不存活警告
- 如果R路由节点的80端口不存活,则仅触发路由节点的警告,而不触发主机节点的警告
定义触发器表达式
R路由节点:定义监控项,配置触发器
H主机节点:定义监控项,配置触发器
模拟路由与主机故障
模拟R路由器、H主机节点同时障时,会同时收到两个告警,显然不符合预期效果
配置触发器依赖关系
在H服务器节点上对应的触发器上配置依赖关系,依赖R路由节点对应的触发器
再次模拟路由与节点故障
- 关闭 “路由器” 80端口,以及主机节点80端口;此时只有路由节点会警告
- 启用 “路由器” 80端口,关闭主机节点80端口,此时只有主机节点会警告
图形 Graphs
什么是图形
Zabbix采集到的大量监控数据,如果将这些数字通过可视化图形方式展示,那会让运维更容易了解发生了什么事件以及未来发展的趋势
自定义图形
Zabbix 本身提供了一些图形,但用户也可以自定义图形
自定义图表,顾名思义,就是提供自定义定制的功能。
自定义图表需要人为配置,可以为某台主机、多台主机、某个模板创建自定义图表。
案例
在模板中创建图形
创建图形
选中所有监控项
模板关联至主机
查看图形
过滤图形只显示自定义的图形
聚合图形 Screens (仪表盘)
注意: Zabbix 6.0 取消 Screens ,使用 仪表盘 Dashboards替代
Zabbix中一个图形只是包括相关监控项的一张图
如果想在一个界面里显示包含多组监控项的多个图形可以使用聚合图形
默认Zabbix 中已有的聚合图形
创建聚合图形
方法1
如果想将多个主机或不同模板的相关图形放在同一个聚合图形中,则执行下面执行操作
监测--聚合图形--创建聚合图形,此方式比更灵活(Zabbix6.0 不再支持此方式)
方法2
如果想将同一个主机的多个监控项图形放在一个聚合图形,则执行下面操作
配置--模板--在指定的模板--聚合图形(仪表盘Zabbix6.0),此方式比较有局限性
创建聚合图形
指定名称和图形的个数
添加监控项相关的图形
选择 构造函数
添加多个图形到此聚合图形中
查看聚合图形
监测--模板关联的主机--聚合图形
右上角选中创建的聚合图形
创建多个聚合图形
复重上面过程,创建多个聚合图形
利用多个聚合图形实现幻灯片功能(轮播图)
创建幻灯片 Slide Shows
监测--聚合图形 --Zabbix 5.0 版在左上角的幻灯片演示
Zabbix 4.0 版在右上角
添加聚合图形
验证幻灯片
用户 Users 和组 Groups 管理
用户组:指定可访问资源的范围,比如哪些主机可以被访问到
角色: 加入角色可以控制用户是否有管理能力,还有更多的细小权限分派,比如:具体某个菜单项的访问
用户管理
系统默认有Admin和guest两个用户,其中guest,密码为空,且默认被禁用
创建新用户
管理 --- 用户
创建新用户,指定群组
组管理
管理 --- 用户组群
权限和角色
https://www.zabbix.com/documentation/6.0/zh/manual/config/users_and_usergroups/permissions
https://www.zabbix.com/documentation/6.0/zh/manual/web_interface/frontend_sections/administration/user_roles
用户角色定义了 UI 的哪些部分、哪些 API 方法以及哪些操作可供用户使用。以下角色是预定义的在Zabbix:
| 用户类型 | 说明 |
|---|---|
| guest访客角色 | 用户有权访问“监控”、“清单”和“报告”菜单部分,但无权执行任何操作。 |
| 用户角色 | 用户有权访问“监控”、“清单”和“报告”菜单部分。默认情况下,用户无权访问任何资源。必须明确分配对主机组的任何权限。 |
| 管理员角色 | 用户有权访问“监控”、“库存”、“报告”和“配置”菜单部分。默认情况下,用户无权访问任何主机组。必须明确授予对主机组的任何权限。 |
| 超级管理员角色 | 用户有权访问所有菜单部分。用户具有对所有主机组的读写访问权限。不能通过拒绝对特定主机组的访问来撤销权限。 |
具有超级管理员类型和适当权限的 Zabbix 用户可以修改或删除现有角色或创建新的自定义角色。
要创建新角色,请单击右上角的创建用户角色按钮。要更新现有角色,请按角色名称以打开配置表单。
主机组权限
只有在主机组级别上,只有组才能访问Zabbix中的任何主机数据。
这意味着个人用户不能直接被授予访问主机(或主机组)的权限。只有作为用户组的一部分,才能授予它对主机的访问权限,该用户组被授予对包含该主机的主机组的访问权限。
告警通知
生产环境中,通常当达到一定的指标,比如硬盘使用率为80%左右时,会触发触发器的条件,而触发器可以再触发动作,实现事件通知告警或执行指定命令等.要实现事件通知告警,就需要一个中间介质来发送告警消息给运维
Zabbix 有如下常见报警介质
- 微信
- 短信
邮件告警
邮箱开启 SMTP 功能
在邮箱上开启SMTP功能,利用此邮箱实现发送报警邮件
QQ邮箱开启邮件通知功能
创建报警媒介类型实现发信人功能
报警媒介类型是一种给运维工程师发送消息通知的渠道,即当zabbix的触发器触发一个事件后,怎么才能把这个事件通过某些方式通知给运维工程师呢? 媒介类型就起到此作用,如果想要实现邮件告警功能,那么对应的媒介类型就是配置用来发送告警邮件的发件人邮箱。
管理-->报警媒介类型-->创建报警媒介类型
结合上一小节邮箱的配置输入以下内容
QQ 邮箱配置
添加消息模板用于发送信息
#可以修改两个消息模板
# 问题
主题: 告警: {EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
# 恢复 Problem Recovery
主题: 恢复: {EVENT.DURATION}: {EVENT.NAME}
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}
创建完成,可以看到下面信息
测试是否邮件正常,有时QQ邮箱不成功,可以尝试其它邮箱,如163邮箱
成功可以收下邮件和提示
网易邮箱配置
给指定用户添加报警媒介实现收件人功能
媒介类型创建好之后,还需要在每个zabbix账户里面添加相应的收件配置,比如邮件类型的媒介类型要给zabbix账户添加邮箱,如果是微信类型的媒介类型那么就要在zabbix账户设置微信号,短信类型的媒介类型那就得给zabbix账户设置手机号用于接收报警消息内容。
在zabbix用户中添加报警媒介时,需要指定告警信息的收件人的邮件地址
注意:下面图中一定要点击“更新”才能生效
创建和配置动作
动作可以实现当触发器被触发后可以执行哪些操作,一般可以是发送告警或执行命令
关于宏,即一些在Zabbix 中可以调用的变量
宏分为三种
- 系统内置的宏变量: {MACRO}
- 用户自定义的宏变量: {$MACRO}
- 低级别自动发现宏变量: {#MACRO}
创建动作
指定动作即条件为事件的严重度为信息时就触发动作
配置---动作
配置操作
官方宏参考
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros/supported_by_location
https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location
范例: 操作和恢复操作的定制消息主题和和内容
#操作主题
故障:{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}
故障持续时间:{EVENT.AGE}
恢复时间:{EVENT.RECOVERY.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
故障邮件内容
恢复邮件内容
范例: 配置操作
操作内容
默认标题:业务报警 {EVENT.NAME}
消息内容:业务报警服务器:{HOST.NAME},IP:{HOST.IP},详情:{ITEM.NAME}:{ITEM.VALUE}
步骤设为0时,表示会不停的持续发送警报,一般建议1到3表示执行三次。
步骤持续时间表示如果有后续步骤执行时的间隔时长,默认为0表示使用默认时间1h后才会执行后续步骤,此值最低不能低于60s,最大不能超过604800s,可以设为1到5m(分钟)比较合适
配置故障恢复信息
恢复操作内容
默认标题:业务恢复
信息内容:业务恢复服务器:{HOST.NAME},IP:{HOSTNAME1},详情:{ITEM.NAME}:{ITEM.VALUE}
模拟故障验证邮件通知
利用之前创建的触发器实现邮件通知
停止nginx服务,触发邮件报警
[root@centos8 ~]#systemctl stop nginx
恢复nginx服务也会触发邮件报警
[root@centos8 ~]#systemctl start nginx
在报表中可以看到动作日志如下面信息
分级告警
当出现报警后,一般会根据组织的重要级别,按时间逐级分层向上报警,如下面常见分层报警
初级运维/指定运维组--高级运维工程师/业务运维-—->架构师--->总监/CTO
要实现分级告警,必须确保有多个用户,并分别指定不同的邮箱
配置Admin用户的邮箱
另一个用户wang使用不同的邮箱
配置操作指定不同的步骤发邮件给不同的用户
在原来操作基础上添加新的操作
添加操作,发送消息给上级领导的邮箱
{ESC.HISTORY} 宏放在在自定义消息里
该宏将包含关于此升级之前执行的所有步骤的信息,例如:发送的通知和执行的命令。
自定义消息如下示例:
主题:Problem:{EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
此前步骤:{ESC.HISTORY}
模拟故障测试验证分级告警
停止 nginx 服务,查看结果
[root@centos8 ~]#systemctl stop nginx
Admin收到三封告警邮件
wang用户邮件也是三封告警邮件
调整操作的持续时间如下,第一个操作为2m,第二个操作为3m
最终可以看到邮件发送的时间间隔如下
邮件告警方法2
也可以利用脚本方式进行邮件告警
安装邮件相关软件和配置邮件
范例: 利用 sendemail 工具实现邮件脚本
[root@zabbix-server ~]# cat /usr/lib/zabbix/alertscripts/mail.sh
#!/bin/bash
email_send='11234576@qq.com'
email_passwd='dgezyimkdswwbhea'
email_smtp_server='smtp.qq.com
. /etc/os-release
msg_error() {
echo -e "\033[1;31m$1\033[0m"
}
msg_info() {
echo -e "\033[1;32m$1\033[0m"
}
msg_warn() {
echo -e "\033[1;33m$1\033[0m"
}
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_sendemail () {
if [[ $ID =~ rhel|centos|rocky ]];then
rpm -q sendemail &> /dev/null || yum install -y sendemail
elif [ $ID = 'ubuntu' ];then
dpkg -l |grep -q sendemail || { apt update; apt install -y libio-socket-ssl-perl libnet-ssleay-perl sendemail ; }
else
color "不支持此操作系统,退出!" 1
exit
fi
}
send_email () {
local email_receive="$1"
local email_subject="$2"
local email_message="$3"
sendemail -f $email_send -t $email_receive -u $email_subject -m $email_message -s $email_smtp_server -o message-charset=utf-8 -o tls=yes -xu $email_send -xp $email_passwd
[ $? -eq 0 ] && color "邮件发送成功!" 0 || color "邮件发送失败!" 1
}
if [ $# -ne 3 ];then
color "脚本参数不正确!" 1
msg_info "Usage: `basename $0` <mail_address> <subject> <message>"
exit 1
fi
install_sendemail
send_email "$1" "$2" "$3"
[root@zabbix-server ~]# chmod +x /usr/lib/zabbix/alertscripts/mail.sh
范例: 利用 mutt工具实现邮件发送
#Ubuntu18.04系统的配置邮件信息
[root@zabbix-server ~]#apt -y install mutt msmtp
[root@zabbix-server ~]#getent passwd zabbix
zabbix:x:112:116::/var/lib/zabbix/:/usr/sbin/nologin
[root@zabbix-server ~]#mkdir /var/lib/zabbix
[root@zabbix-server ~]#vim /var/lib/zabbix/.msmtprc
account default
host smtp.163.com
from lbtaath@163.com
auth plain
user lbtaath@163.com
password QXFIOQXEJNSVSDMW
logfile ~/.msmtp.log
[root@zabbix-server ~]#chmod 600 /var/lib/zabbix/.msmtprc
[root@zabbix-server ~]#touch /var/lib/zabbix/.msmtp.log
[root@zabbix-server ~]#chown -R zabbix.zabbix /var/lib/zabbix
[root@zabbix-server ~]#vim /etc/Muttrc
source /usr/lib/mutt/source-muttrc.d|
#文件最后添加下面行
set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="lbtaath"
set from=lbtaath@163.com
set envelope_from=yes
#邮件发送邮件的脚本
[root@zabbix-server ~]#cat /usr/lib/zabbix/alertscripts/mail.sh
#!/bin/bash
SENDTO=$1
SUBJECT=$2
MAIL=$3
echo "$MAIL" | mutt -s "$SUBJECT" $SENDTO
[root@zabbix-server ~]# chmod +x /usr/lib/zabbix/alertscripts/mail.sh
创建邮件报警媒介类型
脚本参数如下
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
将报警媒介关联用户
创建动作和操作
验证邮件告警
测试故障
[root@centos8 ~]#systemctl stop nginx
微信告警
注册企业微信
微信告警首先得注册一个企业微信,然后才能实现微信告警。
浏览器访问下面链接,注册企业微信
https://work.weixin.qq.com/
用浏览器进入管理后台
或者安装企业微信的PC端登录
创建部门和人员
创建部门
加入人员
方法1: 直接微信邀请,让相关人员自行扫码加入
方法2 手动添加人员
将微信应用中添加相关的部门或人员
也可以只加特定用户
将个人微信关联企业微信插件
可以使用手机号或邮箱邀请对应的员工加入此企业微信组织,之后员工用自已的微信扫下面的二维码就可用微信接收企业微信的消息
下面界面扫二维码可以将个人微信关联企业微信
如果前面还没同意加入企业,则个人微信扫码后,看到下面图示
输入相关信息,进行验证才能加入企业微信
下一步会发信邮件或短信进行验证
输入上面收到的验证码
上传Logo和指定应用名称,并选择范围
注意记下以下信息:
应用的 AgentId值1000003
应用的 Secret的值ga621_Y3iMMDW61gm-2iUmTia6RayBbH4gTH0CrJyD8
查看到企业ID的值为 ww644a0d95807e476b
**在应用中添加 企业可信IP (**最近添加的功能,必须配置IP白名单才能发微信,否则会出错)
测试发送微信消息
可以给加入的员工发送微信消息
员工个人微信可以收到以下信息
企业微信也可以收到信息
测试API
访问企业微信接口调试工具,输入corpid和和corpsecret 可以测试请求参数是否正确
访问下面地址
https://open.work.weixin.qq.com/wwopen/login?etype=missing%20cst
创建发送微信脚本
官方微信教程
https://developer.work.weixin.qq.com/document/path/90487
官方微信API参考文档
https://developer.work.weixin.qq.com/document/path/91039
发送微信可以使用各种语言,下面使用shell脚本实现
#查看zabbix server的配置文件
[root@zabbix-server ~]#grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
### Option: AlertScriptsPath
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
#实现发信微信的脚本
[root@zabbix-server alertscripts]#pwd
/usr/lib/zabbix/alertscripts
[root@zabbix-server alertscripts]#cat wechat.sh
#!/bin/bash
CorpID="ww644a0d95807e476b" #我的企业下面的CorpID
Secret="cGp4gHUpHLL1KQZY5abM3panGp-uCrEZyrgDvOT0OZA" #创建的应用那里的Secret
agentid=1000003 #改为 AgentId 在创建的应用可以查看
#PartyID=1 #通讯录中的部门ID,可选项
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?
corpid=$CorpID&corpsecret=$Secret"
Token=$(/usr/bin/curl -s -G $GURL |awk -F\": '{print $4}'|awk -F\" '{print $2}')
#echo $Token
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Token"
function body(){
local userid=$1 #脚本的第1个参数为接收微信的企业用户帐号,在通讯录中可以查看
#local partyid=$PartyID
local subject=$2 #脚本的第2个参数,表示消息主题
local msg=$(echo "$@" | cut -d" " -f3-) #脚本的第3个参数,表示消息正文
printf '{\n'
printf '\t"touser": "'"$userid"\"",\n"
#printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'"$agentid"\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$subject\n\n$msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $*)" $PURL
#添加执行权限
[root@zabbix-server alertscripts]#chmod +x wechat.sh
#发送测试微信,其中ayaka为企业微信的帐号,并且不区分大小写,在通讯录的用户成员详情中可以看到帐号
[root@zabbix-server alertscripts]#./wechat.sh ayaka 微信告警测试标题 告警测试信息
在手机企业微信APP中可以收到下面提示
创建微信报警媒介类型
报警媒介类型为脚本,脚本参数为以下三项
{ALERT.SENDTO}--收件人媒介
{ALERT.SUBJECT}--通知主题,因为微信没有主题,此项无效,可以不填写
{ALERT.MESSAGE}--通知内容
官方宏参考
https://www.zabbix.com/documentation/6.0/zh/manual/appendix/macros/supported_by_location
https://www.zabbix.com/documentation/5.0/zh/manual/appendix/macros/supported_by_location
https://www.zabbix.com/documentation/4.0/zh/manual/appendix/macros/supported_by_location
注意: 此处可以只填写 {ALERT.SENDTO} 和 {ALERT.MESSAGE} 即可
修改 Message Templates
#可以添加两个消息类型
# 问题
主题: 告警: {EVENT.NAME}
告警主机:{HOST.NAME1}
告警服务: {ITEM.NAME1}
告警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
告警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}
# 恢复 Problem Recovery
主题: 恢复: {EVENT.DURATION}: {EVENT.NAME}
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}
测试发微信消息
发送成功可以看到下面提示信息
可以在个人微信收到下面信息
给Zabbix用户添加报警媒介
对现在用户Admin编辑
添加微信报警媒介
注意: 此处的收件人是一个微信帐号,但实际上发送给应用的可见范围的所有用户
创建动作
编辑已有动作
如果已经创建动作,可以修改已有动作,如下所示
创建动作
如果之前没有动作,新创建动作
测试微信报警
#模拟故障
[root@centos8 ~]#systemctl stop nginx
同时个人微信可以看到下面提示
恢复服务后
[root@centos8 ~]#systemctl start nginx
个人微信可以收到下面的提示
#模拟故障恢复,观察微信是否收到恢复消息
[root@centos8 ~]#systemctl start nginx
在手机企业微信APP中可以收到下面提示
短信告警
确定短信服务商和短信服务相关信息
确定短信服务商
先确定一家短信服务平台,比如:阿里大于,腾讯云等
https://www.aliyun.com/product/sms
https://cloud.tencent.com/act/pro/csms
https://www.yunpian.com/
注意:一般的短信平台会需要注册用户帐号后实名认证,可能还会要求提交企业营业执照,个人身份证,网站备案信息等信息
以阿里云为例
#服务文档
https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.2.21.6b394c07W3s6kB
购买短信服务
到注册阿里云并且购买短信服务https://www.aliyun.com/product/sms
创建 AccessKey
可以使用AccessKey构造一个API请求(或者使用云服务SDK)来操作资源。AccessKey包括AccessKeyID和AccessKey Secret。
- AccessKey ID用于标识用户。
- AccessKey Secret是用来验证用户的密钥。AccessKey Secret必须保密
在阿里云基于安全目的,建议先创建RAM帐号(子帐号),生成AccessKey
操作步骤
- 使用云账号登录RAM控制台: https://ram.console.aliyun.com/overview
- 在左侧导航栏的人员管理菜单下,单击用户。
- 在用户登录名称/显示名称列表下,单击目标RAM用户名称
- 在用户AccessKey区域下,单击创建AccessKey
创建用户及相关的AccessKey
对生成的RAM用户进行授权
创建短信签名
https://help.aliyun.com/document_detail/108072.html?spm=a2c4g.11186623.2.20.245e4be5IFMXEF
注意:签名名称要和网站或公司名称相同,否则可能不能通过审核
创建短信模板
https://help.aliyun.com/document_detail/108086.html?spm=a2c4g.11186623.6.574.3ca821f24wFBe7
创建两个模板:故障通知和恢复通知模板
注意:阿里云模板中的变量有较高的要求,比如一个变量不能存超过25个字节的内容等
创建故障通知模
创建恢复通知模板
注意模板的编号
创建发送短信脚本
参考帮助实现短信脚本
https://help.aliyun.com/document_detail/112147.html?spm=a2c4g.11186623.6.672.2f7a5d1cf0jhs1
短信SDK
https://help.aliyun.com/document_detail/55359.html?spm=a2c4g.11186623.2.26.464e57cfuNqIcX
#CentOS8
[root@zabbix-server ~]#yum -y install python3
#ubuntu18.04
[root@zabbix-server ~]#apt -y install python3 python3-pip
#安装相关库
[root@zabbix-server ~]#pip3 install --upgrade pip
[root@zabbix-server ~]#pip3 install aliyun-python-sdk-core-v3
[root@zabbix-server ~]#cd /usr/lib/zabbix/alertscripts
[root@zabbix-server alertscripts]#cat send_sms.py
#!/usr/bin/env python3
#coding=utf-8
import sys
import const
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
client = AcsClient(const.ACCESS_KEY_ID, const.ACCESS_KEY_SECRET, 'ap-northeast-1')
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('dysmsapi.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https') # https | http
request.set_version('2017-05-25')
request.set_action_name('SendSms')
phone_number = sys.argv[1]
templatecode = sys.argv[2]
string = sys.argv[3]
message = string.split(";")
print(message)
#用分号将第三个短信参数分隔为多个字符串
message = string.split(";")
print(message)
sms_dict = { }
#分号分隔的第1个字符串为时间
sms_dict['time'] = message[0][0:24]
#分号分隔的第2个字符串为告警内容
sms_dict['item'] = message[1][0:24]
#分号分隔的第3个字符串为事件ID
sms_dict['item_id'] = message[2][0:24]
request.add_query_param('PhoneNumbers', phone_number)
request.add_query_param('SignName', "IT技术分享")
request.add_query_param('TemplateCode', templatecode)
request.add_query_param('TemplateParam', sms_dict)
response = client.do_action(request)
print(str(response, encoding = 'utf-8'))
[root@zabbix-server alertscripts]#chmod +x send_sms.py
#将AccessKey存放在独立文件中,比较安全
[root@zabbix-server alertscripts]#cat const.py
ACCESS_KEY_ID = 'xxxxxxxxxxxxxxxxx'
ACCESS_KEY_SECRET ='yyyyyyyyyyyyyyyyyy'
[root@zabbix-server alertscripts]#chmod 600 const.py
[root@zabbix-server alertscripts]#chown zabbix.zabbix const.py
#测试执行脚本实现故障通知告警,第一个参数是手机号,第二个参数是模板code,第三个参数是短信内容
[root@zabbix-server alertscripts]#./send_sms.py 18600123456 SMS_220620057 'test'
['test']
{"RequestId":"A9A1F98C-6F99-42F0-A688-
78480DD845C0","Message":"OK","BizId":"172222827010849369^0","Code":"OK"}
#测试执行脚本实现恢复通知告警
[root@zabbix-server alertscripts]#./send_sms.py 18600123456 SMS_220620137 'test'
['test']
{"RequestId":"29D0783B-CCCA-4E9B-87E3-
76FC76EC6480","Message":"OK","BizId":"768401427010885196^0","Code":"OK"}
创建短信媒介类型
脚本参数为以下两项
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
给Zabbix用户添加报警媒介
配置动作
创建新动作或修改原有动作
创建异常操作
示例1:加一个字段
{ITEM.NAME}
示例2:加多个字段
{EVENT.DATE} {EVENT.TIME};{TRIGGER.NAME};{EVENT.ID}
多字段
{EVENT.DATE} {EVENT.TIME};{TRIGGER.NAME};{EVENT.ID}
总体配置如下
测试短信报警
停止服务 模拟故障
[root@centos8 ~]#systemctl stop nginx
查看到手机收到短信
启动服务 模拟恢复故障
[root@centos8 ~]#systemctl start nginx
查看到手机收到短信
查看zabbix Serve服务器日志,可以看到下面信息
#注意需要修改日志级别才会看到下面日志
[root@zabbix-server ~]#grep ^DebugLevel /etc/zabbix/zabbix_server.conf
DebugLevel=4
[root@zabbix-server ~]#grep -A 3 sms /var/log/zabbix/zabbix_server.log
--
1818:20210723:120953.133 /usr/lib/zabbix/alertscripts/send_sms.py
'18600123680' 'SMS_220620057' 'Nginx: Number of processes running' output:
['Nginx: Number of processes running']
{"RequestId":"267B0BA1-0C87-4CED-8D45-
3FE03B1F6398","Message":"OK","BizId":"481300427013392932^0","Code":"OK"}
--
1817:20210723:121248.947 In zbx_popen()
command:'/usr/lib/zabbix/alertscripts/send_sms.py '18600123680' 'SMS_220620137'
'Nginx: Number of processes running''
1817:20210723:121248.947 End of zbx_popen():10
1828:20210723:121248.947 End of zbx_ipc_socket_read():SUCCEED
1828:20210723:121248.947 End of am_db_flush_results() flushed:0
实现故障自愈功能
当zabbix服务监控到指定的监控项异常时,可以通过指定的操作使故障自动恢复
以nginx服务为例,当nginx服务停止时,自动重启服务,实现故障自愈功能
Zabbix Agent 开启远程命令功能
配置远程命令的操作类似于发送消息,区别在于一个执行命令,一个发送消息
远程命令可以直接在ZabbixServer, ZabbixProxy和ZabbixAgent上执行。
但在Zabbix agent和Zabbix proxy上,远程命令默认是不开启的,它们可以通过以下方式启用:
在agent配置中添加AllowKey=system.run[*]、UnsafeUserParameters=1参数
在proxy配置中,将enableremotecommands参数设置为1
范例: 在故障自愈的客户端主机开启 Zabbix Agent 远程命令功能
#编译安装路径
[root@centos8 ~]#vim /apps/zabbix_agent/etc/zabbix_agentd.conf
#包安装路径
[root@ubuntu2204 ~]#vim /etc/zabbix/zabbix_agent2.conf
[root@centos8 ~]#vim /etc/zabbix/zabbix_agentd.conf
AllowKey=system.run[*] #开启执行功能,此项适合zabbix5.0版本以上,agent2默认没有配置,需要手工配置,用于代替早期版本的中EnableRemoteCommands
#EnableRemoteCommands=1 #开启远程执行命令,此指令在zabbix5.0版本以上淘汰
UnsafeUserParameters=1 #允许远程执行命令的时候使用不安全的参数(特殊字符串,如: \ ' * ? []{} ~ $ ! & ; ( ) < > 等 )
#1表示允许,默认为0不允许
[root@centos8 ~]#systemctl restart zabbix-agent.service
Zabbix Agent 对 Zabbix 用户授权管理权限
默认zabbix agent是使用zabbix用户启动的,有些特权命令zabbix用户是没有权限执行,会导致定义好的自治愈策略因为权限拒绝而执行失败,所以需要事先对zabbix用户进行授权.
范例:Zabbix 以 root 身份运行
#编译安装路径
[root@centos8 ~]#vim /apps/zabbix_agent/etc/zabbix_agentd.conf
#包安装路径
[root@ubuntu2204 ~]#vim /etc/zabbix/zabbix_agent2.conf
AllowRoot=1 #开启此项,直接使用root进行远程管理,而无须对zabbix用户授权sudo权限,注意:agent2取消此配置
#配合修改如下zabbix agent服务的运行身份
[root@ubuntu2204 ~]#vi /lib/systemd/system/zabbix-agent.service
[Service]
.....
#注释下面两行
#User=zabbix
#Group=zabbix
范例: 在 zabbix 用户进行 sudo 授权
[root@centos8 ~]#vim /etc/sudoers
#注意:NOPASSWD:后面有空格
zabbix ALL=(ALL) NOPASSWD: ALL
#检查语法
[root@centos8 ~]#visudo -c
#测试是否成功
[root@ubuntu2004 ~]#su -s /bin/bash zabbix -c "sudo systemctl restart mysql"
查看内置的模板及相关触发器
使用内置的版本关联需要监控的主机
使用内置模板 Template App Nginx by HTTP
添加脚本 (Zabbix 6.0 )
在Zabbix6.0 之前版本,直接在 Action 的 Operations 选项卡里填入对应的远程命令即可
从 6.0 版本开始,需要先在 Administrators—Scripts 里添加脚本,才能在 Operations 选项卡里选中
Zabbix 6.0 之后版本将执行的脚本事先创建出来才能创建下面的故障自愈的动作
创建动作
添加动作的条件,用于指定动作关联的条件,即只有特定的触发器发生才会执行动作
选中Nginx Service is down 的触发器
步骤为1和1表示只执行一次
步骤持续时间表示如果有多个步骤执行时的时间间隔,0表示使用默认步骤持续时间间隔
Zabbix5.0版本之前需要指定执行的命令
动作创建完成
停止监控主机的服务测试自愈功能
停止nginx服务
[root@centos8 ~]#systemctl stop nginx
在监测页面可以看到动作执行
#可以看到nginx服务被重新启动
[root@centos8 ~]#systemctl is-active nginx
active
#可以看到Zabbix Agent日志中提示执行命令,注意需要打开DebugLevel=4 才能看到下面信息
[root@centos8 ~]#cat /var/log/zabbix/zabbix_agentd.log
32381:20210713:003002.019 zbx_setproctitle() title:'listener #2 [processing
request]'
32381:20210713:003002.019 Requested [system.run[sudo systemctl restart
nginx,nowait]]
32381:20210713:003002.019 Executing command 'sudo systemctl restart nginx'
Zabbix 主动与被动模式
Zabbix 有两种工作模式: 主动和被动模式
无论是模式还是被动模式,都是站在zabbix agent 角度来说的工作模式
Zabbix 的主动和被动模式工作原理
Zabbix 监控流程中 Agent 收集数据分为主动和被动两种模式
主动模式和被动模式都是相对 zabbix agent 而言的
Zabbix默认是被动模式,如果有100个监控项,被动模式需要 Zabbix Server找 Zabbix Agent要100次
主动模式是Zabbix Server给 Zabbix Agent发送一个包括100个监控项的任务清单,Zabbix Agent根据任务清单,采集好100个监控项的值,主动汇报给 Zabbix Server这100个监控项,Zabbix Agent主动模式只需要发送一次数据,大大提高了传输效率。
- 被动模式: Server 向 Agent 请求获取监控项的数据,Agent返回数据。此为默认模式,如果有100个监控项,则需要100次交互
- 主动模式: Agent 请求 Server 获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy,如有100个监控项,只需要1次交互即可
注意: 两种模式可以在Zabbix Server上同时存在,可以将一部分监控项设为主动,其它设为被动模式
被动监测通信过程如下:
Server打开一个TCP连接
Server发送请求agent.ping
Agent接收到请求并且响应<HEADER><DATALEN>
Server处理接收到的数据
关闭TCP连接
被动模式每获取一个监控项都需要打开一个tcp连接,这样当监控项越来越多时,Zabbix Server会打开很多端口,就会出现server端性能瓶颈问题。
主动模式监测通信过程如下:
zabbix agent 首先向ServerActive配置的IP请求获取active items,获取并提交active items数据
值给server或者proxy。
zabbix多久获取一次active items?
它会根据agent的配置文件中的RefreshActiveChecks的频率进行,如果获取失败,那么将会在60秒之后重试。
主动模式的流程分两个部分:
- 获取ACTIVE ITEMS列表
Agent主动打开一个TCP连接(主动检测变成Agent打开)
Agent请求items检测列表
Server返回items列表
Agent 处理响应
关闭TCP连接
Agent开始收集数据
- 主动检测提交数据过程
Agent建立TCP连接
Agent批量提交items列表收集的所有监控项数据
Server处理数据,并返回响应状态
关闭TCP连接
被动模式
被动模式是指 zabbix agent 被动的接受zabbix server(或者Zabbix Proxy)周期性发送过来的数据收集指令
此为默认的工作方式。
在被动模式之下,zabbix server会根据主机关联的模板中的监控项和数据采集间隔时间,周期性的打开随机端口并向zabbix agent服务器的10050端口发起tcp连接,然后发送获取监控项数据的指令,即zabbix server发送什么指令那么zabbix agent就收集什么数据,zabbix server什么时候发送指令,zabbix agent就什么时候采集,zabbix server不发送指令,zabbix agent就一直不响应,所以zabbix agent也不用关心其监控项和数据采集周期间隔时间。
被动模式的优点就是配置简单,安装后即可使用,因此也成为zabbix的默认工作模式,但是被动模式的最大问题就是会加大zabbix server的 负载,在数百甚至数千台服务器的环境下会导致zabbix server需要轮训向每个zabbix agent发送数据采集指令,如果zabbix server负载过高还会导致不能及时获取到最新数据
被动模式因为性能的原因,一台 Zabbix Server 一般只能监控500台以下的主机,更多的主机建议使用主动模式
Zabbix Server 通过Poller进程实现被动模式
[root@zabbix-server ~]#grep StartPollers /etc/zabbix/zabbix_server.conf
#此数量可以适当进行调整
# StartPollers=5
[root@zabbix-server ~]#ps ax|grep poller
48 ? I< 0:00 [edac-poller]
1115 ? S 0:03 /usr/sbin/zabbix_server: http poller #1 [got 0
values in 0.000622 sec, idle 5 sec]
1246 ? S 0:01 /usr/sbin/zabbix_server: proxy poller #1 [exchanged
data with 0 proxies in 0.000036 sec, idle 5 sec]
1249 ? S 0:19 /usr/sbin/zabbix_server: poller #1 [got 0 values in
0.000020 sec, idle 1 sec]
1250 ? S 0:19 /usr/sbin/zabbix_server: poller #2 [got 1 values in
0.003333 sec, idle 1 sec]
1251 ? S 0:19 /usr/sbin/zabbix_server: poller #3 [got 1 values in
0.001767 sec, idle 1 sec]
1252 ? S 0:19 /usr/sbin/zabbix_server: poller #4 [got 3 values in
0.002736 sec, idle 1 sec]
1253 ? S 0:19 /usr/sbin/zabbix_server: poller #5 [got 0 values in
0.000043 sec, idle 1 sec]
1255 ? S 0:02 /usr/sbin/zabbix_server: unreachable poller #1 [got
0 values in 0.000048 sec, idle 5 sec]
24305 pts/2 S+ 0:00 grep --color=auto poller
范例: 查看被动模式下 Zabbix agent 进程和端口打开情况
[root@centos8 ~]#grep StartAgents /etc/zabbix/zabbix_agentd.conf
# StartAgents=3 #被动模式的进程数量,默认为3个,可以适当修改
[root@centos8 ~]#ps ax|grep zabbix
1793 ? S 0:00 /usr/sbin/zabbix_agentd -c
/etc/zabbix/zabbix_agentd.conf
1794 ? S 2:44 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
1795 ? S 0:12 /usr/sbin/zabbix_agentd: listener #1 [waiting for
connection]
1796 ? S 0:12 /usr/sbin/zabbix_agentd: listener #2 [waiting for
connection]
1797 ? S 0:12 /usr/sbin/zabbix_agentd: listener #3 [waiting for
connection]
1798 ? S 0:10 /usr/sbin/zabbix_agentd: active checks #1 [idle 1
sec]
21213 pts/1 S+ 0:00 vim /etc/zabbix/zabbix_agentd.conf
24150 pts/0 S+ 0:00 grep --color=auto zabbix
[root@centos8 ~]#ss -nta|grep 10050
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48786
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48790
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48866
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48884
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48860
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48848
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48846
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48826
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48774
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48808
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48836
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48824
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48772
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48840
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48820
TIME-WAIT 0 0 10.0.0.103:10050 10.0.0.100:48886
........
#被动模式下agent主机的日志中会提示以下错误
[root@centos8 ~]#tail /var/log/zabbix/zabbix_agentd.log
1414:20200830:180435.723 TLS support: YES
1414:20200830:180435.723 **************************
1414:20200830:180435.723 using configuration file:
/etc/zabbix/zabbix_agentd.conf
1414:20200830:180435.724 agent #0 started [main process]
1415:20200830:180435.724 agent #1 started [collector]
1416:20200830:180435.725 agent #2 started [listener #1]
1419:20200830:180435.725 agent #4 started [listener #3]
1420:20200830:180435.726 agent #5 started [active checks #1]
1418:20200830:180435.726 agent #3 started [listener #2]
1420:20200830:180435.727 active check configuration update from
[127.0.0.1:10051] started to fail (cannot connect to [[127.0.0.1]:10051]: [111]
Connection refused)
主动模式
主动模式介绍
主动模式是由每个zabbix agent 打开本机的随机端口, 主动向 Zabbix Server (或者Zabbix Proxy)的10051端口发起tcp连接请求
主动模式下必须在zabbix agent配置文件中指定zabbix server的IP或者主机名(必须可以被解析为IP地址)
在连接到zabbix server之前zabbix agent是不知道自己要采集那些数据以及间隔多久采集一次数据的,然后在连接到zabbix server以后获取到自己的监控项和数据采集间隔周期时间,之后再根据监控项采集数据并返回给zabbix server
在主动模式下不再需要zabbix serve向zabbix agent发起连接请求,因此主动模式在一定程度上可减轻zabbix server打开的本地随机端口和进程数,在一定程度就减轻了zabbix server的压力。经过优化后可以轻松监控2000台,甚至5000以上的主机
以下场景下生产推荐使用主动模式
- Zabbix Server 出现性能瓶颈, 监控队列出现大量延迟的监控项,告警不及时
- 监控主机超过 500 台以上
注意:主动模式模板Linux by Zabbix agent active的agent.ping监控项ZBX标记不会变绿,需要修改为被动模式ZBX标记才能被绿
Zabbix Agent 实现主动模式
注意: 下面使用Agent实现测试, 方便查看并行效果,使用Agent2看不到并行采集效果
在Zabbix Agent 实现主动模式流程
- 在 Zabbix Agent 配置主机模式相关配置
- 在 Zabbix Server 创建配置有主动模式监控项的模板
- 关联主动模板至支持主动模式的 Agent 主机
注意: 基于原被动模板克隆生成的主动模式模板,不是所有监控项都能改为主动模式,比如agent.ping 监控项如果改为主动模式, ZBX 提示将无法变绿
在 Zabbix Agent 配置主动模式
Zabbix Server 主动和被动模式无需配置即可支持,还可以支持多个主动和被动模式的Zabbix Agent 同时存在
Zabbix Server 通过 trapper 进程实现主动模式
[root@zabbix-server ~]#grep StartTrappers /etc/zabbix/zabbix_server.conf
#进程数可以适当调整
# StartTrappers=5
[root@zabbix-server ~]#ps ax|grep trapper
1256 ? S 0:00 /usr/sbin/zabbix_server: trapper #1 [processed data
in 0.000558 sec, waiting for connection]
1257 ? S 0:00 /usr/sbin/zabbix_server: trapper #2 [processed data
in 0.000241 sec, waiting for connection]
1258 ? S 0:00 /usr/sbin/zabbix_server: trapper #3 [processed data
in 0.000323 sec, waiting for connection]
1259 ? S 0:00 /usr/sbin/zabbix_server: trapper #4 [processed data
in 0.000312 sec, waiting for connection]
1260 ? S 0:00 /usr/sbin/zabbix_server: trapper #5 [processed data
in 0.000211 sec, waiting for connection]
24371 pts/2 S+ 0:00 grep --color=auto trapper
Zabbix Agent 默认是被动模式,需要修改配置才能支持主动模式
Zabbix Agent 的关健配置有下面三项
Server=<Zabbix Server> #被动模式指向 Zabbix Server的IP或FQDN,默认模式,在主动模式此项可选的,建议配置,否则ZBX显示红色
ServerActive=<Zabbix Server> #主动模式指向 Zabbix Server的IP或FQDN
Hostname=<当前主机IP> #当前主机的IP,此项必须和Zabbix Server中设置的主机名称相同,默认使用本机的主机名
HostnameItem=system.hostname #也可以使用此system.hostname监控项自动生成主机名称,默认就是使用本机的主机名
范例: Zabbix Agent配置主动模式配置
[root@centos8 ~]#grep '^[^#]' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.100 #被动模式指向 Zabbix Server的IP或FQDN
ServerActive=10.0.0.100 #主动模式指向 Zabbix Server的IP或FQDN
Hostname=10.0.0.104 #当前主机的IP,此项必须和Zabbix Server中设置的主机名称相同
Timeout=30 #建议修改
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@centos8 ~]#systemctl restart zabbix-agent.service
[root@centos8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:10050 [::]:*
#Zabbix agent主动模式对应的进程数量只有1个,不能调整
#Zabbix agent被动模式对应的进程数量默认3个,可以调整
[root@centos8 ~]#ps ax|grep zabbix
1793 ? S 0:00 /usr/sbin/zabbix_agentd -c
/etc/zabbix/zabbix_agentd.conf
1794 ? S 2:44 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
1795 ? S 0:12 /usr/sbin/zabbix_agentd: listener #1 [waiting for
connection]
1796 ? S 0:12 /usr/sbin/zabbix_agentd: listener #2 [waiting for
connection]
1797 ? S 0:12 /usr/sbin/zabbix_agentd: listener #3 [waiting for
connection]
1798 ? S 0:10 /usr/sbin/zabbix_agentd: active checks #1 [idle 1
sec]
21213 pts/1 S+ 0:00 vim /etc/zabbix/zabbix_agentd.conf
24150 pts/0 S+ 0:00 grep --color=auto zabbix
#观察日志可以看到以下信息
[root@centos8 ~]#tail /var/log/zabbix/zabbix_agentd.log
1414:20200830:183505.571 Got signal
[signal:15(SIGTERM),sender_pid:1630,sender_uid:993,reason:0]. Exiting ...
1414:20200830:183505.572 Zabbix Agent stopped. Zabbix 4.0.24 (revision
95be642769).
1634:20200830:183505.584 Starting Zabbix Agent [10.0.0.104]. Zabbix 4.0.24
(revision 95be642769).
1634:20200830:183505.584 **** Enabled features ****
1634:20200830:183505.584 IPv6 support: YES
1634:20200830:183505.584 TLS support: YES
1634:20200830:183505.584 **************************
1634:20200830:183505.584 using configuration file:
/etc/zabbix/zabbix_agentd.conf
1634:20200830:183505.584 agent #0 started [main process]
1638:20200830:183505.586 agent #4 started [listener #3]
1637:20200830:183505.588 agent #3 started [listener #2]
1636:20200830:183505.589 agent #2 started [listener #1]
1639:20200830:183505.590 agent #5 started [active checks #1]
1635:20200830:183505.591 agent #1 started [collector]
基于现有模板将包含的监控项修改为主动模式的监控项
注意: Zabbix 5.0 内置了主动模式的模板 Template OS Linux by Zabbix agent active 无需修改
Zabbix4.0 之前没有主动模式的模板,需要自行修改
以下操作为Zabbix 4.0上实现
选择全克隆,包括应用集,监控项,触发器,图形,聚合图形等
指定模板的名称
将新生成的模板的监控项修改为主动模式
选中新模板的监控项
提示: 建议将类型为zabbix客户端的监控项进行修改,其它类型如相关项目不建议修改为主动式
批量更新所有监控项
注意:此方式只是修改了大部分监控项为主动式,还有部分监控项,比如agent.ping 仍为被动式,保留即可,否则状态会有颜色异常
修改为主动式
修改更新间隔,此步非必须
确保新生成的模板中的自动发现规则中的类型也是主动式,此步非必须
修改每一个监控项
将主动模板关联到需要监控的主机
可以通过克隆当前已添加的主机,实现快速添加需要监控的主机
验证结果和查看日志
被动模式的监控项采集时间是串行的
主动模式的监控项采集时间是并行的
注意: 观察和对比两种不同模式下最新数据中每个监控项的最近检查记录显示的时间
#打开日志debug的功能
[root@centos8 ~]#vim /etc/zabbix/zabbix_agentd.conf
### Option: DebugLevel
# Specifies debug level:
# 0 - basic information about starting and stopping of Zabbix processes
# 1 - critical information
# 2 - error information
# 3 - warnings
# 4 - for debugging (produces lots of information)
# 5 - extended debugging (produces even more information)
#
# Mandatory: no
# Range: 0-5
# Default:
# DebugLevel=3
DebugLevel=4 #修改为4
[root@centos8 ~]#systemctl daemon-reload
[root@centos8 ~]#systemctl restart zabbix-agent.service
#观察日志
[root@centos8 ~]#tail /var/log/zabbix/zabbix_agentd.log
1995:20200830:190815.836 In send_buffer() host:'10.0.0.100' port:10051
entries:0/100
1995:20200830:190815.836 End of send_buffer():SUCCEED
1995:20200830:190815.836 __zbx_zbx_setproctitle() title:'active checks #1
[idle 1 sec]'
1991:20200830:190816.756 __zbx_zbx_setproctitle() title:'collector [processing
data]'
1991:20200830:190816.756 In update_cpustats()
1991:20200830:190816.756 End of update_cpustats()
1991:20200830:190816.756 __zbx_zbx_setproctitle() title:'collector [idle 1
sec]'
1995:20200830:190816.837 In send_buffer() host:'10.0.0.100' port:10051
entries:0/100
1995:20200830:190816.837 End of send_buffer():SUCCEED
1995:20200830:190816.837 __zbx_zbx_setproctitle() title:'active checks #1
[idle 1 sec]'
#利用zabbix_get测试zabbix agent是否正常
[root@zabbix-server ~]#/apps/zabbix_server/bin/zabbix_get -s 10.0.0.104 -p 10050 -k "agent.ping"
1
#同时会观察JSON相关的日志
[root@centos8 ~]#tail /var/log/zabbix/zabbix_agentd.log
1995:20200830:191801.051 In send_buffer() host:'10.0.0.100' port:10051
entries:47/100
1995:20200830:191801.052 JSON before sending [{"request":"agent
data","session":"5c6722cd2fc24994ed6464c14a97caf8","data":
[{"host":"10.0.0.104","key":"kernel.maxproc","value":"4194304","id":794,"clock":
1598786276,"ns":9997483},
{"host":"10.0.0.104","key":"net.if.in[eth0]","value":"10196965","id":795,"clock"
:1598786276,"ns":10330367},
{"host":"10.0.0.104","key":"net.if.out[eth0]","value":"2236200","id":796,"clock"
:1598786276,"ns":10582720},
{"host":"10.0.0.104","key":"proc.num[,,run]","value":"1","id":797,"clock":159878
6276,"ns":13785681},
{"host":"10.0.0.104","key":"proc.num[]","value":"151","id":798,"clock":159878627
6,"ns":15500404},
{"host":"10.0.0.104","key":"system.boottime","value":"1598780878","id":799,"cloc
k":1598786276,"ns":15819081},
{"host":"10.0.0.104","key":"system.cpu.intr","value":"649108","id":800,"clock":1
598786276,"ns":16113042},
{"host":"10.0.0.104","key":"system.cpu.load[percpu,avg15]","value":"0.000000","i
d":801,"clock":1598786276,"ns":16340118},
{"host":"10.0.0.104","key":"system.cpu.load[percpu,avg1]","value":"0.000000","id
":802,"clock":1598786276,"ns":16527639},
{"host":"10.0.0.104","key":"system.cpu.load[percpu,avg5]","value":"0.000000","id
":803,"clock":1598786276,"ns":16853309},
{"host":"10.0.0.104","key":"system.cpu.switches","value":"861417","id":804,"cloc
k":1598786276,"ns":17202784},
{"host":"10.0.0.104","key":"system.cpu.util[,guest]","value":"0.000000","id":805
,"clock":1598786276,"ns":17406626},
{"host":"10.0.0.104","key":"system.cpu.util[,guest_nice]","value":"0.000000","id
":806,"clock":1598786276,"ns":17579129},
{"host":"10.0.0.104","key":"system.cpu.util[,idle]","value":"99.708041","id":807
,"clock":1598786276,"ns":17774064},
{"host":"10.0.0.104","key":"system.cpu.util[,interrupt]","value":"0.108442","id"
:808,"clock":1598786276,"ns":18158603},
{"host":"10.0.0.104","key":"system.cpu.util[,iowait]","value":"0.000000","id":80
9,"clock":1598786276,"ns":18216251},
{"host":"10.0.0.104","key":"system.cpu.util[,nice]","value":"0.000000","id":810,
"clock":1598786276,"ns":18298355},
{"host":"10.0.0.104","key":"system.cpu.util[,softirq]","value":"0.083417","id":8
11,"clock":1598786276,"ns":18420904},
{"host":"10.0.0.104","key":"system.cpu.util[,steal]","value":"0.000000","id":812
,"clock":1598786276,"ns":18491466},
{"host":"10.0.0.104","key":"system.cpu.util[,system]","value":"0.091758","id":81
3,"clock":1598786276,"ns":18597355},
{"host":"10.0.0.104","key":"system.cpu.util[,user]","value":"0.008342","id":814,
"clock":1598786276,"ns":18645355},
{"host":"10.0.0.104","key":"system.hostname","value":"centos8.wangxiaochun.com",
"id":815,"clock":1598786276,"ns":18751444},
{"host":"10.0.0.104","key":"system.localtime","value":"1598786276","id":816,"clo
ck":1598786276,"ns":18808601},
{"host":"10.0.0.104","key":"system.swap.size[,free]","value":"2147479552","id":8
17,"clock":1598786276,"ns":18885966},
{"host":"10.0.0.104","key":"system.swap.size[,pfree]","value":"100.000000","id":
818,"clock":1598786276,"ns":18939847},
{"host":"10.0.0.104","key":"system.swap.size[,total]","value":"2147479552","id":
819,"clock":1598786276,"ns":19011080},
{"host":"10.0.0.104","key":"system.uname","value":"Linux
centos8.wangxiaochun.com 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020
x86_64","id":820,"clock":1598786276,"ns":19076923},
1995:20200830:191801.054 End of check_response():SUCCEED
1995:20200830:191801.054 OK