Skip to end of metadata
Go to start of metadata

Zabbix远程执行命令

有时,一些简单问题的出现,并不需要我们投入系统工程师或者技术支持团队的人力来解决,通过远程命令的执行和一些升级操作,Zabbix提供了在问题发生时,甚至在发生之前自动解决问题的功,保持监控的连续性。只有在问题持续无法解决的情况下才会通知到负责人员

众所周知Zabbix是开源监控软件中的典型代表,Zabbix具备了采集功能强大的特点,而这个强大的功能依托于Zabbix具有丰富的远程执行命令的各种手段。

这些手段包括:

  • 监控项中的外部检查
  • 用户的自定义监控项
  • system.run内置监控项
  • 自定义警报脚本
  • 告警触发后的执行命令
  • Zabbix的全局自定义脚本

我们今天着重聊下system.run这个内置监控项,尤其在实际场景中的运用。首先这个内置监控项在官方文档中有详细介绍:

system.run[command,<mode>]
在主机上运行指定的命令。

命令执行的文本结果
1 - 模式为nowait(不管命令结果如何)

command - 要执行的命令
mode - 可能的值:
wait - 等待执行结束(默认),
nowait - 不等待

最多可以返回512KB的数据,包括截断的尾随空格。
要被正确的处理,命令的输出必须是文本。
示例:
⇒ system.run[ls -l /] → 根目录的详细文件列表。
注意: 要启用此功能,Zabbix agent配置文件 必须包含EnableRemoteCommands=1 选项。
注意: 监控项的返回值是标准输出以及由命令产生的标准错误输出。 如果没有使用nowait标志,则会检查执行结果。
注意: 从Zabbix 2.4.0开始,空结果是允许的。

特别需要注意的是,如果要启用这个功能的话,必须要在Zabbix Agent的配置文件中包含EnableRemoteCommand=1,所以此功能必须依赖于Zabbix Agent

1. 监控项

既然是内置监控项,那么就可以很方便得取回我们所要监控的内容。

例子:Zabbix Agent进程数

通过zabbix_get -s 192.168.126.128 -k "system.run[ps -ef | grep -v grep | grep zabbix_agent ]",可以看到所有的zabbix_agentd的进程。

通过wc –l来统计进程的数量,这样返回的值就可以被Zabbix监控并采集。这个示例只是展示最基本的用法,因为统计进程数量Zabbix已提供内置监控项。

监控过来的值就可以通过触发器触发,当采集的值等于0的时候触发。

2. 替代定时任务

在监控过程中,有时需要采集的值是通过计划任务定时生成的,例如文件、快照等。因为大量的监控项如果是通过文件可以取得的话,那么就可以大量节省连接被监控程序或应用的开支。但是在实际场景中,这样的计划任务不能被审核通过,需要有另外的替代方式,这个时候就需要用到system.run

例子:

创建Redis状态文件,并判断是否创建成功,成功返回1,不成功返回0

使用宏变量传值

{$REDIS_CLI}Redis执行文件的路径。

{$HOST_IP}:主机的IP地址

{#PORTS}:自动发现的端口,此例为多实例监控

{$REDIS_PWD}Redis数据库密码。

运行info.sh脚本文件

这样就能够控制每1分钟定时生成出我们所要的文件了。

3. windows操作系统上的使用

Zabbix服务器端无法对客户端的Agent直接操作,如果需要执行重启Agent服务的话,需要登录到客户端执行。在Linux环境中,可以通过脚本的方式实现,而在Windows环境中,却有诸多的不便,因为实际环境中大量部署Windows,且没有有效的批量部署工具,那么如何通过内置监控项system.run来实现呢?因为system.run是依赖于Zabbix Agent的,一旦Agent服务停止,就无法通过system.run启动了。

例子:

批量重启WindowsZabbix Agent

zabbix_get -s 192.168.126.1 -k "system.run[schtasks /create /SC ONCE /TN Test /TR C:\zabbix\zabbix_agentd.conf.d\restart_agent.bat /ST 17:00 /ET 17:20 /RU Administrator]"


通过system.run创建出一个计划任务。

/SC:计划任务的性质

/TN:创建任务的名称

/TR:执行的文件名

/ST:开始的时间

/ET:结束的时间

/RU:执行的用户

具体参数及说明参考schtasks命令。

可以看到该计划任务已成功创建。

这样该任务会在下午5点开始执行脚本:

脚本内容:

这样,就可以通过计划任务重启Zabbix Agent服务了。

如果不需要这个计划任务,还可以通过system.run删除该计划任务。

zabbix_get -s 192.168.126.1 -k "system.run[schtasks /delete /TN Test /F]"

这些就是system.run在实际场景中的一些应用,Zabbix很多时候每一个功能点都会为我们开启另一个领域,在新的领域中又有许多新的知识点需要学习,这也是Zabbix的魅力吧。