ansible代码分析第一篇--主文件—ansible分析

时间:2023-03-09 07:12:35
ansible代码分析第一篇--主文件—ansible分析

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.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820023084e5263fe54fde4e4e8616597058cc4ba1000

第二行感觉解释挺复杂,可以参考这篇文章:

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”文件中

单独写篇文章分析: