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 中启用
configuration

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

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

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

  1. 配置操作 标签页中,
    点击 OperationsRecovery operationsUpdate operations 块中的 Add

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

预定义脚本

可用于动作操作的脚本(webhook、脚本、SSH、Telnet、IPMI)定义于 global scripts

例如:

sudo /etc/init.d/apache restart  

sudo /etc/init.d/apache 重启

在这种情况下,Zabbix将尝试重启Apache进程。通过此 命令,确保该命令在Zabbix agent上执行(点击 Zabbix agent 按钮旁的 执行于)。

注意使用 sudo - Zabbix用户不具备 默认具有重启系统服务的权限。详情请参阅下文: 配置 sudo 的提示。

从 Zabbix agent 7.0 开始,远程命令也可以在运行于主动模式的 agent 上执行。 Zabbix agent - 无论是主动还是被动 - 都应在远程主机上run,并在后台执行命令。

在Zabbix agent上执行的远程命令通过run[,nowait]键实现无超时机制,且不会检查执行结果。 在Zabbix server和Zabbix proxy上,远程命令执行超时时间由zabbix_server.conf或zabbix_proxy.conf配置文件中的trappertimeout参数设定,并通过file功能退出码检查执行结果。 如需更多信息,请参阅脚本超时

访问权限

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

visudo

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

# 允许'zabbix'用户无需密码run所有命令
       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 关闭电源