Rundeck 替代方案
Runbook 自动化,无需 JVM、SQL 数据库,也无需在 GUI 里编写作业。
Dagu 是面向运维团队的 Rundeck 替代方案,用一个小巧的二进制提供定时作业、按需执行的 runbook 和 Web UI。作业定义以 YAML 的形式放在 Git 里,而不是锁在控制台中;状态保存在文件里,而不是 MySQL 或 Postgres;现有服务器通过 SSH 或带标签的 worker 到达。这一页也会讲迁移路径,以及 Rundeck 仍然更强的地方。
# restart-app.yaml
params:
- name: host
default: app01.internal
ssh:
user: ops
host: ${params.host}
key: ~/.ssh/ops_key
steps:
- id: drain
run: /opt/app/bin/drain --wait
- id: restart
run: sudo systemctl restart app
depends: [drain]
- id: health_check
run: curl -fsS http://localhost:8080/healthz
retry_policy:
limit: 5
interval_sec: 10
depends: [restart]
handler_on:
failure:
run: ./scripts/notify-oncall.sh
Execution order
单一二进制,状态保存在文件里,无需 JVM 和 SQL 数据库
作业是受版本控制的 YAML,像其他变更一样接受评审
SSH 步骤和带标签的 worker 直达现有服务器
SSO、RBAC 和审计日志,按服务器的公开价格提供
At a glance
面向运维自动化的 Rundeck vs. Dagu
单一二进制,状态保存在文件里;队列和 worker 都是可选项。
Java 服务,生产环境还需要 MySQL 或 Postgres。
在 Git 中评审的声明式 YAML。
以 Web 控制台为主;YAML 导出和 SCM 同步是辅助路径。
SSH 步骤,或通过 mTLS gRPC 向外连接的带标签 worker。
从资源模型清单出发,通过 SSH 或 WinRM 向节点分发。
系统级角色;许可版提供 SSO 和审计日志。
按项目、按作业的细粒度 ACL 策略。
免费且服务器数量不限;付费计划按 Dagu 服务器计价,worker 不限。
开源内核;商业版 Process Automation 采用报价制。
调度器为单实例;高可用需要你自己设计部署。
商业版提供集群配置。
In depth
Where each tool fits
保留 runbook,去掉整套技术栈
Rundeck 以 Java 服务的形式运行,背后是一个 SQL 数据库,作业按项目在 Web 控制台里定义。Dagu 把同样的运维概念收进一个进程里,状态保存在文件中。
- 作业变成 DAG 文件,作业步骤变成步骤,错误处理器对应 handler_on.failure
- 作业选项对应 params:带类型和默认值的输入,运行时可从 UI、CLI 或 API 传入
- 没有需要做容量规划和备份的 MySQL 或 Postgres,也没有要调优的 JVM 堆;一台小 VM 就能跑起来
作业即代码,而非控制台点击
Rundeck 可以导出定义并通过 SCM 插件同步,但主要的编写入口仍是控制台。Dagu 把这层关系倒了过来:仓库里的 YAML 文件本身就是定义。
- 每个作业都是 Git 里的一个 YAML 文件,变更以可评审的 diff 到达,而不是控制台里的编辑
- dagu validate 在 CI 里检查生成的和手写的定义,赶在它们进入调度器之前
- Web UI 留给日常运维:带参数启动运行、查看日志、重试、暂停调度
不装代理也能到达现有服务器
Rundeck 从资源模型清单向节点分发命令。Dagu 用两种机制覆盖同样的场景:无代理主机走 SSH,更适合常驻执行器的地方用 worker。
- 用 SSH 执行器在现有的 Linux 和 UNIX 主机上运行步骤,无需常驻代理
- 在需要本地执行的机器上启动 dagu worker,并用 worker_selector 标签把步骤路由过去
- worker 通过 mTLS 保护的 gRPC 向外连接,分段网络无需开放入站端口
把执行作业的人和修改作业的人分开
经典的 Rundeck 部署方式,是把一部分安全的操作交给更大的群体。Dagu 的许可版自托管用角色、SSO 和审计日志覆盖这种分离。
- operator 角色可以启动和停止运行,但不能编辑定义;viewer 只读;developer 和 manager 可以修改工作流
- 通过 OIDC 用现有身份提供商登录,不必再维护第二套用户目录
- 审计日志记录管理操作和安全相关的活动,供事后审查
公开的价格,而不是一通销售电话
Rundeck 的商业版已经变成 PagerDuty Process Automation,价格采用报价制。Dagu 的社区版免费,服务器和 worker 数量不限;许可版按服务器计价,价格公开。
- 社区版包含完整的编排引擎、Web UI、cron 调度,以及 Docker、SSH 和 HTTP 执行器
- 许可版自托管每年 $500 起,包含 3 个服务器许可证,并增加 SSO、RBAC、审计日志、事故路由和邮件支持
- 所有计划的 worker 都不限数量,增加执行主机不会改变许可证数量
Rundeck 更强的地方
只罗列优势的对比在选型时没有用。以下是使用 Rundeck 的团队应该预期额外工作、或者干脆留在原地的地方。
- Rundeck 的节点清单更丰富:资源模型来源和节点过滤器能把一条命令分发到数百台主机。Dagu 的步骤只指向 SSH 主机或带标签的 worker,没有面向整个主机群的清单概念
- Rundeck 按项目、按作业的 ACL 策略可以只把一个参数化作业交给帮助台小组。Dagu 的角色作用于整个系统,不能按作业划分
- 商业版 Process Automation 提供面向高可用的集群配置,插件生态也更大,包括 WinRM 节点执行器和通知插件
FAQ
Practical questions before adopting Dagu
Dagu 可以直接替换 Rundeck 吗?
不能。概念上的对应很直接:作业变成 DAG 文件,作业步骤变成步骤,选项变成 params,错误处理器变成 handler_on.failure。但没有导入工具,Rundeck 的节点过滤模型也没有直接的对应物。迁移意味着把每个作业重写成一个 YAML 文件;对基于命令的作业来说,这是机械性的工作。
还能从 UI 带参数触发作业吗?
可以。params 声明带类型和默认值的输入,运行可以从 Web UI、CLI 或 API 启动,并在运行时传入值。Dagu 没有的是 Rundeck 那种只向某个小组开放单个作业的按作业 ACL;角色作用于整个系统。
Dagu 怎么在多台服务器上运行命令?
有两种方式。SSH 执行器在无代理主机上运行步骤;分布式模式在机器上启动 worker,由它们拉取与 worker_selector 标签匹配的步骤。Dagu 没有资源模型清单;面向大规模主机群的一次性分发要用并行步骤或包装脚本来表达。
Dagu 需要像 Rundeck 那样的数据库吗?
不需要。运行历史、日志和队列状态都是磁盘上的文件。这也是封闭网络部署简单的原因:一个二进制,没有 JVM,也没有需要连通的外部服务。
Rundeck 的调度和 webhook 用什么替代?
内置支持时区的 cron 调度;也可以通过 API 或 webhook 从外部触发运行,payload 可在工作流中引用。并发默认按工作流限制,共享上限使用命名队列。
Next step
Start with one workflow.
Install Dagu, move one fragile script or agent task into YAML, and decide from a real run history.