远程命令

概述

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

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

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

  • 如果某个应用程序(Web 服务器、中间件、CRM)没有响应,则自动重启它
  • 使用 IPMI 的“reboot”命令,在某台远程服务器不响应请求时重启它
  • 如果磁盘空间不足,则自动释放磁盘空间(删除较旧的文件、清理 /tmp)
  • 根据 CPU 负载,将虚拟机从一台物理机迁移到另一台
  • 当 CPU(磁盘、内存或其他)资源不足时,向云环境中添加新的节点

为远程命令配置 action 与发送消息的配置类似,唯一的区别在于 Zabbix 会执行命令,而不是发送消息。

远程命令可以由 Zabbix 服务器、proxy 或 agent 执行。Zabbix agent 上的远程命令可以由 Zabbix 服务器直接执行,也可以通过 Zabbix proxy 执行。默认情况下,Zabbix agent 和 Zabbix proxy 上的远程命令都是禁用的。可通过以下方式启用:

  • 在 agent 配置中添加 AllowKey=system.run[*] 参数;
  • 在 proxy 配置中将 EnableRemoteCommands 参数设置为 1

由 Zabbix 服务器执行的远程命令会按照 命令执行 中所述方式运行,包括退出码检查。

即使目标主机处于维护中,远程命令也会执行。

远程命令限制

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

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

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

配置

那些在 Zabbix agent 上执行的远程命令(自定义脚本) 必须先在 agent 配置中启用。

请确保在 agent 配置中为每个允许的命令添加 AllowKey=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.confzabbix_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