3 脚本

概述

告警 > 脚本 部分,可以配置和维护用户定义的全局脚本。

全局脚本会根据配置的作用域以及用户权限,可在以下位置执行:

  • 在前端各个位置的主机菜单中执行(仪表板问题最新数据拓扑图 等)
  • 事件菜单中执行
  • 作为动作操作运行

脚本可在 Zabbix agent、Zabbix 服务器(proxy)或仅 Zabbix 服务器上执行。
另请参见命令执行

在 Zabbix agent 和 Zabbix proxy 上,远程脚本默认都是禁用的。
可通过以下方式启用:

  • 对于在 Zabbix agent 上执行的远程命令:
    • 在 agent 配置中,为每个允许的命令添加 AllowKey=system.run[<command>,*] 参数,其中 * 表示 wait 和 nowait 模式;
  • 对于在 Zabbix proxy 上执行的远程命令:
    • 警告:如果远程命令是在由 Zabbix proxy 监控的 Zabbix agent 上执行,则无需在 Zabbix proxy 上启用远程命令。 但是,如果确实需要在 Zabbix proxy 上执行远程命令,请在 proxy 配置中将 EnableRemoteCommands 参数设置为“1”。

可通过在服务器配置中设置 EnableGlobalScripts=0 来禁用在 Zabbix 服务器上执行全局脚本。
对于新安装环境,自 Zabbix 7.0 起,Zabbix 服务器上的全局脚本执行默认处于禁用状态。

系统会显示现有脚本及其详细信息列表。

显示的数据:

Column Description
Name 脚本名称。点击脚本名称将打开脚本配置表单
Scope 脚本的作用域——动作操作、手动主机操作或手动事件操作。此设置决定脚本可在哪些位置使用。
Used in actions 显示使用该脚本的所有动作,并在前面标出这些动作的总数。
点击动作名称将打开动作配置表单。如果用户对该动作没有权限,则名称不可点击。
Type 显示脚本类型——URLWebhookScriptSSHTelnetIPMI 命令。
Execute on 显示脚本将在 Zabbix agent、Zabbix proxy、服务器或仅 Zabbix 服务器上执行。
Commands 显示脚本中要执行的所有命令。
对于 webhook,此处不显示任何内容。
User group 显示该脚本可供使用的用户组(如果对所有用户组可用,则显示 All)。
Host group 显示该脚本适用的主机组(如果对所有主机组适用,则显示 All)。
Host access 显示主机组的权限级别——ReadWrite。只有具有所需权限级别的用户才能执行该脚本。

要配置新脚本,请点击右上角的 Create script 按钮。

批量编辑选项

列表下方的按钮提供了一个批量编辑选项:

  • 删除 - 删除脚本

要使用此选项,请在相应脚本前面勾选复选框,然后单击 删除

使用筛选器

您可以使用筛选器仅显示您感兴趣的脚本。 为了获得更好的搜索性能,数据在搜索时不会解析宏。

筛选器 链接位于脚本列表上方。 单击该链接后,将显示一个筛选器,您可以按名称和范围筛选脚本。

配置全局脚本

建议在全局脚本中使用宏函数而不是普通宏,以增强安全性,因为宏不会被自动转义。

脚本属性:

