diff --git a/src/bean/vo/request/task_manage.go b/src/bean/vo/request/task_manage.go index 09726ed1defdc7ec1d6c11d48ad91922a7b97371..59f1b6ec2a09593b4fa843c05a2935bb21b91008 100644 --- a/src/bean/vo/request/task_manage.go +++ b/src/bean/vo/request/task_manage.go @@ -36,6 +36,5 @@ type ExecScriptReq struct { HostGroupId int `form:"host_group_id" vd:"$>0;msg:'请输入主机分组id'"` //主机分组id Type int `form:"type"` //脚本额外变量类型1yaml 2json Value string `form:"value"` //脚本额外变量值 - ExecType int `form:"exec_type" binding:"oneof=1 2"` //执行类型:1文本执行 2文件执行 Script string `form:"script"` //执行脚本/文件名 } diff --git a/src/common/tools/hosts b/src/common/tools/hosts index 81b12952c9ad48e0841de70b461213052478d95a..2d3faefd5924c63ae482dc9f83627c6b733dbd5b 100644 --- a/src/common/tools/hosts +++ b/src/common/tools/hosts @@ -1,6 +1,16 @@ +[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 \ No newline at end of file +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="" diff --git a/src/common/tools/hosts.go b/src/common/tools/hosts.go index 4315ccfc87c48be81e14a9a9f807233d229893d9..5e075f721ada80af4130fef34aabee5d8ee139ff 100644 --- a/src/common/tools/hosts.go +++ b/src/common/tools/hosts.go @@ -8,7 +8,9 @@ import ( ) func HostsToJson() (data map[string][]string, err error) { - f, err := os.Open(`/etc/ansible/hosts`) + //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 } @@ -36,13 +38,15 @@ func HostsToJson() (data map[string][]string, err error) { } 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("/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))) + _, err = f.Write([]byte(fmt.Sprintf("%s\n", k))) if err != nil { return err } @@ -51,6 +55,10 @@ func MapToSaveHosts(data map[string][]string) error { if err != nil { return err } + _, err = f.Write([]byte("\n")) + if err != nil { + return err + } } return nil } diff --git a/src/controller/task_manage.go b/src/controller/task_manage.go index 01b13e50c9d926c53bb64c9111d7021fb6ccc576..2dfda13135e6e67484855efc297160e778d63581 100644 --- a/src/controller/task_manage.go +++ b/src/controller/task_manage.go @@ -124,9 +124,6 @@ func ExecScript(c *gin.Context) { return } - if req.Type == 2 { - //从minio读取yaml文件 - } taskManageSvc := service.TaskManageSvc{} data, err := taskManageSvc.ExecScript(req) if err != nil { diff --git a/src/service/host_manage.go b/src/service/host_manage.go index 046512f291d0111f55b23775040fac05edabb236..39a647e917332d5eb78325227dadafd22064c37a 100644 --- a/src/service/host_manage.go +++ b/src/service/host_manage.go @@ -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/common/client" "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" - "os" "os/exec" "strings" "time" @@ -22,7 +22,8 @@ type HostManageSvc struct { User *entity.SystemUser } -const AnsibleGroup string = "HostManage" +const AnsibleGroup string = "HostGroup" +const AnsibleIp string = "HostIp" // AddHostManage 新增主机 func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) { @@ -84,12 +85,22 @@ func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) 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 { port := "22" if v.Port != "" { port = v.Port } + hostManageList := entity.HostManageList{ Ip: v.Ip, Port: port, @@ -106,6 +117,18 @@ func (h *HostManageSvc) AddHostManage(req request.AddHostManageReq) (err error) session.Rollback() 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() @@ -166,6 +189,14 @@ func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error 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 { port := "22" @@ -188,8 +219,19 @@ func (h *HostManageSvc) EditHostManage(req request.EditHostManageReq) (err error session.Rollback() 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() return } @@ -393,7 +435,7 @@ func (h *HostManageSvc) SaveStateHostManage(hostManageList []request.HostManageL } //处理ip列表 ipGroup := 1 - HostManageListCaches := make([]entity.HostManageListCache, 0) + hostManageListCaches := make([]entity.HostManageListCache, 0) for _, v := range hostManageList { port := "22" if v.Port != "" { @@ -410,48 +452,52 @@ func (h *HostManageSvc) SaveStateHostManage(hostManageList []request.HostManageL Password: v.Password, IpGroup: ipGroup, } - HostManageListCaches = append(HostManageListCaches, HostManageListCache) + hostManageListCaches = append(hostManageListCaches, HostManageListCache) } ipGroup += 1 } - //往hosts文件中写入主机组ip - //f, err := os.Open("/etc/ansible/hosts") - //if err != nil { - // err = resp.FileExecError.WithError(err) - // return - //} - //defer f.Close() - - f, err := os.OpenFile("/etc/ansible/hosts", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0777) + //读取hosts中的主机组 + hosts, err := tools.HostsToJson() if err != nil { - err = resp.FileExecError.WithError(err) + err = resp.MarshalError.WithError(err) return } - defer f.Close() - //_, err = f.Write([]byte(fmt.Sprintf("%s%d\n", AnsibleGroup, req.Id))) - //if err != nil { - // err = resp.FileExecError.WithError(err) - // return - //} - 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))) - if err != nil { - err = resp.FileExecError.WithError(err) - return + if _, ok := hosts["["+AnsibleGroup+"]"]; !ok { + // 不存在 + hosts["["+AnsibleGroup+"]"] = nil + } + + for _, v := range hostManageListCaches { + + 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 { + err = resp.MarshalError.WithError(err) + return + } //状态检测 id = uuid.New().String() - for k, v := range HostManageListCaches { + for k, v := range hostManageListCaches { //调用状态检测函数 - HostManageListCaches[k].ConnStatus = StatusDetection(v.Ip) - HostManageListCaches[k].Id = id + hostManageListCaches[k].ConnStatus = StatusDetection(v.Ip) + 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 { err = resp.DbInsertError.WithError(err) return @@ -517,7 +563,7 @@ func (h *HostManageSvc) SaveIpExceptionList(req request.HostIpExceptionListReq) // StatusDetection 状态检测 func StatusDetection(ip string) (ipConn int) { 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() if err != nil { fmt.Println("ping:", string(output))