2 远程命令
概述
使用远程命令,您可以预定义在某些情况下会在受监控主机上自动执行的命令。
因此远程命令是智能主动监控的强大机制。
在该功能最显而易见的用途中,你可以尝试:
-
自动重启某些没有响应的应用(web服务器、中间件、CRM)
-
使用IPMI 'reboot'命令重启某些确实无法响应的服务器。
-
磁盘空间不足时自动释放(删除旧文件、清理)
-
根据CPU负载将VM从一台物理机迁移到另一台
-
CPU(磁盘、内存或其他)资源不足时向云环境添加新节点
为远程命令配置操作与发送消息类似,唯一的区别是 Zabbix 将执行一个命令而不是发送消息。
远程命令可以由Zabbix Server、Proxy 或agent执行。Zabbix agent上的远程命令可以由Zabbix Server或通过 Proxy 执行。Zabbix agent和Zabbix Proxy上的远程命令默认都是禁用的。 它们可以通过以下方式启用:
-
在agent的配置中添加一个
AllowKey=system.run[*]参数; -
在代理的配置中将
EnableRemoteCommands参数设为‘1’。
由 Zabbix server执行的远程命令按照命令执行所述运行,包括退出代码检查。
即使目标主机在维护状态,远程命令也会执行。
远程命令限制
在解析所有宏之后,远程命令的限制取决于数据库类型和字符集(非 ASCII 字符存储时需要超过一个字节):
| Database | 字符数限制 | 字节数限制 |
|---|---|---|
| MySQL | 65535 | 65535 |
| PostgreSQL | 65535 | 不受限制 |
| SQLite(仅 Zabbix proxy) | 65535 | 不受限制 |
远程命令执行输出(返回值)限制为 16MB(包括会被截断的尾随空白字符)。 IPMI 远程命令的限制取决于已安装的 IPMI 库。 请注意,数据库限制适用于所有远程命令。
配置
在 Zabbix agent上执行远程命令(自定义脚本)必须先在agent配置中启用。
必须确保添加了AllowKey=system.run[*]参数,并重启 agent后台驻留程序。
Zabbix active agent上远程命令不不生效。
然后,在告警 → 动作 → 告警动作配置新动作时:
- 定义适当的条件。在本例中,设置动作由Apache的任何灾难问题激活:

- 在 Operations选项卡,在Operations/Recovery/Update的操作块里点击
- 从Operation下拉菜单选择一个预定义的脚本

- 为脚本选择目标列表
预定义脚本
可用于动作操作(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 参数设置的超时时间执行,并且会检查执行结果。
更多信息,请参见脚本超时。
访问权限
请确保 '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,定义如下脚本:
| 脚本参数 | 值 |
|---|---|
| 范围 | 'Action operation' |
| 类型 | 'Script' |
| 命令 | c:\windows\system32\shutdown.exe -r -f |
示例 2
用 IPMI控制重启主机。
| 脚本参数 | 值 |
|---|---|
| 范围 | 'Action operation' |
| 类型 | 'IPMI' |
| 命令 | reset |
示例 3
使用 IPMI控制关闭主机电源。
| 脚本参数 | 值 |
|---|---|
| 范围 | 'Action operation' |
| 类型 | 'IPMI' |
| 命令 | power off |