5.1:Zabbix 实现 Nginx 的故障自治愈
当Zabbix监控到指定的监控项数据异常(激活触发器)时,可以通过指定的动作来尝试进行恢复操作,使简单故障有可以在第一时间被解决。
如果特定故障可以用触发器表示,并且有比较标准的处置流程,就可以使用这种方式来处置故障。
如果处置过程比较复杂,就可以将处置过程写入脚本,Zabbix直接调用脚本。
让Zabbix Server可以远程操作Zabbix Agent所在的主机,需要以下条件:
- 为被监控主机的zabbix用户设置正确的sudo权限;
- zabbix-agent开启允许远程命令;
- zabbix-agent开启允许不安全的UserParameter。
下面以node111(192.168.1.111)的Nginx为例,让Zabbix Server在被监控主机的Nginx服务停止后尝试恢复服务。
5.1.1:准备远程指令成功执行的条件
5.1.1.1:zabbix 用户 sudo 授权
一般zabbix-agent都是zabbix用户启动的(当然也不排除直接用root启动,这样就不需要这一步了,但存在安全隐患),为zabbix用户分配sudo权限,保证指令的正常执行。
授权zabbix用户可以不需要密码直接执行所有命令:
sudo权限的语法:
USER HOST=(可以切换的身份) [NOPASSWD:] COMMANDS
哪个用户 在哪台主机上=(可以切换的身份) 是否需要密码 可以执行的命令
root@node111:~# visudo
zabbix ALL=(ALL) NOPASSWD: ALL
5.1.1.2:zabbix-agent 开启远程命令支持
运行远程命令和不安全的UserParameter:
root@node111:~# vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1
UnsafeUserParameters=1
重启zabbix-agent:
root@node111:~# systemctl restart zabbix-agent
5.1.2:Zabbix Server 进行相关设置
5.1.2.1:创建监控项
在前边创建的Nginx状态监控模板(Linux_Nginx_Status)中加入80端口的检测监控项,作为触发器的基础。
添加检测80端口的监控项:
使用zabbix自带的键值net.tcp.listen[port]来进行监测,正常监听返回1,否则返回0。
验证最新数据:
5.1.2.2:创建触发器
创建基于“监测Nginx的80端口”监控项的触发器,如果最近一次监测结果为0,则触发告警。
表达式:
表示最近1次的监测数据=0,就符合触发条件。
可以在监控项图形上看到关联的触发器:
将node111的nginx关闭,验证触发器:
root@node111:~# systemctl stop nginx
出现告警:
启动Nginx,验证告警是否消失:
root@node111:~# systemctl start nginx
告警消失:
5.1.2.3:创建动作
当刚才的“Nginx监听80端口异常”触发器告警产生时,远程执行重启Nginx的操作,尝试恢复Nginx。
5.1.2.3.1:动作
5.1.2.3.2:操作
执行的命令为:
/usr/bin/sudo /bin/systemctl restart nginx
,截图中的少了/usr/bin/sudo
。
当模板中添加了动作之后,也就被关联到了模板相关的主机上了。
5.1.3:Nginx 故障自治愈验证
node111关闭Nginx:
root@node111:~# systemctl stop nginx
关闭后会出现触发器告警,稍等片刻告警消失。
查看问题记录,显示已解决,耗时10s,并可以看到解决的过程:
node111验证Nginx服务:
root@node111:~# ss -tnlp | grep nginx
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=117164,fd=6),("nginx",pid=117163,fd=6))
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=117164,fd=7),("nginx",pid=117163,fd=7))