深色模式
低代码/脚本平台:内部工具化
摘要:不是所有人都愿意 SSH 敲命令。把高频操作包装成「点一下就能跑」的自助页面,既降低门槛又保留审计。本文用 Jenkins 参数化任务与 Rundeck 两条路线演示,并讲清权限与收敛原则。
适用环境
- 一台 Linux 服务器(2C4G 起)
- 已有可复用的运维脚本
- 需要给非运维同事(开发、测试、值班)提供自助能力
操作步骤
1. 什么时候值得做
值得:同一操作每周被请求 3 次以上、要给无服务器权限的人用、要求留操作审计。不值得:只有你一个人用、一年用两次。
bash
grep -oiE '(重启|清缓存|扩容|查日志|重置密码)' requests.log | sort | uniq -c | sort -rn | head1
2. 路线一:Jenkins 参数化任务(零新增组件)
添加参数:Choice ACTION(restart/clear_cache/rollout)、String TARGET、Boolean CONFIRM。
bash
set -euo pipefail
[[ "${CONFIRM}" == "true" ]] || { echo "请勾选确认"; exit 1; }
case "${ACTION}" in
restart) ssh ops@"${TARGET}" 'sudo systemctl restart nginx' ;;
clear_cache) ssh ops@"${TARGET}" 'sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' ;;
rollout) kubectl rollout restart deploy/"${TARGET}" ;;
*) echo "unknown action"; exit 1 ;;
esac1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 路线二:Rundeck
bash
docker run -d --name rundeck -p 4440:4440 -e RUNDECK_GRAILS_URL=http://localhost:4440 rundeck/rundeck
docker logs -f rundeck1
2
2
登录 http://localhost:4440(默认 admin/admin),创建 Job:Add a step → Command 填 sudo systemctl restart nginx;Node Filter 填目标主机标签;Add an Option 增加 target 并用正则约束 ^web[0-9]{2}$;Access Control 配 ACL 只允许特定组执行。
核心价值:谁、何时、传了什么参数、输出了什么,全部留痕可查。
4. 权限设计三原则
只暴露必要参数,不允许自由输入命令;可选主机用正则/枚举约束;高危操作(删数据、重启数据库)需二次确认或审批。
text
^web[0-9]{2}$ 只允许 web00-web99
^(dev|staging)$ 只允许非生产环境1
2
2
危险
任何允许自由输入命令的平台入口都是巨大的安全缺口,等同于把服务器 root 权限开放出去。参数必须白名单化,脚本必须版本化评审。
验证
- [ ] 无 SSH 权限的同事能通过页面完成重启操作
- [ ] 输入非法参数(如
web01; rm -rf /)被正则拒绝 - [ ] 执行历史能查到操作人、时间、参数与完整输出
常见坑
参数拼接导致命令注入
"systemctl restart $SERVICE" 若未校验,用户传 nginx; rm -rf / 就能注入。必须白名单枚举或严格正则。
平台账号没有审计
所有人共用一个 admin 账号,出问题无法定位到人。必须一人一号。
按钮越加越多最后没人敢点
每个 Job 标注负责人与最后验证时间,失效的及时下线。