1Panel 批量操作实战:10 台服务器分组,命令一次下发
【免费下载链接】1Panel🔥 1Panel is a modern, open-source Linux server management panel and a lightweight AI management platform.项目地址: https://gitcode.com/GitHub_Trending/1p/1Panel
1Panel 的批量操作围绕两件事展开:服务器分组和批量命令执行。把纳管机器归入分组,把常用命令沉淀成模板,需要时选中分组、点选命令即可多机同时执行。本文带你走完「主机分组 → 命令建库 → 批量下发与模板导出」的完整链路,并顺带点出背后的关键实现。
📦 第一步:把服务器装进「分组」
凌晨告警,10 台机器要同时清缓存,你不可能 SSH 十次。解法是把机器先归类:进入「主机管理」页面(源码见frontend/src/views/terminal/host/index.vue),点「添加主机」录入服务器,再点「分组」按钮创建服务器组。列表右上角的分组下拉框可以按组筛选;主机的「分组」列支持行内直接切换归属;多选主机后还能一次性批量删除。
后端逻辑不复杂:core/app/service/group.go的Create方法会先按「组名 + 类型」查重,重名直接返回ErrRecordExist,通过才落库。对外的 4 个接口定义在core/router/ro_group.go:
POST /groups创建POST /groups/del删除POST /groups/update更新POST /groups/search查询
⚡ 第二步:把常用命令做成「菜单」
命令管理在core/app/service/command.go里实现,同样是创建、查询、更新、删除一套 CRUD。建命令时给它起名、写入命令体,并挂到某个命令组下——这一步看似琐碎,却是后面批量执行的「弹药库」。
真正把命令组织成「可勾选菜单」的是SearchForTree:它按「组 → 命令」两层结构生成树,空组会被过滤掉,前端用级联选择器一次选中多条命令。核心逻辑就是下面这个双层遍历:
for _, group := range groups { data := dto.CommandTree{Label: group.Name, Value: group.Name} for _, cmd := range cmdList { if cmd.GroupID == group.ID { data.Children = append(data.Children, dto.CommandTree{Label: cmd.Name, Value: cmd.Command}) } } if len(data.Children) != 0 { lists = append(lists, data) } }接口层(core/router/command.go)还挂了/commands/tree(树查询)、/commands/export(导出)、/commands/import(导入)等路由,批量执行前用它取数即可。
🧩 第三步:批量执行与模板导出
🚀 批量命令执行的完整流程可以拆成 4 步:
- 在命令管理界面创建命令,或从命令树里选现成的
- 回到主机页面,用分组下拉框筛出目标机器(或手动勾选)
- 选中命令执行,1Panel 向组内各台主机逐台下发
- 汇总查看每台机器的执行结果
模板的「可携带」是容易被忽略的一点:command.go中的Export方法会把全部command类型命令写成 CSV,落到1panel/tmp/export/commands/目录,文件名形如1panel-commands-<时间戳>.csv。新实例或同组同事的 1Panel 通过/commands/import直接还原,命令库瞬间一致。
两个使用边界值得记住:批量操作的抓手是「分组」,主机必须先归组才能按组筛选和批量操作;命令树只展示有命令的组,空组不会出现在选择列表里。
一句话总结:分组决定「对谁做」,命令模板决定「做什么」,两者对齐后多机运维就从逐台操作变成了按组下发。想继续了解 1Panel 的完整能力版图,可以从官方说明文档 README.md 开始读起。
【免费下载链接】1Panel🔥 1Panel is a modern, open-source Linux server management panel and a lightweight AI management platform.项目地址: https://gitcode.com/GitHub_Trending/1p/1Panel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考