2016年2月23日,學習,分析ansible代碼
ansible是一種運維中使用的批量部署的工具,它本身是一種框架,具體的部署和架構分析,下面這篇文章講的不錯。
http://os.51cto.com/art/201409/451927_all.htm
首先分析主文件ansible,代碼和注釋如下:
1、 from __future__ import (absolute_import, division, print_function) 2、 __metaclass__ = type 3、 __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__模塊,把下一個新版本的特性導入到當前版本,於是我們就可以在當前版本中測試一些新版本的特性。詳見:
第二行感覺解釋挺復雜,可以參考這篇文章:
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”文件中
單獨寫篇文章分析: