上周接到一个需求:所有服务器的时区从 UTC 改成 Asia/Shanghai。一共 14 台。
如果是以前,我大概会开 14 个终端窗口(或者写个循环 ssh),挨个执行 timedatectl set-timezone Asia/Shanghai。但这次我换了个做法,用了一个开源运维工具,直接在网页上选中所有主机,贴上命令,一次执行完。
聊聊我从"手动挨个 SSH"到"网页上批量执行"的过程。
手动方式的问题
先说清楚,对于"在多台服务器上执行同一条命令"这件事,技术上有很多方案:
方案一:手动逐台 SSH
bash
ssh root@10.0.1.1 "timedatectl set-timezone Asia/Shanghai"
ssh root@10.0.1.2 "timedatectl set-timezone Asia/Shanghai"
# ... 14 台
14 台还能忍,50 台就崩了。而且手动操作容易漏、容易错。
方案二:for 循环 + SSH
bash
for ip in 10.0.1.{1..14}; do
ssh root@$ip "timedatectl set-timezone Asia/Shanghai"
done
好一点,但前提是你得维护一份 IP 列表。而且串行执行的话 14 台要等很久,改成并行又得处理输出混乱的问题。
方案三:Ansible
专业方案,确实好用。但对于我这种只有十几台机器的小团队来说,光是装 Ansible、写 inventory、学 playbook 语法,就够折腾半天的。杀鸡用牛刀。
我后来用的方式
后来同事推荐了一个开源运维工具。GitHub 上有 1 万多 star,AGPL-3.0 协议,没有商业版,直接用就行。
它有个"批量执行"功能,体验大概是这样的:
- 先把服务器加到主机列表里(IP + SSH 密钥或密码,做一次就行)
- 进"批量执行"页面,勾选要操作的主机
- 贴上要执行的命令
- 点执行,结果实时回显
不需要在目标服务器上装任何 agent,走的还是 SSH 协议。只不过连接管理、并行执行、结果收集这些事情平台帮你干了。
我那 14 台服务器改时区,从勾选到执行完毕大概一分钟。每台的输出单独展示,哪台成功哪台失败一目了然。
除了批量执行还有什么
既然提到这个工具,顺便说一下它其他几个我在用的功能:
在线终端:浏览器里直接开 SSH 终端,不用开本地终端再 ssh 过去。临时上去看个日志、查个进程挺方便。
文件管理:上传下载文件,比 scp 命令直观。虽然大文件还是 scp 快,但传个配置文件、下个日志绰绰有余。
任务计划:相当于可视化的 crontab。定时任务加在平台上统一管理,不用挨个机器去改 crontab 了。
应用发布:支持简单的部署流程编排。我们的发布流程比较简单(拉代码、重启服务),用这个够了。复杂流程可能还是得上 CI/CD。
什么时候适合用这类工具
说几个判断标准:
- 服务器数量在 10-100 台这个量级
- 团队没有专职 DevOps,运维工作是开发顺带做的
- 不想花时间学 Ansible/SaltStack 那套体系
- 需要一个有界面的东西,不想全靠命令行和脚本
如果你管着几百台以上,或者有复杂的编排需求,那 Ansible/Terraform 这类工具更合适。这个工具解决的是"中小团队的日常运维效率"问题,不是替代专业 DevOps 工具链。
有兴趣的可以去 GitHub 搜 openspug/spug 看看,README 写得挺清楚的。