1. 环境准备:安装Golang并配置跨平台编译
在Linux系统上安装Golang(通过官网下载tar包解压至/usr/local,配置PATH和GOPATH环境变量),并利用其交叉编译特性生成Linux目标平台的静态二进制文件(如GOOS=linux GOARCH=amd64 go build -o my-ops-tool)。静态编译的二进制无需依赖外部运行时,可直接在目标服务器运行,简化部署流程。
2. 基础运维任务:系统监控与自动化操作
time.Ticker实现周期性任务(如每5分钟检查磁盘使用率),通过os/exec包执行df -h命令,解析输出并告警(如磁盘使用率超过80%时发送邮件);filepath.Walk遍历日志目录(如/var/log/myapp),筛选超过7天的.log文件并删除,避免磁盘空间耗尽;systemctl is-active <service_name>检查服务状态(如myweb),若未运行则执行systemctl start <service_name>自动重启。3. 远程批量操作:SSH无密码执行命令
使用golang.org/x/crypto/ssh包实现SSH客户端,通过密钥认证(读取私钥文件并解析为ssh.Signer)连接远程服务器,执行命令(如批量重启服务)。示例代码:
func runSSHCommand(host, user, keyPath, cmd string) {
key, _ := os.ReadFile(keyPath)
signer, _ := ssh.ParsePrivateKey(key)
config := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)},
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境建议用StrictHostKeyChecking
}
client, _ := ssh.Dial("tcp", host+":22", config)
defer client.Close()
session, _ := client.NewSession()
defer session.Close()
output, _ := session.Output(cmd)
fmt.Printf("[%s] 输出: %s\n", host, output)
}
该方式适用于批量管理多台Linux服务器(如更新代码、重启服务)。
4. 部署流水线:从代码到上线的自动化
push/merge事件(如通过GitHub Actions触发),执行go build生成二进制文件,通过交叉编译适配Linux环境,并上传至制品库(如MinIO、Nexus);golang:alpine镜像构建),使用client-go库调用Kubernetes API实现滚动更新(替换Pod),集成Consul做服务注册与发现;go-migrate库),确保应用与数据库 schema 同步。5. 日志与监控:数据采集与告警
bufio.Scanner读取日志文件末尾,实时监听新增日志),过滤关键字(如ERROR),将结构化日志(JSON格式)发送至ELK或Loki,便于后续检索与分析;6. 工具化与复用:CLI与模板生成
cobra库封装常用运维命令(如my-ops-tool build、my-ops-tool deploy),支持YAML配置文件(如定义服务器列表、部署路径),降低使用门槛;text/template包生成Bash脚本(如根据YAML中的依赖项生成安装命令),避免重复编写Shell脚本,提升可维护性。例如,YAML定义依赖项后,生成包含echo和install命令的Bash脚本。最佳实践建议
Viper或环境变量管理主机列表、端口、路径等参数,避免硬编码;err(尤其是网络请求、文件操作),避免程序崩溃;GOOS=linux GOARCH=amd64 go build生成目标服务器可用的二进制,简化部署。