ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Apache DolphinScheduler Script 脚本告警插件使用指南:参数配置、执行原理与安全防护

Apache DolphinScheduler Script 脚本告警插件使用指南:参数配置、执行原理与安全防护 任务调度大数据后端前端【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址https://gitcode.com/gh_mirrors/do/dolphinscheduler点击查看免费下载本指南以 Apache DolphinScheduler 告警插件体系中的ScriptShell 脚本插件为核心讲解如何在告警实例管理中创建脚本告警实例、配置脚本路径与自定义参数并结合仓库源码剖析脚本执行器ScriptSender的完整调用链、命令行参数约定与命令注入防护机制。读完本文你将掌握用 Shell 脚本接入任意自定义告警通道如自研通知系统、企业内部 IM、监控平台 Webhook 等的完整实战方案。一、Script 插件能做什么在 DolphinScheduler 中告警是任务流运行状态成功 / 失败触发的下游动作。内置的 告警插件目录 覆盖了 DingTalk、企业微信、飞书、邮件、HTTP 等常见通道但真实生产环境往往存在内置插件覆盖不到的自定义通知渠道。Script 插件正是为这类场景设计的万能出口把告警标题与内容作为命令行参数交给用户指定的 Shell 脚本处理脚本内可以自由对接内部短信网关、自研 IM、工单系统、监控平台 API 等任意服务通过脚本的退出码exit code反馈告警发送是否成功进而决定该条告警记录的最终状态。从源码结构看Script 插件位于 dolphinscheduler-alert-script 模块核心实现由ScriptAlertChannelFactory插件工厂、ScriptAlertChannel告警通道、ScriptSender脚本执行器、ProcessUtils进程工具、StreamGobbler输出流消费线程和ScriptType脚本类型枚举六个类构成。二、创建告警实例配置步骤与字段说明如需使用Shell脚本进行告警请在告警实例管理中创建告警实例并选择Script插件。以下为Script的配置示例2.1 参数配置表参数说明用户参数User Params用户自定义的参数将作为-p参数传入脚本执行非必填脚本路径Script Path脚本在服务器上的文件位置只支持.sh后缀的文件必填脚本类型Type目前支持Shell脚本单选默认且仅提供SHELL选项必填从 ScriptAlertChannelFactory.java 可以看出三个字段在代码侧的完整定义userParamsInputParam类型requiredfalse占位提示为 Customized Params允许留空pathInputParam类型requiredtrue源码注释明确说明需要校验文件类型与文件是否存在typeRadioParam单选参数目前唯一可选项来自 ScriptType.java 枚举中的SHELL(0, SHELL)。三个字段的配置键名定义在 ScriptParamsConstants.java 中分别是type、path、userParams它们在执行期会被组装进参数 Map 传给ScriptSender。2.2 告警实例的完整填写项参照配置界面截图一个完整的告警实例通常还包含以下通用字段与插件参数配合使用告警实例名称Alarm instance name必填为该实例起一个可辨识的名称如script001选择插件Select plugin必填选中Script告警类型Warning Type必填单选success/failure/all决定任务成功、失败或全部情况下触发该脚本告警用户参数User Params可选按脚本约定格式填写例如--toadminexample.com --subjectDolphinScheduler Alert脚本路径Script Path必填填写服务器上可执行脚本的绝对路径例如/home/script.sh脚本类型Type必填选中SHELL。2.3 注意事项请注意脚本的读写权限与执行租户的关系。脚本告警实际运行在 Alert Server 所在宿主机上以执行告警的租户身份调用/bin/sh因此必须保证脚本文件对该执行用户具备可读必要时可执行权限脚本内部需要读写的外部文件、日志目录、凭据文件等同样要授予对应租户合理的访问权限若脚本需要调用外部命令或网络接口需确认执行环境PATH、代理、DNS对该租户可用。三、脚本的执行约定命令行参数与退出码3.1 参数传递协议从 ScriptSender.java 可以看到插件实际构造的命令为/bin/sh -c scriptPath -t title -c content -p userParams即脚本固定接收三个短参数参数含义-t告警标题title来自告警数据-c告警内容content来自告警数据-p用户自定义参数userParams来自告警实例配置仓库自带的示例脚本 scriptExample.sh 演示了标准的参数解析骨架可作为编写自有脚本的模板#!/bin/bash while getopts t:c:p: opts; do case $opts in t) t$OPTARG ;; c) c$OPTARG ;; p) p$OPTARG ;; ?) ;; esac done # Write your specific logic here # Set the exit code according to your execution result, and alert needs to use it # to judge the status of this alarm result if [ $t error msg title ]; then exit 12 fi exit 03.2 退出码决定告警结果ScriptSender在脚本执行完毕后读取进程退出码退出码为0告警发送成功返回send script alert msg success退出码非0告警发送失败返回send script alert msg error,exitCode is n。因此脚本必须在结尾exit 0发送成功或exit 非 0发送失败之间做出明确选择DolphinScheduler 会依据该结果更新告警记录状态并在告警实例测试中给出直观反馈。3.3 进程执行与输出流处理脚本通过 ProcessUtils.java 中的ProcessBuilder启动子进程并调用process.waitFor()同步等待脚本结束。为防止脚本输出内容过多导致标准输出 / 错误流的管道缓冲区阻塞ProcessUtils会为输入流和错误流分别启动一个 StreamGobbler.java 线程持续消费并打印到告警服务日志从而避免死锁、保证等待超时可控。脚本自身的 stdout/stderr 不会直接作为告警结果返回排查问题时请关注 Alert Server 日志中的out put msg is ...输出。四、执行链路与校验逻辑从触发到结果一次脚本告警的完整调用链如下告警触发后ScriptAlertChannel.process(AlertInfo)被调用。该入口位于 ScriptAlertChannel.java若参数 Map 为空会直接返回script params is empty的失败结果参数 Map 被封装为ScriptSender调用sendScriptAlert(title, content)sendScriptAlert首先校验scriptType是否为SHELL其余类型会返回script type error源码注释预留了可以在这里扩展 python 等其他脚本类型的扩展点进入executeShellScript后按顺序执行以下校验见 ScriptSender.java操作系统校验Windows 环境直接返回shell script not support windows os即该插件仅支持类 Unix 环境后缀校验脚本路径必须以.sh结尾否则返回shell script is invalid, only support .sh file存在性校验文件必须存在否则返回shell script not exist : path类型校验路径必须是普通文件而非目录否则返回shell script is not a file : path注入防护校验详见下一节构造/bin/sh -c命令并执行依据退出码返回成功 / 失败结果。五、安全设计命令注入RCE防护由于脚本告警的本质是把外部文本拼入 shell 命令执行若不加约束极易产生命令注入漏洞。ScriptSender在构造命令前对标题、内容、用户参数三部分统一执行了单引号黑名单校验见 ScriptSender.javaif (userParams.contains()) { log.error(shell script illegal user params : {}, userParams); ... } if (title.contains()) { ... } if (content.contains()) { ... }任一输入包含单引号插件都会拒绝执行并记录shell script illegal ...日志。单引号是 shell 拼接场景下逃逸出参数边界的核心字符拦截它即可阻断形如; rm -rf /; 的注入载荷。这一点在单元测试 ScriptSenderTest.java 中有直接验证testScriptSenderInjectionTest将用户参数设置为 ; calc.exe ; 断言告警结果必然失败。同文件中的其他测试用例还覆盖了正常发送成功 / 失败对应脚本示例中error msg title的分支、用户参数为null时仍可成功空参数不触发注入拦截、路径为null或指向非.sh文件时失败等边界场景可作为理解插件行为边界的参考。六、常见问题排查清单现象可能原因排查建议告警结果提示shell script not exist脚本路径填写错误或文件被删除在 Alert Server 所在机器上确认路径存在告警结果提示only support .sh file路径后缀不是.sh重命名为.sh后缀的脚本文件告警结果提示shell script illegal ...标题 / 内容 / 用户参数中包含单引号在脚本内改用双引号或转义方式处理含引号内容告警结果提示shell script not support windows os在 Windows 上运行 Alert Server将脚本告警部署到 Linux 环境脚本明明执行成功但告警仍失败脚本未以exit 0结束检查脚本尾部退出码脚本输出丢失输出仅写入 Alert Server 日志检索日志中out put msg is关键字脚本访问文件 / 网络被拒绝执行租户权限不足核对脚本读写权限与执行租户关系见 2.3 节七、与告警插件体系的衔接Script 插件是 DolphinScheduler 告警插件架构 中的一员。插件工厂通过AutoService(AlertChannelFactory.class)注解见 ScriptAlertChannelFactory.java实现 SPI 自动注册插件名固定为Script。告警实例创建后其配置会被持久化并在每次触发时随AlertInfo传入process()方法。若要进一步了解如何在告警实例管理中选择插件、配置告警组与测试告警可参考 告警插件用户指南中文版见 告警插件用户指南。综上Script 插件通过参数注入 退出码约定这一极简协议为 DolphinScheduler 提供了对接任意自定义通知系统的能力。在实际使用中只需按本文给出的参数协议编写脚本、配置好路径与租户权限即可将告警能力无缝扩展到内部业务系统。赞分享任务调度大数据后端前端【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址https://gitcode.com/gh_mirrors/do/dolphinscheduler点击查看免费下载相关推荐Apache DolphinScheduler Script 脚本告警插件配置、执行原理与安全实践Apache DolphinScheduler Script 脚本告警插件配置、执行原理与安全实践 本文基于 Apache DolphinScheduler任务调度数据编排工作流自动化后端大数据Apache DolphinScheduler Script 告警插件基于 Shell 脚本的自定义告警通道配置与实现原理Apache DolphinScheduler Script 告警插件基于 Shell 脚本的自定义告警通道配置与实现原理 导读 当内置的邮件、钉钉、飞书等告任务调度大数据后端前端Apache DolphinScheduler Script 告警插件实战用 Shell 脚本接管告警通知Apache DolphinScheduler Script 告警插件实战用 Shell 脚本接管告警通知 Script 告警插件是 Apache Dolph任务调度数据编排工作流自动化后端大数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表