3 脚本

概述

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

此菜单仅对 SuperAdmin 用户类型的用户可用。

根据配置的作用范围以及用户权限,全局脚本可用于执行:

脚本在 Zabbix agent、Zabbix 服务器(proxy)或仅在 Zabbix 服务器上执行 另请参见 Command execution

在 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 脚本的作用范围 - 动作 operation、手动主机操作或手动事件操作。此设置决定脚本可用的位置 - 分别是在动作 operations 的远程命令中、从 主机菜单 中,或从 事件菜单 中。
Used in actions 会显示使用该脚本的所有动作,(自 Zabbix 7.0.4 起)其前面会显示这些动作的总数。
单击动作名称会打开动作配置表单。如果用户没有该动作的权限,则名称不可点击。
Type 显示脚本类型 - URLWebhookScriptSSHTelnetIPMI command。
Execute on 显示脚本将在 Zabbix agent、Zabbix proxy 或服务器上执行,还是仅在 Zabbix 服务器上执行。
Commands 显示脚本中要执行的所有命令。
webhook 不显示此项内容。
User group 显示脚本可供使用的用户组(或 All,表示所有用户组)。
Host group 显示脚本可供使用的主机组(或 All,表示所有主机组)。
Host access 显示主机组的权限级别 - ReadWrite。只有具有所需权限级别的用户才能执行该脚本。

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

批量编辑选项

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

  • 删除 - delete 脚本

要使用此选项,请在相应脚本前的复选框中打勾,然后点击 删除

使用过滤器

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

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

配置全局脚本

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

脚本属性:

参数 描述
名称 脚本的唯一名称。
例如:Clear /tmp filesystem
范围 脚本的范围 - 动作操作、手动主机操作或手动事件操作。此设置决定脚本的使用位置 - 分别用于动作操作中的远程命令、主机菜单事件菜单
将范围设置为“动作操作”后,所有有权访问告警 > 动作的用户都可以使用该脚本。
如果脚本实际用于某个动作,则无法将其范围更改为“动作操作”以外的其他选项。
宏支持
范围会影响可用宏的范围。例如,脚本支持与用户相关的宏({USER.*}),以便传递启动脚本的用户信息。但是,如果脚本范围为动作操作,则不支持这些宏,因为动作操作会自动执行。
{MANUALINPUT}宏允许在脚本执行时指定手动输入。手动主机操作和手动事件操作脚本支持此宏。
要了解还支持哪些其他宏,请在支持的宏表中搜索“基于触发器的通知和命令/基于触发器的命令”、“手动主机操作脚本”和“手动事件操作脚本”。请注意,如果宏可能解析为包含空格的值(例如主机名),请务必根据需要加引号。
菜单路径 脚本所需的菜单路径。例如,DefaultDefault/会将脚本显示在相应目录中。菜单可以嵌套,例如Main menu/Sub menu1/Sub menu2。通过监控部分中的主机/事件菜单访问脚本时,脚本将按照指定的目录进行组织。
仅当范围选择“手动主机操作”或“手动事件操作”时显示此字段。
类型 单击相应按钮选择脚本类型:
URLWebhookScriptSSHTelnetIPMI命令。
仅当范围选择“手动主机操作”或“手动事件操作”时,URL类型可用。
脚本类型:URL
URL 指定URL,以便从主机菜单事件菜单快速访问。
支持和自定义用户宏。宏支持取决于脚本的范围(请参见上面的范围)。
在此字段中使用{MANUALINPUT}宏,可以在脚本执行时指定手动输入,例如:
http://{MANUALINPUT}/zabbix/zabbix.php?action=dashboard.view
宏值不得进行URL编码。
在新窗口中打开 确定是在新的浏览器标签页还是当前浏览器标签页中打开URL。
脚本类型:Webhook
参数 以属性-值对的形式指定webhook变量。
另请参见:Webhook媒体配置。
参数值支持和自定义用户宏。宏支持取决于脚本的范围(请参见上面的范围)。
脚本 在单击参数字段或其旁边的铅笔图标时打开的模态编辑器中输入JavaScript代码。
宏支持取决于脚本的范围(请参见上面的范围)。
另请参见:Webhook媒体配置、其他Javascript对象
超时 JavaScript执行超时时间(1-60秒,默认30秒)。
支持时间后缀(例如30s1m)。
脚本类型:Script
执行位置 单击相应按钮,选择在哪一端执行shell脚本:
Zabbix agent - 脚本将由Zabbix agent在主机上执行(前提是system.run监控项已被允许)。
Zabbix proxy或服务器 - 脚本将由Zabbix proxy或服务器执行,具体取决于主机由proxy还是服务器监控。
如果通过EnableRemoteCommands启用,脚本将在proxy上执行。
如果服务器参数EnableGlobalScripts启用全局脚本,脚本将在服务器上执行。
Zabbix服务器 - 脚本仅由Zabbix服务器执行。
如果服务器参数EnableGlobalScripts禁用全局脚本,则此选项不可用。
命令 输入脚本中要执行的命令的完整路径。
宏支持取决于脚本的范围(请参见上面的范围)。支持自定义用户宏
脚本类型:SSH
身份验证方法 选择身份验证方法 - 密码或公钥。
用户名 输入用户名。
密码 输入密码。
当身份验证方法选择“密码”时,此字段可用。
公钥文件 输入公钥文件的路径。
当身份验证方法选择“公钥”时,此字段可用。
私钥文件 输入私钥文件的路径。
当身份验证方法选择“公钥”时,此字段可用。
密码短语 输入密码短语。
当身份验证方法选择“公钥”时,此字段可用。
端口 输入Zabbix将连接的目标主机上的远程SSH服务端口。
命令 输入命令。
宏支持取决于脚本的范围(请参见上面的范围)。支持自定义用户宏
脚本类型:Telnet
用户名 输入用户名。
密码 输入密码。
端口 输入Zabbix将连接的目标主机上的远程Telnet服务端口。
命令 输入命令。
宏支持取决于脚本的范围(请参见上面的范围)。支持自定义用户宏
脚本类型:IPMI
命令 输入IPMI命令。
宏支持取决于脚本的范围(请参见上面的范围)。支持自定义用户宏
描述 输入脚本的描述。
主机组 选择脚本可用的主机组(或选择全部,使其对所有主机组可用)。
用户组 选择脚本可用的用户组(或选择全部,使其对所有用户组可用)。
仅当范围选择“手动主机操作”或“手动事件操作”时显示此字段。
所需主机权限 选择主机组的权限级别 - 读取写入。只有具有所需权限级别的用户才能执行脚本。
仅当范围选择“手动主机操作”或“手动事件操作”时显示此字段。
高级配置 单击高级配置标题以显示高级配置选项。
仅当范围选择“手动主机操作”或“手动事件操作”时显示此字段。

