交流讨论💬
异构执行引擎概览
在分布式运维场景中,单一脚本语言无法胜任全部需求:日常排障偏爱轻量灵活的 Shell,数据清洗与复杂调用依赖丰富的 Python 生态,跨主机批量配置离不开具备幂等性的 Ansible,而高频核心业务则需要纯 Go 编译的常驻 私有服务 (Custom SDK)。
ETask 通过 统一上下文契约 与 可插拔处理器驱动矩阵,将异构语言的执行机制收敛为标准化中枢,在保障安全隔离的前提下实现引擎的开箱即用与灵活扩展。
- 执行端核心抽象:
internal/grpc/scripts/engine(工作区与沙箱调度编排) - 语言驱动适配器:
internal/grpc/scripts/language(Shell、Python、Ansible 驱动) - 开放扩展 SDK:
sdk/executor(面向私有任务的执行器契约与节点基座)
1. 架构体系全景
执行引擎中枢主要由统一契约流转、异构驱动插件矩阵与底层四大运行时沙箱支柱构成:

- 统一契约输入与制品物化:屏蔽底层通信差异,将任务载荷映射为标准的
executor.Context;同时按需自对象存储拉取项目源码与系统/租户依赖包(Artifact),在执行前完成本地只读物化与环境装配; - 异构驱动插件矩阵:支持 单文件运行 与 项目级运行 双形态,各驱动独立自治、按需路由:
- 单文件运行:针对即席脚本或单文件任务,直接在工作区就地生成独立脚本文件启动,轻巧敏捷,零解压与项目依赖开销;
- 项目级运行:针对包含多目录、配置文件或剧本清单的完整项目,以项目根目录为上下文拉取并启动指定入口;
- 底层四大沙箱支柱:从 Linux 操作系统底层构筑安全防线,保障凭据不泄露、资源不残留、进程不失控。
2. 异构执行引擎矩阵
ETask 将不同工具与语言的执行细节完全解耦。各引擎在输入输出上遵循统一规范,同时保持各自语言的原生特质:
| 引擎驱动 | 支持运行形态 | 适用场景 | 详细指南 |
|---|---|---|---|
| Shell | 单文件运行 项目级运行 | 基础配置、即席命令、Docker 容器操作、系统指标采集 | Shell 驱动指南 |
| Python | 单文件运行 项目级运行 | 复杂数据清洗、多步骤 API 编排、脚本自动化与数据分析 | Python 驱动指南 |
| Ansible | 仅支持项目级运行 | 批量主机运维、中间件集群搭建、基础设施标准化配置 | Ansible 驱动指南 |
| 自定义 SDK | 运行形态自行控制 | Terraform 编排、SQL 批量变更、企业私有运维系统接入 | 自定义 SDK 指南 |
3. 底层四大运行时沙箱支柱
无论是哪个语言引擎驱动,在底层均严格受到四大操作系统级运行时基石的约束与保护:
支柱一:独占生命周期工作区 (ETASK_WORKSPACE_ROOT)
每次执行分配唯一的独立临时目录。内联代码物化、临时参数生成以及脚本输出文件均限制在该工作区内;任务执行结束后,底层 Archiver 自动触发物理清理,宿主机始终保持无状态。
支柱二:0600 凭据物理沙箱
针对数据库密码、密钥等敏感凭据,彻底杜绝命令行参数传参(防止同机恶意进程通过 ps aux 偷窥),全面落盘至权限严格锁定为 0600(仅当前执行用户可读写)的受控文件:
ETASK_ARGS_FILE:任务入参 JSON 文件;ETASK_VARIABLES_FILE:Runner 变量 JSON 文件;ETASK_SHELL_ENV_FILE:经清洗后供 Shell 安全source的环境变量文件。
支柱三:Setpgid 进程组级联强杀
配置系统调用属性 SysProcAttr: &syscall.SysProcAttr{Setpgid: true},为子进程开启独立的 POSIX 进程组。任务超时或收到取消信号时,底层执行器直接调用:
go
syscall.Kill(-command.Process.Pid, syscall.SIGKILL)向**负 PID(代表整个进程组)**精准广播强杀信号,瞬间级联清理全部派生子孙进程,彻底杜绝孤儿僵尸进程。
支柱四:FD 3 结构化结果独立管道
底层为子进程额外开启文件描述符 3(EWORK_RESULT_FD = 3):
- 脚本通过调用
want_result key value或直接写入>&3回传结构化结果; - 结果数据流直通内核管道并落盘,与标准输出(
stdout/stderr)的文本日志彻底物理隔离,解决普通系统中文本日志与 JSON 混杂导致解析崩溃的顽疾。
4. 深入专题指引
针对各执行引擎的具体脚本规范、依赖安装与完整开发示例,请查阅对应指南: