基于Golang + Ansible构建作业系统

2024-08-01 18:44:28 浏览数 (3)

背景

在近期的Jenkins训练营上,讲解了Ansible的课程,这让我产生了一个想法:能否通过图形化界面来管理Ansible,并运行一些作业任务以减少服务器的登录次数?恰好我正在优化Go-Easy-Admin,所以决定利用周末的时间开发一个这样的功能。这不仅有助于大家学习,还可以熟练掌握Go-Easy-Admin和Go-Ansible的使用。

技术栈

  • 前端:Vue Typescript ArcoDesign
  • 后端:Golang Gin Gorm
  • 依赖:Ansible

主要功能

Go-ansible使用指南

Go-ansible 是一个 Go 语言包,允许直接从 Golang 应用程序执行 Ansible 命令,例如 ansible-playbook、ansible-inventory 或 ansible。它为每个命令提供了多种选项,便于将 Ansible 功能无缝集成到您的项目中。需要特别强调的是,go-ansible 并不是 Ansible 的替代实现,而是对 Ansible 命令的封装。让我们一起深入探索 go-ansible 的功能。

安装Go-ansible:

要安装最新的稳定版本,请运行以下命令:

代码语言:javascript复制
$ go get github.com/apenella/go-ansible/v2@v2.0.1

Adhoc:

代码语言:javascript复制
$ cat main.go
package main

import (
 "context"
 "fmt"
 "github.com/apenella/go-ansible/v2/pkg/adhoc" // 提供了执行Ansible adhoc命令的功能
 "github.com/apenella/go-ansible/v2/pkg/execute" // 提供了执行Ansible命令的通用接口
 "github.com/apenella/go-ansible/v2/pkg/execute/stdoutcallback" // 提供了一种特殊的执行器,它使用单行输出来回调stdout的输出
)

func main() {
 ansibleAdhocOptions := &adhoc.AnsibleAdhocOptions{
  Args:       "free -m",  // 指定了要执行的命令
  Inventory:  " 10.0.53.73,", // 指定了目标主机的IP地址
  ModuleName: "command", // 指定了使用的Ansible模块
 }

 adhocCmd := adhoc.NewAnsibleAdhocCmd(
  adhoc.WithPattern("all"), // 所有目标执行命令
  adhoc.WithAdhocOptions(ansibleAdhocOptions),
 )

 fmt.Println("Command: ", adhocCmd.String())

 Execute := stdoutcallback.NewOnelineStdoutCallbackExecute(
  execute.NewDefaultExecute(
   execute.WithCmd(adhocCmd),
  ),
 )

 err := Execute.Execute(context.TODO())
 if err != nil {
  panic(err)
 }
}

Playbook:

代码语言:javascript复制
$ cat main.go
package main

import (
 "context"
 "fmt"
 "os"

 "github.com/apenella/go-ansible/v2/pkg/playbook"
)

func main() {

 ansiblePlaybookOptions := &playbook.AnsiblePlaybookOptions{
  Inventory: "10.0.53.73,",  // 指定了目标主机的IP地址
 }

 err := playbook.NewAnsiblePlaybookExecute("task.yml"). // 创建一个新的Ansible playbook执行器实例,指定了要执行的playbook文件(在这个例子中是task.yml)
  WithPlaybookOptions(ansiblePlaybookOptions).
  Execute(context.TODO())

 if err != nil {
  fmt.Println(err.Error())
  os.Exit(1)
 }
}

功能展示

快捷命令

创建命令:

填写表单:

立即执行:

查看结果:

模板管理

创建模板:

填写表单:

创建成功:

作业配置

创建作业:

填写表单:

立即执行:

执行历史

查看执行结果:

敬请期待后续文章,将介绍如何对接CMDB并批量执行任务!

0 人点赞