Parameter Description
Name 脚本的唯一名称。
例如:Clear /tmp filesystem
Scope 脚本的作用范围——动作操作、手动主机操作或手动事件操作。此设置决定了脚本可在何处使用——分别可用于动作操作的远程命令、从主机菜单或从事件菜单中使用。
将作用范围设置为“动作操作”后,所有有权访问 Alerts > Actions 的用户都可使用该脚本。
如果某个脚本实际上已在某个动作中使用,则其作用范围不能再从“动作操作”更改为其他值。
宏支持
作用范围会影响可用宏的范围。例如,用户相关宏({USER.*})在脚本中受支持,以便传递启动脚本的用户信息。但是,如果脚本作用范围为动作操作,则不支持这些宏,因为动作操作是自动执行的。
{MANUALINPUT} 宏允许在脚本执行时指定手动输入。它支持用于手动主机操作和手动事件操作脚本。
要了解还支持哪些其他宏,请在支持的宏表中搜索“基于触发器的通知和命令/基于触发器的命令”、“手动主机操作脚本”和“手动事件操作脚本”。请注意,如果某个宏可能解析为包含空格的值(例如主机名),请不要忘记按需加引号。
Menu path 脚本所需的菜单路径。例如,DefaultDefault/ 将在相应目录中显示该脚本。菜单可以嵌套,例如 Main menu/Sub menu1/Sub menu2。通过监控部分中的主机/事件菜单访问脚本时,它们将根据给定目录进行组织。
仅当 Scope 选择“手动主机操作”或“手动事件操作”时才会显示此字段。
Type 单击相应按钮以选择脚本类型:
URLWebhookScriptSSHTelnetIPMI 命令。
仅当 Scope 选择“手动主机操作”或“手动事件操作”时,URL 类型才可用。
脚本类型:URL
URL 指定 URL,以便从主机菜单事件菜单快速访问。
支持和自定义用户宏。宏支持取决于脚本的作用范围(见上文 Scope)。
在此字段中使用 {MANUALINPUT} 宏,可在脚本执行时指定手动输入,例如:
http://{MANUALINPUT}/zabbix/zabbix.php?action=dashboard.view
宏值不得进行 URL 编码。
Open in new window 确定 URL 应在新的浏览器标签页中打开还是在当前标签页中打开。
脚本类型:Webhook
Parameters 将 webhook 变量指定为属性-值对。
另请参见:Webhook 媒介配置。
参数值中支持和自定义用户宏。宏支持取决于脚本的作用范围(见上文 Scope)。
Script 在参数字段中单击,或单击其旁边的铅笔图标时打开的模态编辑器中输入 JavaScript 代码。
宏支持取决于脚本的作用范围(见上文 Scope)。
另请参见:Webhook 媒介配置,附加 Javascript 对象
Timeout JavaScript 执行超时(1-60 秒,默认 30 秒)。
支持时间后缀,例如 30s、1m。
脚本类型:Script
Execute on 单击相应按钮以在以下位置执行 shell 脚本:
Zabbix agent - 脚本将由主机上的 Zabbix agent 执行(如果 system.run 监控项被允许
Zabbix proxy or server - 脚本将由 Zabbix proxy 或服务器执行——具体取决于主机是由 proxy 还是服务器监控。
如果通过 EnableRemoteCommands 启用,则将在 proxy 上执行。
如果通过服务器参数 EnableGlobalScripts 启用全局脚本,则将在服务器上执行。
Zabbix server - 脚本将仅由 Zabbix 服务器执行。
如果通过服务器参数 EnableGlobalScripts 禁用了全局脚本,则此选项不可用。
Commands 输入要在脚本中执行的命令的完整路径。
宏支持取决于脚本的作用范围(见上文 Scope)。支持自定义用户宏
脚本类型:SSH
Authentication method 选择认证方式——密码或公钥。
Username 输入用户名。
Password 输入密码。
仅当认证方式选择“密码”时,此字段可用。
Public key file 输入公钥文件路径。
仅当认证方式选择“公钥”时,此字段可用。
Private key file 输入私钥文件路径。
仅当认证方式选择“公钥”时,此字段可用。
Passphrase 输入口令。
仅当认证方式选择“公钥”时,此字段可用。
Port 输入 Zabbix 将连接到的目标主机上的远程 SSH 服务端口。
Commands 输入命令。
宏支持取决于脚本的作用范围(见上文 Scope)。支持自定义用户宏
脚本类型:Telnet
Username 输入用户名。
Password 输入密码。
Port 输入 Zabbix 将连接到的目标主机上的远程 Telnet 服务端口。
Commands 输入命令。
宏支持取决于脚本的作用范围(见上文 Scope)。支持自定义用户宏
脚本类型:IPMI
Command 输入 IPMI 命令。
宏支持取决于脚本的作用范围(见上文 Scope)。支持自定义用户宏
Description 输入脚本说明。
Host group 选择该脚本可用于哪个主机组(或选择 All 表示所有主机组)。
User group 选择该脚本可供哪个用户组使用(或选择 All 表示所有用户组)。
仅当 Scope 选择“手动主机操作”或“手动事件操作”时才会显示此字段。
Required host permissions 选择主机组的权限级别——ReadWrite。只有具有所需权限级别的用户才能执行该脚本。
仅当 Scope 选择“手动主机操作”或“手动事件操作”时才会显示此字段。
Advanced configuration 单击 Advanced configuration 标签以显示高级配置选项。
仅当 Scope 选择“手动主机操作”或“手动事件操作”时才会显示此字段。

高级配置

高级配置选项可在可折叠的 高级配置 部分中找到:

参数 描述
启用用户输入 勾选复选框以在执行脚本之前启用手动用户输入。
手动用户输入将替换脚本中的 {MANUALINPUT} 宏值。
参见:手动用户输入
输入提示 输入自定义文本,提示进行自定义用户输入。此文本将显示在 手动输入 弹出窗口的输入字段上方。
要查看 手动输入 弹出窗口的预览,请单击 测试用户输入。预览还允许测试输入字符串是否符合输入验证规则(参见下面的参数)。
宏和用户宏支持取决于脚本的范围(参见一般脚本配置参数中的 范围)。
输入类型 选择手动输入类型:
字符串 - 单个字符串;
下拉菜单 - 从多个下拉选项中选择值。
下拉菜单选项 在逗号分隔的列表中输入用户输入下拉菜单的唯一值。
要在下拉菜单中包含空选项,请在列表的开头、中间或结尾额外添加逗号。
仅当选择“下拉菜单”作为 输入类型 时显示此字段。
默认输入字符串 输入用户输入的默认字符串(或不输入)。
此字段将根据提供的 输入验证规则 正则表达式进行验证。
手动输入 弹出窗口中,默认情况下将显示此处输入的值。
仅当选择“字符串”作为 输入类型 时显示此字段。
输入验证规则 输入用于验证用户输入字符串的正则表达式。
支持全局正则表达式。
仅当选择“字符串”作为 输入类型 时显示此字段。
启用确认 勾选复选框以在执行脚本之前显示确认消息。这个功能在执行可能危险的操作(例如重新启动脚本)或可能需要较长时间的操作时特别有用。
确认文本 输入用于确认弹出窗口的自定义确认文本(例如,“远程系统将重新启动。您确定吗?”)。要查看文本的外观,单击该字段旁边的 测试确认
支持和自定义用户宏
注意:在测试确认消息时,宏不会被扩展。

如果同时配置了手动用户输入和确认消息,则它们将依次显示在弹出窗口中。

手动用户输入

手动用户输入允许在每次执行脚本时提供一个自定义参数。
这样就无需创建多个仅有单个参数差异的类似用户脚本。

例如,您可能希望在执行期间向脚本提供不同的整数或不同的 URL 地址。

要启用手动用户输入:

  • 在需要的位置于脚本中(命令、脚本、脚本参数)使用 {MANUALINPUT} 宏;或者在 URL 脚本的 URL 字段中使用;
  • 高级脚本配置中,启用手动用户输入并配置输入选项。

启用用户输入后,在脚本执行之前,将向用户显示一个手动输入弹出窗口,要求其提供自定义值。
提供的值将替换脚本中的 {MANUALINPUT}。

根据配置,系统将要求用户输入一个字符串值:

或者从预定义选项的下拉列表中选择一个值:

手动用户输入仅适用于作用域为“手动主机操作”或“手动事件操作”的脚本。

脚本执行和结果

由 Zabbix 服务器运行的脚本将按照命令执行页面中描述的顺序执行。

脚本运行后,结果会显示在弹出的窗口中。 脚本的返回值为标准输出:

  • 如果脚本成功完成(退出代码0),返回值限制为 16MB(包括会被截断的尾随空白字符)。
  • 如果脚本因错误退出(非零退出代码),返回值为标准错误,限制为 2KB。

默认情况下,Zabbix 不会存储扩展的脚本输出。 要保留完整的输出详情,可以在脚本本身中实现日志记录(例如,将输出重定向到本地日志文件)。

请注意,对于在 Zabbix 服务器或 Zabbix proxy 上执行的脚本,数据库限制同样适用。

下面是一个脚本及其结果窗口的示例:

uname -v
/tmp/non_existing_script.sh
echo "This script was started by {USER.USERNAME}"

脚本结果中不会显示脚本本身。

脚本超时

Zabbix agent

您可能会遇到在执行脚本时发生超时的情况。

请参见下面在 Zabbix agent 上运行脚本及其结果窗口的示例:

sleep 5
df -h

在这种情况下,错误消息如下:

Timeout while executing a shell script.

为避免此类情况,建议优化脚本本身(在上述示例中为“5”),而不是调整 Zabbix agent configurationZabbix server configuration 中的 Timeout 参数。 但是,对于主动模式下的 Zabbix agent,Zabbix server configuration 中的 Timeout 参数应至少比 Zabbix agent configuration 中的 RefreshActiveChecks 参数长几秒。 这样可确保服务器有足够的时间从 agent 接收主动检查结果。 请注意,自 Zabbix agent 7.0 起,支持在主动 agent 上执行脚本。

如果在 Zabbix agent configuration 中更改了 Timeout 参数,则会出现以下错误消息:

Get value from agent failed: ZBX_TCP_READ() timed out.

这意味着修改已在 Zabbix agent configuration 中完成,但还需要同时修改 Zabbix server configuration 中的 Timeout 参数。

Zabbix 服务器/proxy

请参见下面在 Zabbix 服务器上运行脚本及其结果窗口的示例:

sleep 11
df -h

同时也建议优化脚本本身(而不是通过修改 Zabbix 服务器配置TrapperTimeout 参数调整为相应的值(在本例中,>11))。