搬瓦工 VPS 搭建 Rundeck 作业调度系统教程
Rundeck 是一款开源的作业调度和运维自动化平台,提供 Web 界面来定义、调度和执行跨节点的运维任务。与简单的 crontab 相比,Rundeck 提供了可视化管理、执行历史、权限控制和 Webhook 触发等企业级功能。本教程将介绍如何在搬瓦工 VPS 上使用 Docker 部署 Rundeck 作业调度系统。部署前请确保已安装好 Docker 和 Docker Compose。
一、Rundeck 核心功能
- 作业定义:通过 Web 界面或 YAML 定义多步骤作业,支持命令、脚本和插件步骤。
- 节点管理:集中管理多台服务器节点,支持 SSH 和 WinRM 连接协议。
- 调度引擎:内置 Cron 调度器,支持复杂的定时执行策略。
- ACL 权限控制:基于策略的细粒度权限管理,支持多用户多角色。
- Webhook 触发:通过 HTTP API 或 Webhook 远程触发作业执行。
- 执行历史与审计:完整记录每次执行的输入输出、耗时和结果状态。
二、Docker Compose 部署
mkdir -p /opt/rundeck && cd /opt/rundeck
cat > docker-compose.yml <<'EOF'
version: '3.8'
services:
rundeck:
image: rundeck/rundeck:5.1.0
container_name: rundeck
restart: always
environment:
RUNDECK_GRAILS_URL: https://ops.example.com
RUNDECK_DATABASE_DRIVER: org.postgresql.Driver
RUNDECK_DATABASE_URL: jdbc:postgresql://postgres/rundeck
RUNDECK_DATABASE_USERNAME: rundeck
RUNDECK_DATABASE_PASSWORD: rundeck_db_2026
volumes:
- rundeck_data:/home/rundeck/server/data
- rundeck_logs:/home/rundeck/var/logs
- /root/.ssh:/home/rundeck/.ssh:ro
ports:
- "127.0.0.1:4440:4440"
depends_on:
- postgres
postgres:
image: postgres:15-alpine
container_name: rundeck-db
restart: always
environment:
POSTGRES_DB: rundeck
POSTGRES_USER: rundeck
POSTGRES_PASSWORD: rundeck_db_2026
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
rundeck_data:
rundeck_logs:
pgdata:
EOF
docker compose up -d
三、初始配置
# 通过 SSH 隧道访问
ssh -L 4440:127.0.0.1:4440 root@your-server-ip
# 默认登录: admin / admin(首次登录后务必修改密码)
四、添加远程节点
cat > /opt/rundeck/nodes.yaml <<'EOF'
web-server-1:
hostname: 192.168.1.10
username: root
ssh-key-storage-path: keys/deploy-key
tags: web,production
osFamily: unix
db-server:
hostname: 192.168.1.20
username: root
ssh-key-storage-path: keys/deploy-key
tags: database,production
osFamily: unix
EOF
在 Web 界面的项目设置中导入节点资源文件,或配置为 File 类型的节点源指向此 YAML 文件。
五、定义作业
# 通过 YAML 导入作业定义
cat > /opt/rundeck/deploy-job.yaml <<'EOF'
- description: 部署 Web 应用到生产服务器
executionEnabled: true
name: Deploy Web App
nodeFilterEditable: true
nodefilters:
filter: tags:web
schedule:
month: '*'
dayofmonth: '*'
hour: '2'
minute: '0'
sequence:
commands:
- description: 拉取最新代码
exec: cd /opt/app && git pull origin main
- description: 安装依赖
exec: cd /opt/app && npm install --production
- description: 重启服务
exec: systemctl restart app
- description: 健康检查
exec: curl -sf http://localhost:3000/health || exit 1
keepgoing: false
strategy: node-first
EOF
六、API 和 Webhook 触发
# 获取 API Token(在 Web 界面 > 用户设置 > API Tokens 生成)
# 通过 API 触发作业
curl -X POST "http://localhost:4440/api/41/job/JOB_UUID/run" \
-H "X-Rundeck-Auth-Token: your_api_token_2026" \
-H "Content-Type: application/json" \
-d '{"options": {"env": "production"}}'
# 查看执行状态
curl -s "http://localhost:4440/api/41/execution/EXEC_ID" \
-H "X-Rundeck-Auth-Token: your_api_token_2026" | python3 -m json.tool
# 查看执行日志
curl -s "http://localhost:4440/api/41/execution/EXEC_ID/output" \
-H "X-Rundeck-Auth-Token: your_api_token_2026" \
-H "Accept: text/plain"
七、Nginx 反向代理
cat > /etc/nginx/conf.d/rundeck.conf <<'EOF'
server {
listen 443 ssl http2;
server_name ops.example.com;
ssl_certificate /etc/letsencrypt/live/ops.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ops.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:4440;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
nginx -t && systemctl reload nginx
八、ACL 权限管理
# 创建限制用户只能运行特定作业的 ACL 策略
cat > /opt/rundeck/deploy-acl.yaml <<'EOF'
description: Deploy team permissions
context:
project: MyProject
for:
job:
- match:
name: 'Deploy.*'
allow: [run, read]
node:
- allow: [read, run]
by:
group: deployers
EOF
九、常见问题
节点 SSH 连接失败
确保密钥已上传到 Rundeck Key Storage,且目标节点允许密钥认证登录。在容器内测试:
docker exec -it rundeck ssh -i /home/rundeck/.ssh/id_ed25519 root@target-host
作业超时
在作业定义的高级设置中配置 timeout 参数,或在全局配置中调整默认超时时间。
总结
Rundeck 是功能丰富的作业调度平台,适合跨节点运维自动化和合规审计需求。如果主要使用 Ansible,Semaphore 是更专注的选择;需要 CI/CD,推荐 Woodpecker CI。选购搬瓦工 VPS 请参考 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,购买链接:bwh81.net。