ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache DolphinScheduler Script 脚本告警插件:配置、执行原理与安全实践

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/GitHub_Trending/dol/dolphinscheduler本文基于 Apache DolphinScheduler 仓库中 Script 告警官方文档 展开全面讲解 Script 告警插件的核心定位在告警实例管理中选择Script插件将告警标题与内容以命令行参数形式传入 Shell 脚本执行从而将告警转发到任意自定义通道。读完本文你将掌握 Script 告警实例的完整配置方法、脚本入参与退出码约定、底层执行链路以及规避命令注入与权限问题的安全实践。Script 告警插件的适用场景DolphinScheduler 内置了大量开箱即用的告警插件邮件、钉钉、飞书、企业微信、Webhook 等但真实生产环境中的告警目的地往往五花八门可能是自研的内部监控平台、遗留的短信网关也可能是多个系统共用的统一消息总线。与其等待官方新增插件不如直接用 Shell 脚本对接任何外部系统。Script 插件正是为此设计的扩展点它把「告警如何送达」这件事完全交给用户自己编写的.sh脚本DolphinScheduler 只负责在触发告警时把标题-t、内容-c和自定义参数-p作为命令行参数传给脚本并根据脚本的退出码判断本次告警是否成功。因此它也常用于对接企业内部自研告警平台或统一告警网关复用已有的告警发送脚本实现低成本接入将告警写入日志、文件或执行自定义处置动作。从源码结构看该插件位于 dolphinscheduler-alert-plugins/dolphinscheduler-alert-script通过AutoService(AlertChannelFactory.class)注册为告警渠道与其它告警插件完全平级无需修改主程序即可随插件目录一起加载。创建 Script 告警实例使用前需在安全中心 → 告警实例管理中新建告警实例告警插件类型选择Script。新建完成后在工作流定义中对需要通知的任务节点配置该告警实例即可触发。插件界面由三个配置项组成其参数键名定义在 ScriptParamsConstants.java 中与界面字段一一对应配置项参数键是否必填说明自定义参数userParams否用户自定义参数将作为-p参数传入脚本执行脚本路径path是脚本在服务器上的文件位置只支持.sh后缀的文件脚本类型type是目前仅支持Shell脚本三个配置项在 ScriptAlertChannelFactory.java 中通过 SPI 参数框架构建scriptPath与scriptType被标记为Required(true)必填校验scriptUserParam为非必填scriptType使用单选组件默认选中SHELL选项。各配置项细节自定义参数userParams这里的「用户自定义参数」不是指工作流中的参数占位符而是用户在告警实例里手工填写的、希望在脚本执行时一并带入的任意字符串。例如可以在脚本中根据该参数区分告警来源或切换通知路由。参数为空字符串时也能正常执行测试用例testUserParamsNPE验证了该场景说明它并非必填项。脚本路径path脚本必须存放在告警服务所在服务器上即执行告警的 Alert Server 节点路径支持绝对路径或相对路径。插件会严格要求文件以.sh结尾否则直接判定告警失败提示shell script is invalid, only support .sh file。脚本类型type目前插件仅实现了Shell一种类型对应 ScriptType.java 枚举中的SHELL(0, SHELL)。从 ScriptSender.java 的分支注释「If it is another type of alarm script can be added here, such as python」可以看出该设计预留了扩展其它脚本类型的空间但当前版本仅支持 Shell。脚本入参约定与最小示例ScriptSender 最终以如下命令形式调用脚本/bin/sh -c 脚本路径 -t 告警标题 -c 告警内容 -p 自定义参数即脚本会被依次传入三个参数-t告警标题对应AlertData.getTitle()-c告警内容对应AlertData.getContent()-p自定义参数告警实例中配置的userParams。-t、-c、-p这三个选项常量定义在 ScriptSender.java。仓库自带的测试脚本 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 # 在这里编写你自己的具体发送逻辑例如调用 curl 请求内部告警平台 # 根据执行结果设置退出码DolphinScheduler 以此判断本次告警是否成功 exit 0退出码语义决定告警结果的关键插件以脚本的退出码作为本次告警成功与否的唯一依据退出码为0告警发送成功AlertResult 消息为send script alert msg success退出码非0告警发送失败消息为send script alert msg error,exitCode is 退出码。这在测试脚本中体现得十分直观当标题等于error msg title时脚本主动exit 12对应 ScriptSenderTest.java 中两次调用的断言正常标题返回成功、特殊标题返回失败。因此编写脚本时务必在发送逻辑结束后显式设置退出码——例如内部平台返回 2xx 时exit 0超时或 5xx 时exit 1让告警状态真实反映发送结果。底层执行链路与日志输出一次 Script 告警的完整调用链如下告警触发 → ScriptAlertChannel.process(AlertInfo) // 入口取出 AlertData 与告警参数 → ScriptSender.sendScriptAlert(title, content) // 分发校验类型后进入 Shell 分支 → ProcessUtils.executeScript(cmd) // 构建 /bin/sh -c 命令并启动进程 → StreamGobbler标准输出/错误输出两个线程 // 异步消费子进程输出并写入日志 → process.waitFor() 获取退出码 // 依据退出码生成 AlertResult各环节对应的源码与职责ScriptAlertChannel.java实现AlertChannel接口校验告警参数非空后构造ScriptSender传入AlertData中的标题与内容ScriptSender.java负责全部前置校验并拼装命令行ProcessUtils.java通过ProcessBuilder启动子进程等待其结束并返回退出码IOException/InterruptedException时返回-1StreamGobbler.java分别启动线程消费脚本的标准输出与标准错误流防止子进程输出写满管道造成阻塞同时将脚本的打印内容写入告警服务日志log.info方便排查脚本内部逻辑。执行前置校验清单在执行脚本前ScriptSender 会按顺序完成以下检查任一项不通过即返回失败结果不会启动子进程操作系统检查OSUtils.isWindows()为真时直接拒绝提示shell script not support windows os——Shell 告警仅在 Linux/Unix 类环境生效后缀检查路径必须以.sh结尾存在性检查new File(scriptPath).exists()不存在则报shell script not exist类型检查路径对应的是一个常规文件isFile()而非目录等特殊类型命令注入防护userParams、title、content三者中任何一处包含单引号都会被拒绝详见下文安全实践。安全实践与风险提示官方文档明确给出了两条使用 Script 告警必须重视的注意点这里结合源码进一步展开1. 注意脚本的读写权限与执行租户的关系脚本在 Alert Server 节点上执行运行身份与告警服务进程一致。因此需要保证脚本对运行用户具有可读权限插件通过FileAPI 校验存在性但能否读取取决于系统权限位脚本依赖的日志目录、临时文件、外部命令路径等都应在该用户权限范围内可写、可执行若脚本内部需要sudo、访问受保护目录或凭据文件需提前通过系统层面授权避免权限不足导致发送失败。2. 脚本内容不经过任何校验务必高度信任文档原话强调「平台不会校验脚本内容和是否被篡改需要高度信任该 shell 脚本并且信任用户不会滥用此功能」。也就是说DolphinScheduler 只校验路径后缀、文件存在性和单引号字符不审查脚本内部逻辑拥有告警实例管理权限的用户事实上就拥有了在 Alert Server 上以服务用户身份执行任意命令的能力因此应严格限制告警实例的新建与编辑权限只授予可信管理员并配合审计日志监控脚本路径的变更建议对脚本目录实施只读保护例如归属 root 且仅 root 可写降低脚本被篡改后被植入恶意命令的风险。命令注入防护的实现细节由于脚本是通过/bin/sh -c拼接字符串执行的若直接把原始参数嵌入命令就可能出现命令注入。为此 ScriptSender.java 在拼接前对userParams、title、content做了单引号拦截if (userParams.contains()) { ... return 失败结果; } if (title.contains()) { ... return 失败结果; } if (content.contains()) { ... return 失败结果; }理由是命令行使用参数形式包裹各值一旦参数内出现单引号即可闭合引号并注入新命令。仓库测试 testScriptSenderInjectionTest 正是用 ; calc.exe ; 这类注入载荷验证拦截生效断言发送失败。请避免在告警标题、内容或自定义参数中使用单引号字符否则会导致告警失败。与其他告警插件的协作与定位Script 插件是 DolphinScheduler 告警插件体系的一员与其并列的还有邮件、钉钉、飞书、企业微信、WebhookHTTP等插件它们位于同一目录结构 dolphinscheduler-alert-plugins 下统一实现AlertChannelFactory/AlertChannel接口。它们之间不存在互斥关系同一任务节点可以配置多个告警实例例如「关键任务失败」同时发邮件给负责人、再通过 Script 脚本调用内部工单系统创建工单。Script 插件适合作为兜底扩展通道将告警流转到任何官方插件未覆盖的目标系统。常见问题排查现象可能原因与排查方向告警提示shell script is invalid, only support .sh file脚本路径未以.sh结尾检查告警实例中的脚本路径告警提示shell script not exist脚本未部署在 Alert Server 对应路径或路径写错告警提示shell script illegal title/content/user params标题、内容或自定义参数中含单引号被注入防护拦截告警提示shell script not support windows osAlert Server 运行在 Windows 上Shell 告警仅支持 Linux/Unix 环境脚本未执行或权限报错检查脚本文件读取权限、执行用户、以及脚本内部依赖的目录权限脚本执行了但告警状态为失败exitCode 非 0查看 Alert Server 日志中脚本经 StreamGobbler 打印的输出确认脚本退出码设置是否符合预期以上结论均可在对应源码与测试用例中得到验证插件行为由 ScriptSender.java 及其测试 ScriptSenderTest.java、ScriptAlertChannelFactoryTest.java 共同保证。将上述参数约定、退出码语义与安全边界牢记于心即可稳定地把 DolphinScheduler 的告警扩展到任意自定义渠道。【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表