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”文件中
单独写篇文章分析: