远程命令

概述

通过远程命令,您可以定义在满足某些条件时,自动在被监控主机上执行某个预定义命令。

因此,远程命令是实现智能主动监控的强大机制。

在此功能最常见的用途中,您可以尝试:

  • 如果某个应用程序(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=^system\.run\[<command>,.*\]$ 参数,其中 * 匹配任一执行模式(wait 或 nowait)。
  • 对于由 Zabbix proxy 执行的远程命令,请在proxy 配置中将 EnableRemoteCommands 参数设置为 1。 请注意,当远程命令由 proxy 监控的主机上的 Zabbix agent 执行时,无需在 Zabbix proxy 上启用远程命令。

除非确有必要,否则不要使用 AllowKey=system.run[*] 或 AllowKeyRegexp=^system\.run\[.*\]$,因为这会允许在主机上执行任意命令。 出于安全原因,建议仅允许执行精确的命令,而 system.run[*] 默认处于拒绝状态(DenyKey=system.run[*])。

另请参阅限制 agent 检查。

远程命令限制

在解析所有宏之后,远程命令的限制取决于数据库类型和字符集(非 ASCII 字符存储时需要超过一个字节):

Database 字符数限制 字节数限制
MySQL 65535 65535
PostgreSQL 65535 不受限制
SQLite(仅 Zabbix proxy) 65535 不受限制

远程命令执行输出(返回值)限制为 16MB(包括会被截断的尾随空白字符)。 IPMI 远程命令的限制取决于已安装的 IPMI 库。 请注意,数据库限制适用于所有远程命令。

配置

Zabbix agent 执行的远程命令必须首先在 agent 配置中使用 AllowKey 或 AllowKeyRegexp 参数进行允许。

请确保在 agent 配置中为每个允许执行的命令添加 AllowKey=system.run[<command>,*] 或 AllowKeyRegexp=^system\.run\[<command>,.*\]$ 参数,以允许其在 nowait 模式下执行。 更改参数后,请重启 agent 守护进程。

然后,在告警 > 操作 > 触发器操作中配置新操作时:

  1. 定义适当的条件,例如,设置当任意一个 Apache 应用程序出现灾难级别问题时激活该操作。

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

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

预定义脚本

可用于动作操作的脚本(webhook、脚本、SSH、Telnet、IPMI)在 全局脚本 中定义,并将 Action operation 选为其作用域。

例如:

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 用户对已配置的命令具有执行权限。可以考虑使用 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,请定义以下脚本:

Script parameter Value
Scope 'Action operation'
Type 'Script'
Command c:\windows\system32\shutdown.exe -r -f
示例 2

用 IPMI控制重启主机。

脚本参数 值
范围 'Action operation'
类型 'IPMI'
命令 reset
示例 3

使用 IPMI控制关闭主机电源。

脚本参数 值
范围 'Action operation'
类型 'IPMI'
命令 power off