2 远程命令

概述

通过远程命令功能,您可以定义在监控的主机满足特定条件时自动执行预定义的命令。

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

该功能最典型的应用场景包括:

  • 当应用程序(如Web服务器、中间件、CRM系统)无响应时自动重启
  • 使用IPMI的"reboot"命令对无响应的远程服务器进行重启
  • 当磁盘空间不足时自动清理空间(删除旧文件、清空/tmp目录)
  • 根据CPU负载情况将虚拟机迁移至不同的物理主机
  • 在CPU(磁盘、memory等)资源不足时向云环境添加新节点

配置远程命令操作与配置消息发送操作类似,唯一区别在于Zabbix将execute命令而非发送消息。

远程命令可由Zabbix server、proxy或agent执行。Zabbix agent上的远程命令可直接由Zabbix server执行或通过Zabbix proxy执行。无论是Zabbix agent还是Zabbix proxy,远程命令功能默认均处于禁用状态,可通过以下方式启用:

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

由Zabbix server执行的远程命令会按照Command execution文档所述进行run,包括退出码检查。

即使目标主机处于维护状态,远程命令仍会执行。

远程命令限制

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

数据库 字符限制 字节限制
MySQL 65535 65535
Oracle 数据库 2048 4000
PostgreSQL 65535 无限制
SQLite(仅限Zabbix proxy) 65535 无限制

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

配置

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

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

然后,在 Alerts → Actions → Trigger actions 中配置新的动作时:

  1. 定义相应的条件, 例如,设置该动作在 Apache 应用中的任一严重问题发生时被激活。

  1. Operations 选项卡中, 在 OperationsRecovery operationsUpdate operations 区块里点击 Add

  1. Operation 下拉列表中选择一个预定义脚本,并为该脚本设置 Target list

预定义脚本

可用于动作操作(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 参数设置的超时执行,并会检查执行结果。 有关更多信息,请参见 Script timeout

访问权限

确保'zabbix'用户对配置的命令具有execute权限。可以考虑使用sudo来授予特权命令的访问权限。要配置访问权限,请以root身份execute:

visudo

可在sudoers file中使用的示例行:

# allows 'zabbix' user to run all commands without password.
zabbix ALL=NOPASSWD: ALL

# 允许'zabbix'用户无需密码重启apache

zabbix ALL=NOPASSWD: /etc/init.d/apache restart

在某些系统上,sudoers file会阻止非本地用户执行命令。要更改此设置,请注释掉/etc/sudoers中的requiretty选项。

具有多个接口的远程命令

如果target系统具有所选类型的多个接口(Zabbix agent或IPMI),则远程命令将在默认接口上执行。

可以通过SSH和Telnet使用不同于Zabbix agent接口的接口执行execute远程命令。可用的接口按以下顺序选择:

  • Zabbix agent默认接口
  • SNMP默认接口
  • JMX默认接口
  • IPMI默认接口

IPMI 远程命令

对于IPMI远程命令,应使用以下语法:

<command> [<value>]

其中

  • <command> - 不带空格的IPMI命令之一
  • <value> - 'on'、'off'或任何无符号integer。<value>是一个可选参数。

示例

可作为操作中的远程命令使用的 全局脚本 示例。

示例 1

在特定条件下自动重启 Windows。

为了在 Zabbix 检测到问题时自动重启 Windows,请定义以下脚本:

脚本参数
Scope '动作操作'
Type '脚本'
Command c:\windows\system32\shutdown.exe -r -f

示例 2

通过使用IPMI控制来重启 主机。

脚本参数
Scope '动作操作'
Type 'IPMI'
Command 重置

示例 3

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

脚本参数
Scope '动作操作'
Type 'IPMI'
Command 关闭电源