diff --git a/src/service/task_manage.go b/src/service/task_manage.go index 5f25ba048ff7ab93da9d5f2f19e21f05e5c83f0a..4c71ee6ce31b558e0c5a92910f43d9dab9546947 100644 --- a/src/service/task_manage.go +++ b/src/service/task_manage.go @@ -1,6 +1,7 @@ package service import ( + "bufio" "context" "errors" "fmt" @@ -249,16 +250,49 @@ func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data map[string]i } var cmd *exec.Cmd if req.Value != "" { - cmd = exec.Command("ansible-playbook", "-i", "/etc/ansible/hosts", "/etc/ansible/ansible.yml", "--extra-vars", req.Value) + cmd = exec.Command("ansible-playbook", "/etc/ansible/ansible.yml", "--extra-vars", req.Value) } else { - cmd = exec.Command("ansible-playbook", "-i", "/etc/ansible/hosts", "/etc/ansible/ansible.yml") + cmd = exec.Command("ansible-playbook", "/etc/ansible/ansible.yml") } + + //捕获标准输出 stdout, err := cmd.StdoutPipe() if err != nil { fmt.Println("执行出错:", err) fmt.Println("stdout:", stdout) - return nil, resp.CmdExecError.WithError(err) + //return nil, resp.CmdExecError.WithError(err) + } + readout := bufio.NewReader(stdout) + go func() { + GetOutput(readout) + }() + //捕获标准错误 + stderr, err := cmd.StderrPipe() + if err != nil { + fmt.Println("执行出错:", err) + fmt.Println("stdout:", stdout) + //return nil, resp.CmdExecError.WithError(err) + } + readerr := bufio.NewReader(stderr) + go func() { + GetOutput(readerr) + }() + + //执行命令 + err = cmd.Run() + if err != nil { + return } + //stdout, err := cmd.StdoutPipe() + //if err != nil { + // fmt.Println("执行出错:", err) + // fmt.Println("stdout:", stdout) + // return nil, resp.CmdExecError.WithError(err) + //} + //if err = cmd.Start(); err != nil { // 运行命令 + // log.Fatal(err) + //} + fmt.Println("执行成功") fmt.Println("stdout:", stdout) //outputBuf := bufio.NewReader(stdout) @@ -274,3 +308,21 @@ func (t *TaskManageSvc) ExecScript(req request.ExecScriptReq) (data map[string]i //data["output"] = string(output) return data, nil } + +func GetOutput(reader *bufio.Reader) { + var sumOutput string //统计屏幕的全部输出内容 + outputBytes := make([]byte, 200) + for { + n, err := reader.Read(outputBytes) //获取屏幕的实时输出(并不是按照回车分割,所以要结合sumOutput) + if err != nil { + if err == io.EOF { + break + } + fmt.Println(err) + sumOutput += err.Error() + } + output := string(outputBytes[:n]) + fmt.Println("输出屏幕内容:", output) //输出屏幕内容 + sumOutput += output + } +}