ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Apache DolphinScheduler SSH 数据源配置指南:为 RemoteShell 远程任务打通免代理执行通道

2026/9/15 7:23:50 拓冰建站 浏览量
Apache DolphinScheduler SSH 数据源配置指南:为 RemoteShell 远程任务打通免代理执行通道 Apache DolphinScheduler SSH 数据源配置指南为 RemoteShell 远程任务打通免代理执行通道【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinschedulerSSH 数据源是 Apache DolphinScheduler 中一类特殊的非关系型数据源专门服务于 RemoteShell远程 Shell任务组件让工作流能够在不部署任何 Agent、不经过 Worker 本地进程的情况下通过标准 SSH/SFTP 协议把脚本推送到远端主机并以nohup方式执行。本文以官方文档 SSH Data Source 为骨架结合仓库中dolphinscheduler-datasource-ssh与dolphinscheduler-task-remoteshell两个插件的真实源码完整讲解 SSH 数据源的字段含义、密码/公钥双认证机制、连接校验原理、插件激活方式以及 RemoteShell 任务消费该数据源的底层调用链读完即可在集群中创建并正确使用 SSH 数据源完成远程命令编排。SSH 数据源是什么为远程命令执行而生与 MySQL、PostgreSQL 等以 JDBC 建连的数据库数据源不同SSH 数据源在 DolphinScheduler 中承担的是远程主机连接凭据的角色。官方文档开宗明义地指出This data source is used for RemoteShell component to execute commands remotely.也就是说创建 SSH 数据源的目的只有一个——供RemoteShell远程 Shell任务使用让任务在执行时通过 SSH 连接一台远端主机把脚本上传并在其上运行。这一设计规避了传统 Shell 任务脚本必须在 Worker 所在节点本地执行的约束使工作流可以直接操作任意可达的服务器如生产环境的应用主机、堡垒机后方的内网机器等从而实现编排平台与执行目标解耦的远程执行能力。从代码结构上看SSH 数据源的能力边界非常清晰SSHDataSourceProcessor不提供 JDBC URL、驱动或java.sql.Connection其getJdbcUrl、getConnection均返回空/nullSSHDataSourceChannel对createPooledDataSourceClient与createAdHocDataSourceClient一律抛出UnsupportedOperationException见 SSHDataSourceProcessor.java、SSHDataSourceChannel.java。因此它不能像关系型数据源那样被 SQL 类任务消费它唯一的职责就是向 RemoteShell 任务提供 SSH 连接参数。创建 SSH 数据源字段逐项说明在 DolphinScheduler Web UI 中依次进入数据源中心 → 创建数据源在类型下拉框中选择SSH即可看到如下表单对应仓库文档 ssh.md 所列字段表单截图见 docs/img/new_ui/dev/datasource/ssh.png字段是否必填说明Data Source是数据源类型下拉框此处选择SSHData Source Name是数据源名称全局唯一标识便于在 RemoteShell 任务中引用Description否数据源描述说明用途或归属IP是目标 SSH 主机 IP 或域名文档中称为 IP HostnamePort是SSH 服务端口默认值为22User Name是登录 SSH 的用户名表单默认值rootPassword否SSH 密码用于密码认证Public Key否私钥内容PEM 格式用于公钥认证与 Password 二选一即可表单底部提供三个操作按钮Cancel取消、Test Connect测试连接、Confirm确认。其中Test Connect会实际发起一次 SSH 认证握手用于在保存前验证凭据是否正确。从后端参数模型可以印证上述字段的落库结构。SSHConnectionParam见 SSHConnectionParam.java定义了user、password、privateKey、host、port默认22五个连接属性SSHDataSourceParamDTO见 SSHDataSourceParamDTO.java在其基础上扩展了privateKey字段类型标识为DbType.SSH。SSHDataSourceProcessor.createConnectionParams负责把表单 DTO 转换为连接参数对象并完整映射用户名、密码、主机、端口与私钥。必填校验与唯一标识在保存数据源时SSHDataSourceProcessor.checkDatasourceParam会执行参数合法性校验源码见 SSHDataSourceProcessor.javaif (StringUtils.isEmpty(datasourceParamDTO.getHost()) || StringUtils.isEmpty(datasourceParamDTO.getUserName())) { throw new IllegalArgumentException(ssh datasource param is not valid); }也就是说IP 与 User Name 是硬性必填项缺失任一字段都会直接抛出IllegalArgumentException。而密码与公钥均允许为空——这对应了密码、公钥至少配置其一即可完成认证的设计下文详解。从源码看仅当两者都缺失时认证才会在连接阶段失败。此外每个 SSH 数据源会通过getDatasourceUniqueId生成形如ssh{host}{user}{加密后的密码}的唯一标识见 SSHDataSourceProcessor.java密码在存储前会经过PasswordUtils.encodePassword加密处理避免凭据以明文形式落库。双认证机制密码与公钥的底层实现SSH 数据源同时支持密码认证与公钥认证两种方式且可叠加配置。其底层基于 Apache MINA SSHD 客户端实现核心逻辑位于 SSHUtils.java 的getSession方法session client.connect(connectionParam.getUser(), connectionParam.getHost(), connectionParam.getPort()) .verify(5000).getSession(); // add password identity String password connectionParam.getPassword(); if (StringUtils.isNotEmpty(password)) { session.addPasswordIdentity(password); } // add private key identity String privateKey connectionParam.getPrivateKey(); if (StringUtils.isNotEmpty(privateKey)) { KeyPairResourceLoader loader SecurityUtils.getKeyPairResourceParser(); CollectionKeyPair keyPairCollection loader.loadKeyPairs(null, null, null, privateKey); for (KeyPair keyPair : keyPairCollection) { session.addPublicKeyIdentity(keyPair); } } session.setSessionHeartbeat(SessionHeartbeatController.HeartbeatType.IGNORE, Duration.ofSeconds(3));关键细节如下连接建立调用client.connect(user, host, port)并以5 秒为超时执行verify随后getSession获取客户端会话密码身份只要password非空就通过addPasswordIdentity注册密码身份公钥身份只要privateKey非空就会调用SecurityUtils.getKeyPairResourceParser()解析 PEM 私钥解析出的每个KeyPair都会通过addPublicKeyIdentity注册为公钥身份解析失败会抛出Failed to add public key identity会话保活设置每3 秒一次的IGNORE类型会话心跳防止长任务执行期间连接被服务端或中间设备空闲断开。同样的逻辑在SshClientWrapper见 SshClientWrapper.java中也有对应实现构造时校验ip、port、userName非空随后按先密码、后公钥的顺序注册认证身份并在isAuth()中以10 秒超时执行clientSession.auth().verify(...)判断认证是否成功。实践建议由于两种身份可以同时注册即使同时填写了密码与公钥只要任一种能被远端主机接受即可完成认证。生产环境建议优先使用公钥认证禁用密码登录并把私钥粘贴在 Public Key 输入框中。连接测试Test Connect的实现原理Web UI 上的Test Connect按钮在服务端对应SSHDataSourceProcessor.checkDataSourceConnectivity见 SSHDataSourceProcessor.javatry ( SshClientWrapper sshClientWrapper new SshClientWrapper( baseConnectionParam.getHost(), baseConnectionParam.getPort(), baseConnectionParam.getUser(), baseConnectionParam.getPassword(), baseConnectionParam.getPrivateKey())) { return sshClientWrapper.isAuth(); } catch (Exception e) { log.error(ssh test connection failed, e); return false; }测试流程可概括为用数据源的 host/port/user/password/privateKey 构造SshClientWrappercreateSession中创建默认SshClient客户端并启动以 10 秒超时发起 TCP 连接获取会话注册密码/公钥身份后isAuth()执行实际认证握手并返回是否成功使用try-with-resources确保ClientSession与SshClient被正确关闭不泄漏连接资源。因此Test Connect并不是简单地测试网络可达性而是完整走一遍 SSH 认证流程能够真实反映能否用当前凭据登录远端主机。激活插件SSH 数据源并非开箱即用官方文档在 Native Supported 一节明确说明SSH 数据源不在默认发行版的原生支持范围内需要按伪集群部署文档中 Download Plugins Dependencies 一节的说明手动激活。原因在于从 3.3.0 版本起DolphinScheduler 的二进制发行包不再内置各类插件依赖需要用户按需下载。激活步骤参考 伪集群部署文档执行官方提供的插件安装脚本下载全部插件依赖bash ./bin/install-plugins.sh 3.3.0若只需要部分插件可编辑conf/plugins_config只保留所需项。该配置文件按--alert-plugins--、--datasource-plugins--、--storage-plugins--、--task-plugins--分段声明插件见仓库 config/plugins_config。其中与 SSH 远程执行相关的两行分别是--datasource-plugins-- dolphinscheduler-datasource-ssh以及--task-plugins-- dolphinscheduler-task-remoteshellinstall-plugins.sh见 script/install-plugins.sh会读取conf/plugins_config对每一行插件 artifactId 执行mvnw dependency:get -DgroupIdorg.apache.dolphinscheduler -DartifactId${line} -Dversion${version} -Dclassifiershade将带shade分类器的插件包下载到plugins/目录脚本支持传入自定义版本号默认dev-SNAPSHOT。排错提示如果未安装插件依赖便启动服务使用 SSH 数据源或 RemoteShell 任务时会报ClassNotFoundException。官方文档特别提醒插件依赖包通常不随二进制包分发遇到该异常应回到对应插件类型的文档检查依赖是否缺失。RemoteShell 任务如何消费 SSH 数据源SSH 数据源的最终落脚点是 RemoteShell 任务。以 RemoteShellTask.java 与 RemoteExecutor.java 的源码为依据任务执行链路如下1. 任务初始化initRemoteShellTask.init解析任务参数为RemoteShellParameters含rawScript原始脚本、type数据源类型、datasource数据源 ID 三个字段见 RemoteShellParameters.java并校验rawScript非空。2. 按数据源 ID 取连接参数initRemoteExecutor任务根据配置的数据源 ID从ResourceParametersHelper中取出数据源参数再通过DataSourceUtils.buildConnectionParams(DbType.valueOf(type), dbSource.getConnectionParams())还原为SSHConnectionParam据此构造RemoteExecutor。这正是 SSH 数据源被 RemoteShell 任务引用的方式——数据源 ID 在任务配置中被关联运行时取出其连接凭据建立 SSH 会话。3. 生成脚本buildCommand任务把rawScript中的\r\n统一替换为\n完成参数占位符替换ParameterUtils.convertParameterPlaceholders若配置了环境变量则前置拼入最后加上#!/bin/bash头与echo DOLPHINSCHEDULER-REMOTE-SHELL-TASK-STATUS-$?状态输出指令写入本地执行目录下的.sh文件。4. 远端执行RemoteExecutor.run通过getTaskPid检查远端是否已有同名任务在跑ps -ef | grep taskId.sh避免重复提交使用SFTPSftpClientFactory.instance().createSftpFileSystem把本地脚本上传到远端/tmp/dolphinscheduler-remote-shell-user/taskId.sh以nohup /bin/bash script script.log 21 方式在远端后台启动任务见COMMAND.RUN_COMMAND以5 秒为周期执行tail -n N taskId.log增量拉取远端日志实时输出到任务日志并解析输出参数结束后读取日志末行的状态标记DOLPHINSCHEDULER-REMOTE-SHELL-TASK-STATUS-exitCode得到退出码并执行清理命令删除远端的.sh与.log临时文件。5. 取消与进程树清理kill任务取消时RemoteExecutor.kill先查询任务 PID再通过pstree -p pid获取整棵进程树并解析出所有子进程 PID最后以kill -9一次性终止。这意味着RemoteShell 任务具备级联杀进程能力可以清理远端脚本派生的所有子进程而非只杀主进程。相应地远端主机需要预装pstree工具macOS 为pstreeFedora/RedHat/CentOS/Ubuntu/Debian 系为psmisc包官方文档在伪集群部署前置检查中有明确说明。常见问题与最佳实践小结SSH 数据源不是 JDBC 数据源它没有连接池、驱动与 SQL 执行能力只能被 RemoteShell 任务消费不要在 SQL、DataX 等任务中尝试使用必填项IP 与 User Name 必须填写否则保存时报ssh datasource param is not validPort 默认22认证方式密码与公钥可单独或同时配置公钥需粘贴 PEM 格式私钥内容建议生产环境优先公钥认证插件激活3.3.0 起二进制包不再内置插件需通过install-plugins.sh结合conf/plugins_config下载dolphinscheduler-datasource-ssh与dolphinscheduler-task-remoteshell远端环境要求目标主机需允许 SSH 登录并具备bash、pstree等基础工具任务脚本与日志存放于/tmp/dolphinscheduler-remote-shell-user/目录验证手段创建数据源时使用Test Connect按钮它会真实执行一次 SSH 认证握手10 秒超时比单纯 ping 更可靠。通过上述配置与原理你可以让 DolphinScheduler 工作流以纯 SSH 方式驱动任意远端主机执行脚本实现一处编排、处处执行的远程命令编排能力。【免费下载链接】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),仅供参考