高级配置

高级配置选项位于可折叠的 高级配置(Advanced configuration) 部分中:

参数 描述
Enable user input 勾选此复选框以在执行脚本前启用手动用户输入。
手动用户输入将替换脚本中的 {MANUALINPUT} 宏值。
另请参阅:手动用户输入
Input prompt 输入自定义文本以提示用户进行自定义输入。该文本将显示在 手动输入(Manual input) 弹出窗口中的输入字段上方。
要预览 手动输入(Manual input) 弹出窗口,请点击 测试用户输入(Test user input)。预览还允许测试输入的 string 是否符合输入验证规则(见以下参数)。
宏和用户宏的支持取决于脚本的作用域(参见通用脚本配置参数中的 作用域(Scope))。
Input type 选择手动输入类型:
string - 单个 string;
下拉框(Dropdown) - 从多个下拉选项中选择值。
Dropdown options 在逗号分隔的列表中输入用户输入下拉框的唯一值。
要在下拉框中包含一个空选项,请在列表的开头、中间或末尾添加一个额外的逗号。
仅当选择“下拉框(Dropdown)”作为 输入类型(Input type) 时,此字段才会显示。
Default input string 输入用户输入的默认 string(或不输入)。
此处输入的值将根据 输入验证规则(Input validation rule) 字段中提供的正则表达式进行验证。
此处输入的值将在 手动输入(Manual input) 弹出窗口中默认显示。
仅当选择“string”作为 输入类型(Input type) 时,此字段才会显示。
Input validation rule 输入正则表达式以验证用户输入的 string。
支持全局正则表达式。
仅当选择“string”作为 输入类型(Input type) 时,此字段才会显示。
Enable confirmation 勾选此复选框以在执行脚本前显示确认消息。此功能可能在执行潜在危险操作(如重启脚本)或耗时较长的操作时特别有用。
Confirmation text 输入自定义确认文本以用于上方复选框启用的确认弹出窗口(例如,远程系统将被重启。您确定吗?)。要查看文本的显示效果,请点击字段旁边的 测试确认(Test confirmation)
支持 Macros 和自定义 user macros
注意: 测试确认消息时,宏不会展开。

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

手动用户输入

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

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

要启用手动用户输入:

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

启用用户输入后,在脚本执行之前,用户会看到一个 Manual input 弹窗,要求提供自定义值。 所提供的值将替换脚本中的 {MANUALINPUT}。

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

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

手动用户输入仅适用于作用域为“Manual host action”或“Manual event action”的脚本。

脚本执行和结果

由 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 配置Zabbix 服务器配置 中的 Timeout 参数。

如果已在 Zabbix agent 配置 中更改了 Timeout 参数,则会出现以下错误信息:

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

这意味着修改已在 Zabbix agent 配置 中完成,但还需要同时修改 Zabbix 服务器配置 中的 Timeout 参数。

活动 agent 上的脚本超时

只能在以主动模式运行的 agent 上执行 脚本(自 Zabbix 7.0 起)。 一旦脚本执行由动作 操作 或手动脚本执行触发,该命令就会包含在主动检查配置中,并在活动 agent 收到后执行。

手动脚本会连同用于脚本执行的服务器/proxy 超时一起发送给活动 agent。请增加默认的 服务器/proxy 脚本执行超时时间。 该超时时间必须高于主动检查刷新频率,否则在活动 agent 收到脚本并能够返回结果之前,就会发生超时。

Zabbix 服务器/proxy 上的脚本超时

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

sleep 11
df -h

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