Rundeck 替代方案

Runbook 自动化,无需 JVM、SQL 数据库,也无需在 GUI 里编写作业。

Dagu 是面向运维团队的 Rundeck 替代方案,用一个小巧的二进制提供定时作业、按需执行的 runbook 和 Web UI。作业定义以 YAML 的形式放在 Git 里,而不是锁在控制台中;状态保存在文件里,而不是 MySQL 或 Postgres;现有服务器通过 SSH 或带标签的 worker 到达。这一页也会讲迁移路径,以及 Rundeck 仍然更强的地方。

一个 YAML 文件里的 runbook
# 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

drainsshrestartsshhealth_check5 retries

单一二进制,状态保存在文件里,无需 JVM 和 SQL 数据库

作业是受版本控制的 YAML,像其他变更一样接受评审

SSH 步骤和带标签的 worker 直达现有服务器

SSO、RBAC 和审计日志,按服务器的公开价格提供

At a glance

面向运维自动化的 Rundeck vs. Dagu

运行时
Dagu

单一二进制,状态保存在文件里;队列和 worker 都是可选项。

Rundeck

Java 服务,生产环境还需要 MySQL 或 Postgres。

编写方式
Dagu

在 Git 中评审的声明式 YAML。

Rundeck

以 Web 控制台为主;YAML 导出和 SCM 同步是辅助路径。

远程执行
Dagu

SSH 步骤,或通过 mTLS gRPC 向外连接的带标签 worker。

Rundeck

从资源模型清单出发,通过 SSH 或 WinRM 向节点分发。

权限委派
Dagu

系统级角色;许可版提供 SSO 和审计日志。

Rundeck

按项目、按作业的细粒度 ACL 策略。

许可
Dagu

免费且服务器数量不限;付费计划按 Dagu 服务器计价,worker 不限。

Rundeck

开源内核;商业版 Process Automation 采用报价制。

可用性
Dagu

调度器为单实例;高可用需要你自己设计部署。

Rundeck

商业版提供集群配置。

In depth

Where each tool fits

01

保留 runbook,去掉整套技术栈

Rundeck 以 Java 服务的形式运行,背后是一个 SQL 数据库,作业按项目在 Web 控制台里定义。Dagu 把同样的运维概念收进一个进程里,状态保存在文件中。

  • 作业变成 DAG 文件,作业步骤变成步骤,错误处理器对应 handler_on.failure
  • 作业选项对应 params:带类型和默认值的输入,运行时可从 UI、CLI 或 API 传入
  • 没有需要做容量规划和备份的 MySQL 或 Postgres,也没有要调优的 JVM 堆;一台小 VM 就能跑起来
02

作业即代码,而非控制台点击

Rundeck 可以导出定义并通过 SCM 插件同步,但主要的编写入口仍是控制台。Dagu 把这层关系倒了过来:仓库里的 YAML 文件本身就是定义。

  • 每个作业都是 Git 里的一个 YAML 文件,变更以可评审的 diff 到达,而不是控制台里的编辑
  • dagu validate 在 CI 里检查生成的和手写的定义,赶在它们进入调度器之前
  • Web UI 留给日常运维:带参数启动运行、查看日志、重试、暂停调度
03

不装代理也能到达现有服务器

Rundeck 从资源模型清单向节点分发命令。Dagu 用两种机制覆盖同样的场景:无代理主机走 SSH,更适合常驻执行器的地方用 worker。

  • 用 SSH 执行器在现有的 Linux 和 UNIX 主机上运行步骤,无需常驻代理
  • 在需要本地执行的机器上启动 dagu worker,并用 worker_selector 标签把步骤路由过去
  • worker 通过 mTLS 保护的 gRPC 向外连接,分段网络无需开放入站端口
04

把执行作业的人和修改作业的人分开

经典的 Rundeck 部署方式,是把一部分安全的操作交给更大的群体。Dagu 的许可版自托管用角色、SSO 和审计日志覆盖这种分离。

  • operator 角色可以启动和停止运行,但不能编辑定义;viewer 只读;developer 和 manager 可以修改工作流
  • 通过 OIDC 用现有身份提供商登录,不必再维护第二套用户目录
  • 审计日志记录管理操作和安全相关的活动,供事后审查
05

公开的价格,而不是一通销售电话

Rundeck 的商业版已经变成 PagerDuty Process Automation,价格采用报价制。Dagu 的社区版免费,服务器和 worker 数量不限;许可版按服务器计价,价格公开。

  • 社区版包含完整的编排引擎、Web UI、cron 调度,以及 Docker、SSH 和 HTTP 执行器
  • 许可版自托管每年 $500 起,包含 3 个服务器许可证,并增加 SSO、RBAC、审计日志、事故路由和邮件支持
  • 所有计划的 worker 都不限数量,增加执行主机不会改变许可证数量
06

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.