• Go 在运维开发中的应用


    一、介绍 

    Go语言(也称Golang)因其高效、简洁和强大的并发支持而在云计算和运维开发中变得非常受欢迎。

    • 性能优越:Go编译成机器代码,运行效率高,且内存占用少,适合高性能运维工具的开发。

    • 并发支持:Go内置goroutines和channels,简化了并发编程,适合开发需要高并发处理的运维工具。

    • 易于部署:Go语言编译生成静态二进制文件,无需依赖其他库,方便部署。

    • 丰富的标准库:Go标准库提供了丰富的功能,可以快速开发运维工具。

    二、Go语言在运维开发中的实际应用 

    示例一:简单的端口监控工具

    运维中,监控服务端口是否可用是一个常见需求。我们可以使用Go编写一个简单的端口监控工具。

    1. package main
    2. import (
    3. "fmt"
    4. "net"
    5. "time"
    6. )
    7. // CheckPort 检查指定主机和端口是否可达
    8. func CheckPort(host string, port int) bool {
    9. address := fmt.Sprintf("%s:%d", host, port)
    10. conn, err := net.DialTimeout("tcp", address, 2*time.Second)
    11. if err != nil {
    12. return false
    13. }
    14. _ = conn.Close()
    15. return true
    16. }
    17. func main() {
    18. // 定义一个结构体来存储服务的地址和端口
    19. type Service struct {
    20. Address string
    21. Port int
    22. }
    23. pingStr := []Service{
    24. {"127.0.0.1", 6379}, //redis:6379
    25. {"127.0.0.1", 3306}, //mysql:3306
    26. {"192.168.4.17", 1430},
    27. }
    28. for {
    29. for _, service := range pingStr {
    30. if CheckPort(service.Address, service.Port) {
    31. fmt.Printf("%v:%v 主机可以访问\n", service.Address, service.Port)
    32. } else {
    33. fmt.Printf("%v:%v 主机不可以访问\n", service.Address, service.Port)
    34. }
    35. }
    36. time.Sleep(5 * time.Second)
    37. }
    38. }

    示例二:系统资源监控工具

    运维工作中,监控系统资源(如CPU、内存、磁盘)是非常重要的任务。Go语言的syscall包和第三方库gopsutil非常适合这类任务。

    安装

    1. go mod init sysmonitor
    2. go get github.com/shirou/gopsutil
    1. package main
    2. import (
    3. "fmt"
    4. "github.com/shirou/gopsutil/cpu"
    5. "github.com/shirou/gopsutil/disk"
    6. "github.com/shirou/gopsutil/mem"
    7. "time"
    8. )
    9. // PrintCPUUsage 打印CPU使用情况
    10. func PrintCPUUsage() {
    11. percent, _ := cpu.Percent(0, false)
    12. fmt.Printf("CPU使用情况: %.2f%%\n", percent[0])
    13. }
    14. // PrintMemoryUsage 打印内存使用情况
    15. func PrintMemoryUsage() {
    16. vm, _ := mem.VirtualMemory()
    17. fmt.Printf("Memory内存使用情况: %.2f%%\n", vm.UsedPercent)
    18. }
    19. // PrintDiskUsage 打印磁盘使用情况
    20. func PrintDiskUsage() {
    21. u, _ := disk.Usage("/")
    22. fmt.Printf("Disk磁盘使用情况: %.2f%%\n", u.UsedPercent)
    23. }
    24. func main() {
    25. fmt.Println("开始监控")
    26. for {
    27. PrintCPUUsage()
    28. PrintMemoryUsage()
    29. PrintDiskUsage()
    30. fmt.Println("---------------------")
    31. time.Sleep(2 * time.Second)
    32. }
    33. }

     可能受杀毒软件、防火墙、权限等限制

    示例三:自动化运维脚本

    自动化运维任务是DevOps领域的重要组成部分。例如,我们可以使用Go语言编写脚本来自动化部署应用。

    假设我们有一个简单的应用需要在多个服务器上部署,以下是一个基本的自动化部署脚本:

    1. package main
    2. import (
    3. "fmt"
    4. "os/exec"
    5. )
    6. // ExecuteSSHCommand 在指定服务器上执行命令
    7. func ExecuteSSHCommand(host, user, command string) error {
    8. cmd := exec.Command("ssh", fmt.Sprintf("%s@%s", user, host), command)
    9. output, err := cmd.CombinedOutput()
    10. if err != nil {
    11. return fmt.Errorf("执行命令时出错: %s\n%s", err, string(output))
    12. }
    13. fmt.Printf("输出来自%s:\n%s\n", host, string(output))
    14. return nil
    15. }
    16. func main() {
    17. servers := []string{"server1.example.com", "server2.example.com"}
    18. user := "admin"
    19. command := "sudo systemctl restart myapp"
    20. for _, server := range servers {
    21. err := ExecuteSSHCommand(server, user, command)
    22. if err != nil {
    23. fmt.Printf("未能在上执行命令%s: %s\n", server, err)
    24. } else {
    25. fmt.Printf("已成功在上执行命令%s\n", server)
    26. }
    27. }
    28. }

     参考:https://mp.weixin.qq.com/s/g31nwEpyhA0BZJWXw05jig

  • 相关阅读:
    原来Linux makefile可以如此简单
    [idekCTF 2022]Paywall - LFI+伪协议+filter_chain
    Shopee卖家如何寻找货源渠道?
    C++之模板进阶
    扒去 Spring 事件监听机制的外衣,竟是观察者模式
    maven 包管理平台 windows 安装配置 + mac 安装配置
    面试求职者
    elasticsearch集群部署-实操
    【基础架构】part-1 高可用策略和知识点总结
    KubeSphere 社区双周报 | FluentBit 新增 tcp 输入插件 | 2023.09.29-10.12
  • 原文地址:https://blog.csdn.net/qq_39335595/article/details/139435733