腳本原子化設計理念 運維的目標:運維當中重覆著大量相同相似的工作,機器規模數量一上來,則需要考慮自動化運維,儘量做到第一次人工處理,後面都依賴腳本或者工具和WEB化來完成。這樣編寫shell、python腳本變得非常重要,不僅可以替代很多重覆工作,而且提高效率和減少人工失誤率,我建議即使公司只有10 ...
腳本原子化設計理念
運維的目標:運維當中重覆著大量相同相似的工作,機器規模數量一上來,則需要考慮自動化運維,儘量做到第一次人工處理,後面都依賴腳本或者工具和WEB化來完成。這樣編寫shell、python腳本變得非常重要,不僅可以替代很多重覆工作,而且提高效率和減少人工失誤率,我建議即使公司只有10台伺服器,最低標準也要腳本化。然而我發現工作中很多運維人員編寫出來的腳本質量太差,並且每個腳本都在重覆很多代碼,用資料庫名詞來說就叫做冗餘,這樣觸發我寫該文章的目的,設計腳本原子化(該名詞由騰訊某位大牛提出來的)
一、設計初衷
1. 運維在日常的工作中可能會寫很多腳本來完成特定的一些功能,比如運維A寫個版本發佈的代碼,裡面會有文件推送的邏輯,運維B想實現一個遠程腳本執行的功能,可能在他的代碼里也有文件推送的邏輯。在沒有引入原子化設計的概念下,運維人員用各自的方式來實現文件推送這塊的邏輯。這樣一來工作效率會很低,運維人員都在重覆的造輪子,而且這個輪子只適合他自己的業務場景
2. 在引入原子化設計後,我們儘量將腳本的一些常用邏輯抽出來,做成一個公用的模塊,這個模塊就可以成為一個原子。有了原子,運維不用再關心這些基礎的模塊怎麼去實現,而是只關心上層的邏輯,當他需要一個基礎功能時,只需要去原子資源池裡找,找到後然後調用這個原子即可。
這樣設計有以下方面的好處:
(1).提高運維開發效率
運維不需要再從頭到尾寫他的邏輯代碼了,而是轉而去資源池找他需要的原子,然後再把這些原子拼接起來。
(2).腳本充分解耦
因為腳本是一個個原子組成的,出現時易於排查。
二、原子化設計規範
所謂腳本原子,就相當於是一個腳本(如:python),完成一個特定的功能。用戶不用關心裡面的邏輯是什麼樣的,只需要知道這個原子是乾什麼的,然後向這個原子傳入事先約定好的參數(類型API),然後根據原子的輸出來判斷原子的執行狀態。
Demo:
1.編寫原子腳本
cat push_fle.py
該原子實現了一個文件推送的功能,它需要用戶提供三個參數,源文件路徑、目的文件路徑、推送的機器,返回的結果是一個字典,包括狀態碼、正確信息、錯誤信息。
2.原子調用
運維調用原子建議用python來實現。因為shell在調用python腳本時是作為該shell腳本的子進程出現的,如果原子異常退出,shell腳本還是會往下執行的,而且shell在調用python腳本時對它的返回結果也不好獲取