2016年2月23日,學習,分析ansible代碼html
ansible是一種運維中使用的批量部署的工具,它自己是一種框架,具體的部署和架構分析,下面這篇文章講的不錯。python
http://os.51cto.com/art/201409/451927_all.htm架構
首先分析主文件ansible,代碼和註釋以下:框架
一、 from __future__ import (absolute_import, division, print_function) 二、 __metaclass__ = type 三、 __requires__ = ['ansible']
第一行引入了3個模塊,具體的做用以下運維
absolute_import 使用相對或絕對路徑來導入模塊,參考這篇文章: http://taoyh163.blog.163.com/blog/static/1958035620074111276292/函數
division 精確除法, 參考這篇文章: http://www.cnblogs.com/feixingfei/archive/2011/12/18/2297596.html工具
print_function 打印函數學習
這行中的__future__是python語法, 解釋以下:測試
Python提供了__future__模塊,把下一個新版本的特性導入到當前版本,因而咱們就能夠在當前版本中測試一些新版本的特性。詳見: ui
第二行感受解釋挺複雜,能夠參考這篇文章:
http://www.cnblogs.com/huangcong/archive/2011/08/28/2156307.html 3.2部分
第三行是判斷依賴庫,依賴文件都是在ansible這個目錄下面
try:
import pkg_resources
except Exception:
pass
原來代碼裏有英文解釋,說是引入這個包保證庫版本和路徑的準確,暫時這麼理解吧。
import os
import sys
import traceback
from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError
from ansible.utils.display import Display
from ansible.utils.unicode import to_unicode
引入了經常使用的包
class LastResort(object):
def display(self, msg):
print(msg, file=sys.stderr)
def error(self, msg, wrap_text=None):
print(msg, file=sys.stderr)
定義了一個類,最後輸出結果排序, 包含兩個方法display error。
if __name__ == ‘__main__’;
display = LastResort()
cli = None
me = os.path.basename(sys.argv[0])
進入主程序,display實例化LastResort這個類,
定義cli這個變量的值爲None
basename() 去掉目錄路徑, 返回文件名
sys.argv[]是用來獲取命令行參數的,sys.argv[0]表示代碼自己文件路徑;好比在CMD命令行輸入 「python test.py -help」,那麼sys.argv[0]就表明「test.py」。
也就是me的值就是執行文件的名稱
try:
display = Display()
Display 是一個類,前面已經引出過了,對這個類的代碼進行分析,該類定義在」ansible2.0/lib/ansible/utils/display.py」文件中
單獨寫篇文章分析: