Commit f2cdf1ec authored by 黄智's avatar 黄智

Merge remote-tracking branch 'origin/dev' into dev

parents 63baf5dd a20551a8
...@@ -37,4 +37,5 @@ type ExecScriptReq struct { ...@@ -37,4 +37,5 @@ type ExecScriptReq struct {
Type int `form:"type"` //脚本额外变量类型1yaml 2json Type int `form:"type"` //脚本额外变量类型1yaml 2json
Value string `form:"value"` //脚本额外变量值 Value string `form:"value"` //脚本额外变量值
Script string `form:"script"` //执行脚本 Script string `form:"script"` //执行脚本
ScriptUrl string `form:"script_url"` //执行脚本url
} }
[HostGroup]
HostIp192.168.0.1 ansible_ssh_host=192.168.0.1 ansible_ssh_port=22 ansible_ssh_user="admin" ansible_ssh_pass="123456"
HostIp192.186.10.1 ansible_ssh_host=192.186.10.1 ansible_ssh_port=22 ansible_ssh_user="admin" ansible_ssh_pass="123456"
HostIp101.168.0.1 ansible_ssh_host=101.168.0.1 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass=""
HostIp101.186.10.1 ansible_ssh_host=101.186.10.1 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass=""
[webGroup1]
192.168.0.11 ansible_ssh_host=192.168.0.11 ansible_ssh_user=root ansible_ssh_pass=123.com ansible_ssh_port=3333
192.168.0.12 ansible_ssh_host=192.168.0.12 ansible_ssh_user=root ansible_ssh_pass=1234.com ansible_ssh_port=2222
[webGroup2]
192.168.1.11 ansible_ssh_host=192.168.1.11 ansible_ssh_user=admin ansible_ssh_pass=ccc.com ansible_ssh_port=11
192.168.1.12 ansible_ssh_host=192.168.1.12 ansible_ssh_user=admin ansible_ssh_pass=111.com ansible_ssh_port=22
[HostGroup15]
HostIp22 ansible_ssh_host=192.168.0.1 ansible_ssh_port=22 ansible_ssh_user="admin" ansible_ssh_pass="123456"
HostIp23 ansible_ssh_host=192.186.10.1 ansible_ssh_port=22 ansible_ssh_user="admin" ansible_ssh_pass="123456"
HostIp24 ansible_ssh_host=101.168.0.1 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass=""
HostIp25 ansible_ssh_host=101.186.10.1 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass=""
package tools
import (
"bufio"
"fmt"
"os"
"strings"
)
func HostsToJson() (data map[string][]string, err error) {
f, err := os.Open(`/etc/ansible/hosts`)
//f, err := os.Open(`D:\work\goWork\智能运维平台\so-operation-api\src\common\tools\hosts`)
if err != nil {
return nil, err
}
defer f.Close()
data = make(map[string][]string)
// 以这个文件为参数,创建一个 scanner
s := bufio.NewScanner(f)
var key string
var per []string
// 扫描每行文件,按行读取
for s.Scan() {
if strings.HasPrefix(s.Text(), "[") && strings.HasSuffix(s.Text(), "]") {
key = s.Text()
per = []string{}
data[key] = per
} else {
data[key] = append(data[key], s.Text())
}
}
if s.Err() != nil {
return nil, s.Err()
}
return data, nil
}
func MapToSaveHosts(data map[string][]string) error {
f, err := os.OpenFile("/etc/ansible/hosts", os.O_APPEND|os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0777)
//f, err := os.OpenFile("D:/work/goWork/智能运维平台/so-operation-api/src/common/tools/hosts", os.O_APPEND|os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0777)
if err != nil {
return err
}
defer f.Close()
for k, v := range data {
_, err = f.Write([]byte(fmt.Sprintf("%s\n", k)))
if err != nil {
return err
}
_, err = f.Write([]byte(strings.Join(v, "\n")))
if err != nil {
return err
}
_, err = f.Write([]byte("\n"))
if err != nil {
return err
}
}
return nil
}
...@@ -123,6 +123,7 @@ func ExecScript(c *gin.Context) { ...@@ -123,6 +123,7 @@ func ExecScript(c *gin.Context) {
SendJsonResponse(c, resp.InvalidParam.WithError(err), nil) SendJsonResponse(c, resp.InvalidParam.WithError(err), nil)
return return
} }
taskManageSvc := service.TaskManageSvc{} taskManageSvc := service.TaskManageSvc{}
data, err := taskManageSvc.ExecScript(req) data, err := taskManageSvc.ExecScript(req)
if err != nil { if err != nil {
......
...@@ -11,8 +11,8 @@ import ( ...@@ -11,8 +11,8 @@ import (
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" "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/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/tools"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"os"
"os/exec" "os/exec"
"strings" "strings"
"time" "time"
...@@ -22,7 +22,8 @@ type HostManageSvc struct { ...@@ -22,7 +22,8 @@ type HostManageSvc struct {
User *entity.SystemUser User *entity.SystemUser
} }
const AnsibleGroup string = "HostManage" const AnsibleGroup string = "HostGroup"
const AnsibleIp string = "HostIp"
// AddHostManage 新增主机 // AddHostManage 新增主机
func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) { func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) {
...@@ -84,12 +85,22 @@ func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) ...@@ -84,12 +85,22 @@ func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error)
return return
} }
//读取hosts中的主机组
hosts, err := tools.HostsToJson()
if err != nil {
err = resp.MarshalError.WithError(err)
session.Rollback()
return
}
hosts["["+AnsibleGroup+fmt.Sprintf("%d", hostManage.Id)+"]"] = nil
//新增主机分组列表 //新增主机分组列表
for _, v := range hostManageLists { for _, v := range hostManageLists {
port := "22" port := "22"
if v.Port != "" { if v.Port != "" {
port = v.Port port = v.Port
} }
hostManageList := entity.HostManageList{ hostManageList := entity.HostManageList{
Ip: v.Ip, Ip: v.Ip,
Port: port, Port: port,
...@@ -106,6 +117,18 @@ func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) ...@@ -106,6 +117,18 @@ func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error)
session.Rollback() session.Rollback()
return return
} }
hostsIp := fmt.Sprintf("%s ansible_ssh_host=%s ansible_ssh_port=%s ansible_ssh_user=\"%s\" ansible_ssh_pass=\"%s\"",
AnsibleIp+fmt.Sprintf("%d", hostManageList.Id), v.Ip, v.Port, v.UserName, v.Password)
hosts["["+AnsibleGroup+fmt.Sprintf("%d", hostManage.Id)+"]"] = append(hosts["["+AnsibleGroup+fmt.Sprintf("%d", hostManage.Id)+"]"], hostsIp)
}
//写入hosts
err = tools.MapToSaveHosts(hosts)
if err != nil {
err = resp.MarshalError.WithError(err)
session.Rollback()
return
} }
session.Commit() session.Commit()
...@@ -166,6 +189,14 @@ func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error ...@@ -166,6 +189,14 @@ func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error
return return
} }
//读取hosts中的主机组
hosts, err := tools.HostsToJson()
if err != nil {
err = resp.MarshalError.WithError(err)
return
}
hosts["["+AnsibleGroup+fmt.Sprintf("%d", req.Id)+"]"] = nil
//新增主机分组列表 //新增主机分组列表
for _, v := range hostManageLists { for _, v := range hostManageLists {
port := "22" port := "22"
...@@ -188,8 +219,19 @@ func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error ...@@ -188,8 +219,19 @@ func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error
session.Rollback() session.Rollback()
return return
} }
hostsIp := fmt.Sprintf("%s ansible_ssh_host=%s ansible_ssh_port=%s ansible_ssh_user=\"%s\" ansible_ssh_pass=\"%s\"",
AnsibleIp+fmt.Sprintf("%d", hostManageList.Id), v.Ip, v.Port, v.UserName, v.Password)
hosts["["+AnsibleGroup+fmt.Sprintf("%d", req.Id)+"]"] = append(hosts["["+AnsibleGroup+fmt.Sprintf("%d", req.Id)+"]"], hostsIp)
} }
//写入hosts
err = tools.MapToSaveHosts(hosts)
if err != nil {
err = resp.MarshalError.WithError(err)
return
}
session.Commit() session.Commit()
return return
} }
...@@ -352,22 +394,22 @@ func (h *HostManageSvc) ListStateHostManage(req request.StateHostManageReq) (err ...@@ -352,22 +394,22 @@ func (h *HostManageSvc) ListStateHostManage(req request.StateHostManageReq) (err
} }
//往hosts文件中写入主机组ip //往hosts文件中写入主机组ip
f, err := os.OpenFile("/etc/ansible/hosts", os.O_APPEND|os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0777) //f, err := os.OpenFile("/etc/ansible/hosts", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0777)
if err != nil { //if err != nil {
err = resp.FileExecError.WithError(err) // err = resp.FileExecError.WithError(err)
return // return
} //}
defer f.Close() //defer f.Close()
_, err = f.Write([]byte(fmt.Sprintf("%s%d\n", AnsibleGroup, req.Id))) //_, err = f.Write([]byte(fmt.Sprintf("%s%d\n", AnsibleGroup, req.Id)))
if err != nil { //if err != nil {
return resp.FileExecError.WithError(err) // return resp.FileExecError.WithError(err)
} //}
for _, v := range hostManageList { //for _, v := range hostManageList {
_, err = f.Write([]byte(fmt.Sprintf("%s ansible_ssh_host=%s ansible_ssh_port=%s ansible_ssh_user=\"%s\" ansible_ssh_pass=\"%s\"\n", v.Ip, v.Ip, v.Port, v.UserName, v.Password))) // _, err = f.Write([]byte(fmt.Sprintf("%s ansible_ssh_host=%s ansible_ssh_port=%s ansible_ssh_user=\"%s\" ansible_ssh_pass=\"%s\"\n", v.Ip, v.Ip, v.Port, v.UserName, v.Password)))
if err != nil { // if err != nil {
return resp.FileExecError.WithError(err) // return resp.FileExecError.WithError(err)
} // }
} //}
for _, v := range hostManageList { for _, v := range hostManageList {
//修改状态 //修改状态
_, err = session.Table("host_manage_list").Where("is_delete = 0 AND id = ?", v.Id). _, err = session.Table("host_manage_list").Where("is_delete = 0 AND id = ?", v.Id).
...@@ -393,7 +435,7 @@ func (h *HostManageSvc) SaveStateHostManage(hostManageList []request.HostManageL ...@@ -393,7 +435,7 @@ func (h *HostManageSvc) SaveStateHostManage(hostManageList []request.HostManageL
} }
//处理ip列表 //处理ip列表
ipGroup := 1 ipGroup := 1
HostManageListCaches := make([]entity.HostManageListCache, 0) hostManageListCaches := make([]entity.HostManageListCache, 0)
for _, v := range hostManageList { for _, v := range hostManageList {
port := "22" port := "22"
if v.Port != "" { if v.Port != "" {
...@@ -410,40 +452,52 @@ func (h *HostManageSvc) SaveStateHostManage(hostManageList []request.HostManageL ...@@ -410,40 +452,52 @@ func (h *HostManageSvc) SaveStateHostManage(hostManageList []request.HostManageL
Password: v.Password, Password: v.Password,
IpGroup: ipGroup, IpGroup: ipGroup,
} }
HostManageListCaches = append(HostManageListCaches, HostManageListCache) hostManageListCaches = append(hostManageListCaches, HostManageListCache)
} }
ipGroup += 1 ipGroup += 1
} }
//往hosts文件中写入主机组ip //读取hosts中的主机组
f, err := os.OpenFile("/etc/ansible/hosts", os.O_APPEND|os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0777) hosts, err := tools.HostsToJson()
if err != nil { if err != nil {
err = resp.FileExecError.WithError(err) err = resp.MarshalError.WithError(err)
return return
} }
defer f.Close() if _, ok := hosts["["+AnsibleGroup+"]"]; !ok {
for _, v := range hostManageList { // 不存在
_, err = f.Write([]byte(fmt.Sprintf("%s ansible_ssh_host=%s ansible_ssh_port=%s ansible_ssh_user=\"%s\" ansible_ssh_pass=\"%s\"\n", v.Ip, v.Ip, v.Port, v.UserName, v.Password))) hosts["["+AnsibleGroup+"]"] = nil
if err != nil {
err = resp.FileExecError.WithError(err)
return
}
} }
//状态检测 for _, v := range hostManageListCaches {
id = uuid.New().String()
hostsIp := fmt.Sprintf("%s ansible_ssh_host=%s ansible_ssh_port=%s ansible_ssh_user=\"%s\" ansible_ssh_pass=\"%s\"", AnsibleIp+v.Ip, v.Ip, v.Port, v.UserName, v.Password)
flag := 0
for _, v1 := range hosts["["+AnsibleGroup+"]"] {
if v1 == hostsIp {
flag = 1
}
}
if flag == 0 {
hosts["["+AnsibleGroup+"]"] = append(hosts["["+AnsibleGroup+"]"], hostsIp)
}
}
//写入hosts
err = tools.MapToSaveHosts(hosts)
if err != nil { if err != nil {
err = resp.FAIL.WithError(err) err = resp.MarshalError.WithError(err)
return return
} }
for k, v := range HostManageListCaches {
//状态检测
id = uuid.New().String()
for k, v := range hostManageListCaches {
//调用状态检测函数 //调用状态检测函数
HostManageListCaches[k].ConnStatus = StatusDetection(v.Ip) hostManageListCaches[k].ConnStatus = StatusDetection(v.Ip)
HostManageListCaches[k].Id = id hostManageListCaches[k].Id = id
} }
//存入数据库 //存入数据库
_, err = db.Table("host_manage_list_cache").Insert(&HostManageListCaches) _, err = db.Table("host_manage_list_cache").Insert(&hostManageListCaches)
if err != nil { if err != nil {
err = resp.DbInsertError.WithError(err) err = resp.DbInsertError.WithError(err)
return return
...@@ -509,7 +563,7 @@ func (h *HostManageSvc) SaveIpExceptionList(req request.HostIpExceptionListReq) ...@@ -509,7 +563,7 @@ func (h *HostManageSvc) SaveIpExceptionList(req request.HostIpExceptionListReq)
// StatusDetection 状态检测 // StatusDetection 状态检测
func StatusDetection(ip string) (ipConn int) { func StatusDetection(ip string) (ipConn int) {
var cmd *exec.Cmd var cmd *exec.Cmd
cmd = exec.Command("ansible", fmt.Sprintf("%s", ip), "-m", "ping") cmd = exec.Command("ansible", fmt.Sprintf("%s", AnsibleIp+ip), "-m", "ping")
output, err := cmd.Output() output, err := cmd.Output()
if err != nil { if err != nil {
fmt.Println("ping:", string(output)) fmt.Println("ping:", string(output))
......
package service package service
import ( import (
"context"
"errors" "errors"
"fmt" "fmt"
"github.com/ghodss/yaml" "github.com/ghodss/yaml"
json "github.com/json-iterator/go" json "github.com/json-iterator/go"
"github.com/minio/minio-go/v7"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/entity"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/request"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/bean/vo/response" "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/common/client"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/common/conf"
"gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp" "gitlab.wodcloud.com/smart-operation/so-operation-api/src/pkg/beagle/resp"
"io"
"os" "os"
"os/exec" "os/exec"
"time" "time"
...@@ -174,6 +178,21 @@ func (t *TaskManageSvc) ListTaskManage(req request.ListTaskManageReq) (total int ...@@ -174,6 +178,21 @@ func (t *TaskManageSvc) ListTaskManage(req request.ListTaskManageReq) (total int
} }
func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{}, err error) { func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{}, err error) {
if req.ScriptUrl != "" {
minioClient, err := client.GetMinioConnect()
if err != nil {
return nil, resp.DbConnectError.WithError(err)
}
object, err := minioClient.GetObject(context.Background(), conf.Options.MinioBucket, req.ScriptUrl, minio.GetObjectOptions{})
if err != nil {
return nil, resp.FileExecError.WithError(err)
}
obj, err := io.ReadAll(object)
if err != nil {
return nil, resp.FileExecError.WithError(err)
}
req.Script = string(obj)
}
var script map[string]interface{} var script map[string]interface{}
j2, err := yaml.YAMLToJSON([]byte(req.Script)) j2, err := yaml.YAMLToJSON([]byte(req.Script))
if err != nil { if err != nil {
...@@ -181,7 +200,7 @@ func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{}, ...@@ -181,7 +200,7 @@ func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data interface{},
} }
err = json.Unmarshal(j2, &script) err = json.Unmarshal(j2, &script)
if err != nil { if err != nil {
return nil, resp.MarshalError.WithError(err) return nil, resp.MarshalError.WithError(errors.New("yaml格式错误"))
} }
if script["host"] == "all" { if script["host"] == "all" {
script["host"] = fmt.Sprintf("%s%d", AnsibleGroup, req.HostGroupId) script["host"] = fmt.Sprintf("%s%d", AnsibleGroup, req.HostGroupId)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment