從0開始實現自動化運維工具(一)

完整代碼已經在github開源:github.com/CTC-maxiao/…linux

項目背景

在使用ansible構建咱們團隊的自動化運維體系時,咱們遇到了一些沒法解決的問題:git

  • 只有一臺windows堡壘機可以訪問到全部的linux主機,其餘全部linux機器網絡沒法互通。而ansible控制端只能安裝在linux平臺上。
  • 咱們linux機器爲了安全,沒法經過root用戶ssh到機器上。只能經過我的帳號ssh到機器上後使用我的密碼切換到root用戶,也就是說咱們不知道root用戶的密碼。因此咱們也沒法使用ansible的become功能來切換用戶。
  • ansible在一個task中切換用戶成功後,在下一個task還須要再次切換,沒法維持一個登陸session。

因此我決定重複造一次輪子,寫一個簡單的類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的參數
}
複製代碼

yaml文件格式的設計

參考ansible playbook的設計。json

config文件格式的設計

設計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程序。運行task程序ssh登陸到遠程主機,執行become參數設置的用戶切換後,執行action參數設置的操做。而後將結果輸出到register設置的變量中,返回到主程序。bash

相關文章
相關標籤/搜索