完整代碼已經在github開源:github.com/CTC-maxiao/…linux
在使用ansible構建咱們團隊的自動化運維體系時,咱們遇到了一些沒法解決的問題:git
因此我決定重複造一次輪子,寫一個簡單的類ansible的自動化運維工具,而且可以解決上面這些問題。github
經過觀察ansible的playbook格式和ansible.cfg,我猜想ansible最終是把輸入的yaml文件中的信息和ansible.cfg中的信息組合成一個最終的執行字典,做爲程序的輸入。每個task都構造出一個執行字典來。我根據個人需求,構造出如下的字典格式:shell
{
task_name: #task的名稱
task_host: #執行task的機器,默認是playbook中設定的host,若是有設定delegate_to就覆蓋這個參數
become: #是否切換用戶(yes/no)
become_method: #切換用戶方式
become_user: #切換爲哪一個用戶
become_pwd: #切換密碼
ssh_user: #ssh到host的用戶
ssh_pwd: #ssh到host的用戶密碼
ssh_port: #ssh的端口
register: #將運行結果保持到設定的變量中
action_type: #task要執行的操做類型,好比shell/copy/slack等
action: #具體的action或action的參數
}
複製代碼
參考ansible playbook的設計。json
設計config文件爲json格式,方便讀取和後續操做:windows
{
ssh_port: 22
become: yes
become_method: su
become_user: root
become_pwd_same_as_ssh: no
}
複製代碼
首先程序讀取config文件中的設置填入字典,而後程序讀取yaml文件中的設置修改字典,最後根據輸入的密碼填寫密碼字段。這樣就成功構造出了task的執行字典。安全
將構造好的執行字典傳入運行task程序。運行task程序ssh登陸到遠程主機,執行become參數設置的用戶切換後,執行action參數設置的操做。而後將結果輸出到register設置的變量中,返回到主程序。bash