From 39624e4b9e5e578dbe3f26a3c6de788765c1579b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E7=81=BF?= Date: Tue, 27 Jun 2023 16:42:46 +0800 Subject: [PATCH] =?UTF-8?q?ansible=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bean/vo/request/task_manage.go | 7 ++++ src/controller/task_manage.go | 20 +++++++++ src/pkg/beagle/resp/code.go | 2 + src/router/automatedmaintenrouter.go | 2 +- src/service/task_manage.go | 63 ++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 1 deletion(-) diff --git a/src/bean/vo/request/task_manage.go b/src/bean/vo/request/task_manage.go index b67dddb..5ac9ecb 100644 --- a/src/bean/vo/request/task_manage.go +++ b/src/bean/vo/request/task_manage.go @@ -30,3 +30,10 @@ type ListTaskManageReq struct { CreateDateTo string `json:"createDateTo" form:"createDateTo"` //创建时间至 Pagination } + +type ExecScriptReq struct { + HostGroupId int `json:"host_group_id" vd:"$>0;msg:'请输入主机分组id'"` //主机分组id + Type int `json:"type"` //脚本额外变量类型1yaml 2json + Value string `json:"value"` //脚本额外变量值 + Script string `json:"script"` //执行脚本 +} diff --git a/src/controller/task_manage.go b/src/controller/task_manage.go index a8ed9f3..607c0b9 100644 --- a/src/controller/task_manage.go +++ b/src/controller/task_manage.go @@ -116,3 +116,23 @@ func ListTaskManage(c *gin.Context) { } SendJsonPageResponse(c, resp.OK, list, total) } + +func ExecScript(c *gin.Context) { + var req request.ExecScriptReq + if err := c.ShouldBindJSON(&req); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + //参数校验 + if err := util.ValidateSimple(req, "HostManageId"); err != nil { + SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) + return + } + taskManageSvc := service.TaskManageSvc{} + data, err := taskManageSvc.ExecScript(req) + if err != nil { + SendJsonResponse(c, err, nil) + return + } + SendJsonResponse(c, nil, data) +} diff --git a/src/pkg/beagle/resp/code.go b/src/pkg/beagle/resp/code.go index b411d26..efe4f8c 100644 --- a/src/pkg/beagle/resp/code.go +++ b/src/pkg/beagle/resp/code.go @@ -28,4 +28,6 @@ var ( EsConnectError = Resp{Code: 5010009, Msg: "es连接失败"} AddSheetError = Resp{Code: 5010010, Msg: "新建sheet失败"} UnableAccountLock = Resp{Code: 5010011, Msg: "暂无账号锁定"} + CmdExecError = Resp{Code: 5010012, Msg: "执行shell命令失败"} + FileExecError = Resp{Code: 5010013, Msg: "文件执行失败"} ) diff --git a/src/router/automatedmaintenrouter.go b/src/router/automatedmaintenrouter.go index 59ec8f5..4f82597 100644 --- a/src/router/automatedmaintenrouter.go +++ b/src/router/automatedmaintenrouter.go @@ -18,7 +18,7 @@ func InitAutomatedMaintenRouter(e *gin.Engine) { task.DELETE("/del", controller.DelTaskManage) // 删除 task.GET("/details", controller.DetailsTaskManage) // 详情 task.GET("/list", controller.ListTaskManage) // 列表 - task.POST("/exec/script") // 立即执行 + task.POST("/exec/script", controller.ExecScript) // 立即执行 } //主机管理 host := so.Group("/hostManage") diff --git a/src/service/task_manage.go b/src/service/task_manage.go index 043a894..1dcf9eb 100644 --- a/src/service/task_manage.go +++ b/src/service/task_manage.go @@ -7,6 +7,8 @@ import ( "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/client" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" + "os" + "os/exec" "time" ) @@ -142,3 +144,64 @@ func (t *TaskManageSvc) ListTaskManage(req request.ListTaskManageReq) (total int } return } + +func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{}, err error) { + //获取主机IP + var ipList []string + db, err := client.GetDbClient() + if err != nil { + err = resp.DbConnectError.WithError(err) + return + } + if err := db.Table("host_manage_list").Select("ip").Where("host_group_id = ?", req.HostGroupId).Find(&ipList); err != nil { + err = resp.DbSelectError.WithError(err) + return + } + //写入主机组ip + f, err := os.Open("/etc/ansible/hosts") + if err != nil { + err = resp.FileExecError.WithError(err) + return + } + defer f.Close() + for _, v := range ipList { + _, err := f.Write([]byte(fmt.Sprintf("%s\n", v))) + if err != nil { + return nil, resp.FileExecError.WithError(err) + } + } + //写入执行脚本 + f2, err := os.Create("/etc/ansible/ansible.yml") + if err != nil { + err = resp.FileExecError.WithError(err) + return + } + defer f2.Close() + _, err = f2.Write([]byte(req.Script)) + if err != nil { + return nil, resp.FileExecError.WithError(err) + } + //写入额外yml参数 + if req.Type == 1 { + //写入执行脚本 + f3, err := os.Create("/etc/ansible/ansible_extra.yml") + if err != nil { + err = resp.FileExecError.WithError(err) + return + } + defer f3.Close() + _, err = f3.Write([]byte(req.Value)) + if err != nil { + return nil, resp.FileExecError.WithError(err) + } + req.Value = fmt.Sprintf("@/etc/ansible/ansible_extra.yml") + } + cmd := exec.Command("ansible", "-i", "/etc/ansible/hosts", "/etc/ansible/ansible.yml", "--extra-vars", req.Value) + output, err := cmd.Output() + if err != nil { + err = resp.CmdExecError.WithError(err) + return + } + fmt.Println(string(output)) + return string(output), nil +} -- 2.26.0