簡介
ansible是自動化運維工具,基于Python開發(fā)。
ansible目前針對golang提供對應的SDK、API之類的。
我們這里可以采用直接調(diào)用ansible-playbook這個命令執(zhí)行我們的任務。
python
ansible
ansible
利用golang的os/exec來執(zhí)行ansible-playbook這個命令,實現(xiàn)變量的拼接,由于我習慣將對象存在hosts這個變量里面,因此操作的時候需要指定hosts這個變量。
package ansible?import ( "os/exec" "strings" "time")?// RunPlayBook 執(zhí)行通過ansible-playbook命令執(zhí)行ansible任務func RunPlayBook(ansiblePath, inventory, yamlfile string, vars []string) (result string, ok bool) { startTime := time.Now() commandStr := []string{ansiblePath, "--ssh-common-args='-o StrictHostKeyChecking=no'", "-i", inventory, yamlfile} for _, k := range vars { commandStr = append(commandStr, "-e") commandStr = append(commandStr, k) } // fmt.Println(commandStr) command := exec.Command(commandStr[0], commandStr[1:]...) errString := "" output, err := command.CombinedOutput() if err != nil { errString = "ERROR: " err.Error() } // fmt.Println(string(output)) recapFlag := False // ok := false for _, line := range strings.Split(string(output), "n") { if strings.TrimSpace(line) == "" { continue } if strings.HasPrefix(line, "PLAY RECAP *") { recapFlag = true } if recapFlag { if strings.Contains(line, "unreachable=0") && strings.Contains(line, "failed=0") { ok = true } } } return strings.Join(commandStr, " ") "n " errString "n " string(output) "n=======================================n開始時間:" startTime.Format("2006-01-02 15:04:05") "n結束時間:" time.Now().Format("2006-01-02 15:04:05") "n耗時:" time.Now().Sub(startTime).String(), ok}?
測試
準備playbook文件
vim /data/ansible/test.yaml
做一個簡單的測試,將要執(zhí)行的對象放到hosts這個變量里面
- name: 測試ansible任務 hosts: "{{ hosts }}" remote_user: root gather_facts: False tasks: - name: hostname command: hostname register: hostname - name: echo debug: msg: "get hostname from {{ hostname }} by {{ powerby }} "
coding
Go執(zhí)行文件
package main?import ( "ansible/ansible" "fmt")?func main() { result, ok := ansible.RunPlayBook("/data/apps/python3/bin/ansible-playbook", "/etc/ansible/hosts", "/data/ansible/test.yaml", []string{ "hosts=127.0.0.1", "powerby=Golang", }) if ok { fmt.Println("執(zhí)行成功") } else { fmt.Println("執(zhí)行失敗") } fmt.Println(result)}?
執(zhí)行輸出
執(zhí)行成功/data/apps/python3/bin/ansible-playbook --ssh-common-args='-o StrictHostKeyChecking=no' -i /etc/ansible/hosts /data/ansible/test.yaml -e hosts=127.0.0.1 -e powerby=Golang [WARNING]: Found variable using reserved name: hosts?PLAY [測試ansible任務] *************************************************************?TASK [hostname] ****************************************************************changed: [127.0.0.1]?TASK [echo] ********************************************************************ok: [127.0.0.1] => { "msg": "get hostname from {'cmd': ['hostname'], 'stdout': 'tosomeone', 'stderr': '', 'rc': 0, 'start': '2020-08-20 22:23:29.851614', 'end': '2020-08-20 22:23:29.852629', 'delta': '0:00:00.001015', 'changed': True, 'stdout_lines': ['linuxopcai'], 'stderr_lines': [], 'failed': False} by Golang "}?PLAY RECAP *********************************************************************127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0 ??=======================================開始時間:2020-08-20 22:23:28結束時間:2020-08-20 22:23:29耗時:1.067408099s
總結
golang
由于歷史原因,很多任務都還是ansible的任務,只能采用這種方式進行過度。
在Go的生態(tài)中,大家有什么推薦的批量自動化任務的包或者工具呢?
版權聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。