5 用户自定义参数

概述

有时,您可能希望运行 Zabbix 中未预定义的 agent 检查。 这时可以使用用户参数。

您可以编写一个用于获取所需数据的命令,并将其添加到 agent 配置文件 中的用户参数(UserParameter 配置参数)。

用户参数的语法如下:

UserParameter=<key>,<command>

如您所见,用户参数还包含一个键。 配置监控项时需要使用此键。请输入一个便于引用的自定义键(该键在一个主机内必须唯一)。

重启 agent,或使用 agent 的运行时控制选项加载新参数,例如:

zabbix_agentd -R userparameter_reload

然后,在配置监控项时,输入该键,以引用要执行的用户参数中的命令。

用户参数是由 Zabbix agent 执行的命令。 请注意,在执行监控项值预处理步骤之前,最多可以返回 16 MB 的数据。

在 UNIX 系统上,agent 使用 /bin/sh 执行用户参数命令,运行身份为运行 agent 的操作系统账户(通常为 zabbix)。 该账户必须具有执行命令以及访问命令所使用的任何文件、套接字或凭据的足够权限。

用户参数遵循 agent 检查超时设置;如果达到超时时间,派生的用户参数进程将被终止。

另请参阅:

简单 UserParameter 示例

示例 1:常量值

UserParameter=ping,echo 1

键为 ping 的监控项始终返回 1。

示例 2:MySQL 服务器可用性

UserParameter=mysql.ping,mysqladmin ping 2>/dev/null | grep -c alive

如果 MySQL 服务器响应,则返回 1;否则返回 0。 2>/dev/null 重定向会丢弃 mysqladmin 的标准错误输出。 如果没有此重定向,错误消息可能会与 0 一起返回,导致信息类型为 Numeric 的监控项变为不支持(请参阅命令结果)。
此示例假设已为运行 Zabbix agent 的操作系统账户配置 MySQL 连接凭据,例如,将凭据配置在该账户可访问的 MySQL 选项文件中。

灵活的用户参数

灵活的用户参数接受带有键的参数。这样,灵活的用户参数可以作为创建多个监控项的基础。

灵活的用户参数具有以下语法:

UserParameter=key[*],command
参数 描述
Key 唯一的监控项键。\[\*\] 定义此键可接受方括号内的参数。
配置监控项时提供参数。
Command 用于计算键值的待执行命令。
仅适用于灵活的用户参数:
您可以在命令中使用位置引用 $1…$9,以引用监控项键中的相应参数。
Zabbix 会解析监控项键中包含在 \[ \] 内的参数,并相应地替换命令中的 $1,...,$9。
$0 将替换为要执行的原始命令(在展开 $0,...,$9 之前)。
无论位置引用是否包含在双引号 (") 或单引号 (') 中,都会对其进行解析。
若要原样使用位置引用,请指定两个美元符号,例如 awk '{print $$2}'。在这种情况下,执行命令时,$$2 实际上会转换为 $2。

带有 $ 符号的位置引用仅由 Zabbix agent 针对灵活的用户参数进行搜索和替换。 对于简单的用户参数,将跳过此类引用处理,因此无需对任何 $ 符号进行转义。

默认情况下,用户参数中不允许使用某些字符。 有关完整的字符列表,请参阅 UnsafeUserParameters。

灵活 UserParameter 示例

以下示例仅用于演示目的,未经适当的安全防护,不应在生产环境中使用。 使用 [*] 定义的灵活 UserParameter 接受参数,如果处理不当,可能引入命令注入风险。

示例 1:返回参数

UserParameter=ping[*],echo $1

您可以使用此 UserParameter 定义多个监控项,其键格式为 ping[parameter]:

  • ping[0] - 返回 0。
  • ping[hello] - 返回 hello。

示例 2:指定主机上的 MySQL 可用性

此参数可用于监控指定主机上 MySQL 服务器的可用性。

UserParameter=mysql.ping[*],mysqladmin -h "$1" ping 2>/dev/null | grep -c alive

键为 mysql.ping[db1.example.com] 的监控项在该主机上的 MySQL 服务器响应时返回 1,否则返回 0。
此示例假设已为运行 Zabbix agent 的操作系统账户配置 MySQL 连接凭据,例如,将凭据配置在该账户可访问的 MySQL 选项文件中。

示例 3:统计匹配模式的行数

此参数可用于统计文件中的行数。

UserParameter=grep.count[*],grep -c "$2" "$1"

返回第一个参数指定的文件中与第二个参数指定的正则表达式匹配的行数。 例如,grep.count[/etc/passwd,root] 返回 /etc/passwd 中与正则表达式 root 匹配的行数。

命令结果

命令的返回值由标准输出以及命令产生的标准错误组成。

返回文本(字符、日志或文本类型信息)的监控项在出现标准错误输出时不会变为不受支持。

返回值限制为 16MB(包括会被截断的尾随空白);数据库限制 也同样适用。

返回文本(字符、日志或文本类型信息)的用户参数也可以返回空白字符。 如果结果无效,监控项将变为不受支持。