2 远程命令
概述
通过远程命令功能,您可以定义在监控的主机满足特定条件时自动执行预定义的命令。
因此,远程命令是实现智能主动监控的强大机制。
该功能最典型的应用场景包括:
- 当应用程序(如Web服务器、中间件、CRM系统)无响应时自动重启
- 使用IPMI的"reboot"命令对无响应的远程服务器进行重启
- 当磁盘空间不足时自动清理空间(删除旧文件、清空/tmp目录)
- 根据CPU负载情况将虚拟机迁移至不同的物理主机
- 在CPU(磁盘、memory等)资源不足时向云环境添加新节点
配置远程命令操作与配置消息发送操作类似,唯一区别在于Zabbix将execute命令而非发送消息。
远程命令可由Zabbix server、proxy或agent执行。Zabbix agent上的远程命令可直接由Zabbix server执行或通过Zabbix proxy执行。无论是Zabbix agent还是Zabbix proxy,远程命令功能默认均处于禁用状态,可通过以下方式启用:
- 在agent配置中添加AllowKey=system.run[*]参数
- 在proxy配置中将EnableRemoteCommands参数设为'1'
由Zabbix server执行的远程命令会按照Command execution文档所述进行run,包括退出码检查。
即使目标主机处于维护状态,远程命令仍会执行。
远程命令限制
远程命令的限制在解析所有宏之后取决于数据库类型和字符集(非ASCII字符需要多于一个字节进行存储):
| 数据库 | 字符限制 | 字节限制 |
|---|---|---|
| MySQL | 65535 | 65535 |
| Oracle 数据库 | 2048 | 4000 |
| PostgreSQL | 65535 | 无限制 |
| SQLite(仅限Zabbix proxy) | 65535 | 无限制 |
远程命令执行输出(返回值)限制为16MB(包含被截断的尾随空白字符)。 IPMI远程命令的限制取决于安装的IPMI库。 请注意,文本数据限制适用于所有远程命令。
配置
那些在 Zabbix agent 上执行的远程命令(自定义脚本) 必须先在 agent 配置中启用。
请确保在 agent 配置中为每个允许的命令添加 AllowKey=system.run[<command>,\*] 参数,以便在 nowait 模式下允许执行特定命令。如果更改了此参数,请重启 agent 守护进程。
然后,在 Alerts → Actions → Trigger actions 中配置新的动作时:
- 定义相应的条件, 例如,设置该动作在 Apache 应用中的任一严重问题发生时被激活。

- 在 Operations 选项卡中, 在 Operations、Recovery operations 或 Update operations 区块里点击 Add。

- 从 Operation 下拉列表中选择一个预定义脚本,并为该脚本设置 Target list。

预定义脚本
可用于动作操作(webhook、脚本、SSH、Telnet、IPMI)的脚本定义在 全局脚本中。
例如:
sudo /etc/init.d/apache restart
在这种情况下,Zabbix 将尝试重启 Apache 进程。使用此 命令时,请确保该命令是在 Zabbix agent 上执行的(点击 Execute on 旁边的 Zabbix agent 按钮)。
请注意 sudo 的使用 - 默认情况下,Zabbix 用户 没有重启系统服务的权限。有关如何配置 sudo 的提示,请参见下文。
从 Zabbix agent 7.0 开始,远程命令也可以在以主动模式运行的 agent 上执行。 Zabbix agent - 无论是主动还是被动 - 都应运行在远程主机上,并在后台执行这些命令。
在 Zabbix agent 上,远程命令通过 system.run[,nowait] 键执行,不设置超时,且不会检查执行结果。 在 Zabbix 服务器和 Zabbix proxy 上,远程命令会按照 zabbix_server.conf 或 zabbix_proxy.conf 文件中 TrapperTimeout 参数设置的超时执行,并会检查执行结果。 有关更多信息,请参见 Script timeout。
访问权限
确保'zabbix'用户对配置的命令具有execute权限。可以考虑使用sudo来授予特权命令的访问权限。要配置访问权限,请以root身份execute:
visudo
可在sudoers file中使用的示例行:
# allows 'zabbix' user to run all commands without password.
zabbix ALL=NOPASSWD: ALL
# 允许'zabbix'用户无需密码重启apache
zabbix ALL=NOPASSWD: /etc/init.d/apache restart
在某些系统上,sudoers file会阻止非本地用户执行命令。要更改此设置,请注释掉/etc/sudoers中的requiretty选项。
具有多个接口的远程命令
如果target系统具有所选类型的多个接口(Zabbix agent或IPMI),则远程命令将在默认接口上执行。
可以通过SSH和Telnet使用不同于Zabbix agent接口的接口执行execute远程命令。可用的接口按以下顺序选择:
- Zabbix agent默认接口
- SNMP默认接口
- JMX默认接口
- IPMI默认接口
IPMI 远程命令
对于IPMI远程命令,应使用以下语法:
<command> [<value>]
其中
- <command> - 不带空格的IPMI命令之一
- <value> - 'on'、'off'或任何无符号integer。<value>是一个可选参数。
示例
可作为操作中的远程命令使用的 全局脚本 示例。
示例 1
在特定条件下自动重启 Windows。
为了在 Zabbix 检测到问题时自动重启 Windows,请定义以下脚本:
| 脚本参数 | 值 |
|---|---|
| Scope | '动作操作' |
| Type | '脚本' |
| Command | c:\windows\system32\shutdown.exe -r -f |
示例 2
通过使用IPMI控制来重启 主机。
| 脚本参数 | 值 |
|---|---|
| Scope | '动作操作' |
| Type | 'IPMI' |
| Command | 重置 |
示例 3
通过使用IPMI控制关闭主机电源。
| 脚本参数 | 值 |
|---|---|
| Scope | '动作操作' |
| Type | 'IPMI' |
| Command | 关闭电源 |