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 配置中启用。

请确保在 agent 配置中为每个允许的命令添加 AllowKey=system.run[<command>,\*] 参数,以允许使用 nowait 模式执行特定命令。如果更改了此参数,请重启 agent 守护进程。

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

  1. 定义适当的条件, 例如,将动作设置为在某个 Apache 应用程序发生任何灾难级问题时激活。

  1. 操作 选项卡中, 在 操作恢复操作更新操作 区块中单击 添加

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

预定义脚本

可用于动作操作(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