Ansible作為老牌的自動化運維工具,由Python開發,應用廣泛,但其預設只提供了命令列下的使用方式,好在提供有完善的API支援二次開發,可以很方便的整合到我們的自動化運維繫統中
最近一個朋友跳槽到了新公司轉做DevOps開發,接到的第一個需求就是基於Ansible研發簡單的任務中心,而他欠缺相關經驗就找我幫忙,我就花了兩天時間從熟悉Ansible開始寫了個專案,由於我們的任務都是通過自研的一套自定義任務引擎Probius來實現的,之前從未正式用過Ansible,趁此機會也算是熟悉了
本篇文章只有思路沒有程式碼,主要幫助新手瞭解流程整理思路,從而更好的理解程式碼
思路整理
可以通過Web執行Ansible的Module和Playbook這是我們的目標,要實現這個目標我們要做哪些功能呢?我大概畫了個腦圖幫助整理思路
前端頁面
根據上邊的思路,我們來想一下都需要編寫哪些頁面,首先需要一個任務執行頁面,在這個頁面裡需要選擇是本次任務是執行module還是Playbook,如果是需要執行module,則需要使用者選擇具體的module和輸入引數,如果需要執行playbook,則需要使用者選擇具體的playbook和輸入引數,無論是執行module還是playbook,都需要確定在哪些主機上執行
通常情況下我們的主機資訊都是通過CMDB系統維護的,而對於任務的執行,大多也是針對專案或服務,所以對主機的選擇就轉換成了對專案或服務的選擇,選擇了專案服務就確定了執行主機,由此一個完整的任務執行頁面就確定了
上邊的頁面有兩個下拉選擇框,其一是專案的選擇,我們通過選擇專案來確定執行的主機,這些資料需要去CMDB獲取,這就需要CMDB提供2個API,一個用來獲取專案服務的列表,供頁面上選擇,另外還需要一個根據專案服務查詢專案服務下主機列表的API,以確定任務要執行的主機列表
另外一個下拉框是playbook的選擇,這就需要另外一個playbook管理的頁面,管理playbook就需要進行增刪改查,一個簡單的頁面如下
任務執行過程中需要一個實時展示日誌的頁面,可以及時的觀察任務執行過程中遇到的問題,點選執行按鈕直接跳轉到任務執行日誌頁面,觀察任務執行日誌
任務執行完成後還需要一個歷史任務的列表頁面,可以檢視所有歷史執行的任務,以及可以根據條件方便的過濾任務
簡單的幾個頁面就將整個流程清晰的展示了出來
後端邏輯
上邊講了前端頁面的設計思路,而後端的邏輯又是怎樣的,我們同樣從這幾個頁面入手思考
ansible執行頁面,當使用者點選提交按鈕的同時會將所選專案、所選模組/playbook,以及引數傳給後端,後端根據所選的專案獲取到專案下的主機,然後將主機、module/playbook、引數,以及任務建立時間、建立使用者等資訊寫入資料庫,同時呼叫AnsibleAPI非同步執行,最後跳轉到任務詳情頁面
AnsibleAPI執行過程中將日誌實時寫入快取,同時可以通過websocket推給任務詳情頁面,任務詳情頁面接受到資料之後展示,如果覺得使用websocket沒必要也可以像我一樣直接在任務詳情頁啟動一個迴圈,每秒請求日誌將更新追加到頁面上,在任務執行完成後,將快取資料寫入資料庫,這樣的好處是可以減少對資料庫的讀寫,提高效率,整個流程大概如下
以上是執行和任務詳情頁面的後端邏輯,而對於playbook和任務歷史兩個頁面就比較簡單了,就是普通的增刪改查而已,不過多介紹
後記
一個新專案在開始編寫程式碼之前就需要對這個專案有相對清晰的認識,在腦海裡過一下基本邏輯,這一步也可以藉助思維導圖來完成,然後搭框架填內容水到渠成