远程命令
概述
通过远程命令,您可以定义在满足某个条件时,自动在受监控主机上执行预定义的命令。
因此,远程命令是实现智能主动监控的强大机制。
在最常见的使用场景中,您可以尝试:
- 如果某个应用程序(Web 服务器、中间件、CRM)无响应,则自动重启该应用程序
- 如果某台远程服务器不响应请求,则使用 IPMI 的“reboot”命令重启该服务器
- 如果磁盘空间不足,则自动释放磁盘空间(删除较旧的文件、清理
/tmp) - 根据 CPU 负载,将虚拟机从一台物理机迁移到另一台物理机
- 当 CPU(磁盘、内存或其他)资源不足时,向云环境添加新节点
为远程命令配置操作与为发送消息配置操作类似;唯一的区别是,Zabbix 执行命令,而不是发送消息。
远程命令可以由 Zabbix 服务器、Zabbix proxy 或 Zabbix agent 执行。 请注意以下事项:
- Zabbix agent 上的远程命令可以由 Zabbix 服务器直接执行,也可以通过 Zabbix proxy 执行。
- Zabbix 服务器执行的远程命令按照命令执行中所述的方式运行,包括检查退出代码。
- 即使目标主机处于维护模式,远程命令也会执行。
默认情况下,Zabbix agent 和 Zabbix proxy 上的远程命令均处于禁用状态。 可以按以下方式启用:
- 对于由 Zabbix agent 执行的远程命令,请在agent 配置中为每个允许的命令添加
AllowKey=system.run[<command>,*]或AllowKeyRegexp=(?s)^system\.run\[<command>,.*\]$参数,其中*匹配任一执行模式(wait或nowait)。 - 对于由 Zabbix proxy 执行的远程命令,请在proxy 配置中将
EnableRemoteCommands参数设置为1。 请注意,当远程命令由 proxy 监控的主机上的 Zabbix agent 执行时,无需在 Zabbix proxy 上启用远程命令。
除非确有必要,否则不要使用 AllowKey=system.run[*],因为它允许在主机上执行任意命令。
出于安全原因,建议仅允许执行精确的命令;默认情况下,system.run[*] 被拒绝(DenyKey=system.run[*])。
另请参阅限制 agent 检查。
远程命令限制
解析所有宏后,远程命令限制取决于数据库类型和字符集(存储非 ASCII 字符需要超过一个字节):
| 数据库 | 字符数限制 | 字节数限制 |
|---|---|---|
| MySQL | 65535 | 65535 |
| PostgreSQL | 65535 | 不受限制 |
| SQLite(仅限 Zabbix proxy) | 65535 | 不受限制 |
远程命令执行输出(返回值)限制为 16MB(包括末尾空白字符;末尾空白字符会被截断)。
IPMI 远程命令限制取决于已安装的 IPMI 库。
请注意,数据库限制适用于所有远程命令。
配置
Zabbix agent 执行的远程命令必须首先在 agent 配置中使用 AllowKey 或 AllowKeyRegexp 参数予以允许。
请确保在 agent 配置中为每个允许执行的命令添加 AllowKey=system.run[<command>,*] 或 AllowKeyRegexp=(?s)^system\.run\[<command>,.*\]$ 参数,以允许其在 nowait 模式下执行。
更改参数后,请重新启动 agent 守护进程。
然后,在告警 > 操作 > 触发器操作中配置新操作时:
- 定义适当的条件,例如,设置当任意一个 Apache 应用出现灾难级问题时激活该操作。

- 在 操作选项卡中,在操作、恢复操作或更新操作部分单击添加。

- 从操作下拉列表中选择一个预定义脚本,并为该脚本设置目标列表。

预定义脚本
可用于操作动作(webhook、脚本、SSH、Telnet、IPMI)的脚本在全局脚本中定义,并将作用域选择为操作动作。
例如:
sudo /etc/init.d/apache restart
在此情况下,Zabbix 将尝试重启 Apache 进程。 使用此命令时,请确保命令在 Zabbix agent 上执行(在执行位置中点击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 参数设置的超时时间执行,并会检查执行结果。
有关更多信息,请参见脚本超时。
访问权限
确保“zabbix”用户对已配置的命令具有执行权限。
您可能需要使用 sudo 来授予其执行特权命令的权限。
要配置访问权限,请以 root 身份执行:
visudo
以下是可在 sudoers 文件中使用的示例行:
# 允许“zabbix”用户无需密码运行所有命令。
zabbix ALL=NOPASSWD: ALL
# 允许“zabbix”用户无需密码重启 apache。
zabbix ALL=NOPASSWD: /etc/init.d/apache restart
在某些系统上,sudoers 文件会阻止非本地用户执行命令。要更改此设置,请在 /etc/sudoers 中注释掉 requiretty 选项。
使用多个接口执行远程命令
如果目标系统具有多个所选类型的接口(Zabbix agent 或 IPMI),远程命令将在默认接口上执行。
可以通过 SSH 和 Telnet 使用不同于 Zabbix agent 接口的其他接口执行远程命令。 可用接口按以下顺序选择:
- Zabbix agent 默认接口
- SNMP 默认接口
- JMX 默认接口
- IPMI 默认接口
IPMI 远程命令
对于 IPMI 远程命令,应使用以下语法:
<command> [<value>]
其中
- <command> - 不含空格的 IPMI 命令之一
- <value> - 'on'、'off' 或任意无符号整数。 <value> 是可选参数。
示例
可在动作操作中用作远程命令的全局脚本示例。
示例 1
在特定条件下重启 Windows。
为了在 Zabbix 检测到问题时自动重启 Windows,请定义以下脚本:
| 脚本参数 | 值 |
|---|---|
| 范围 | '操作动作' |
| 类型 | '脚本' |
| 命令 | c:\windows\system32\shutdown.exe -r -f |
示例 2
用 IPMI控制重启主机。
| 脚本参数 | 值 |
|---|---|
| 范围 | 'Action operation' |
| 类型 | 'IPMI' |
| 命令 | reset |
示例 3
使用 IPMI控制关闭主机电源。
| 脚本参数 | 值 |
|---|---|
| 范围 | 'Action operation' |
| 类型 | 'IPMI' |
| 命令 | power off |