微信公众号:进击的大杂烩
Ansible 2 API
ansible 2 API发生了很大的变化。
通过对ansible 2.4.2 的源代码(Python 环境为2.7.5)进行分析来学习如何使用ansible 2 api 并自己编写一个ansible api。
ansible 2.4.2 相对于 ansible 2.2.2 变化比较大的地方是 Inventory 类和解析 inventory 的方式。
我们分析ansible的AdHocCLI模式来了解ansible的运行过程。
入口文件分析:
入口文件:ansible 命令(通过which ansible命令来查看命令所在目录)
对源码进行了简化,只分析AdHocCLI模式相关的代码
通过以上简化的代码可以知道入口文件做了以下几件事情:
确定命令工具(AdHocCLI模式使用的是 ansible 命令)
定义sub,myclass变量
导入类AdHocCLI
mycli = getattr(__import__("ansible.cli.%s" % sub, fromlist=[myclass]), myclass)等同于
from ansible.cli import adhoc
mycli = adhoc.AdHocCLI
处理命令行编码格式(to_text)--用来统一编码格式(源码默认编码为utf-8)
实例化mycli类(cli = mycli(args))
通过解析器(cli.parse())来解析ansible命令行参数
运行cli(cli.run())
清理临时文件
退出命令行
AdHOCCLI 类分析
对应入口文件的mycli = getattr(__impor__("ansible.cli.%s" % sub, fromlist=[myclass]), myclass)
AdHOCCLI类--源码位置(ansible/cli/adhoc.py)
class AdHocCLI(CLI) 从CLI继承, mycli 通过 cli = AdHocCLI(args) 实例化,我们来看CLI类(源码位置ansible/cli/__init__.py)的初始化函数__init__():
注意在ansible/cli/init.py中有一个引入
from ansible import constants as C
constants中配置了ansible配置的选项和默认值--源码位置:ansible/constants.py
constants.py 也会将 ansible/conf/base.yml 中的配置一起加载到constants中
通过以下代码可以看到_init_的工作仅仅是做了一些参数的初始化
命令行参数解析函数
对应入口文件的cli.parse(),相关代码如下:
通过上面的baseparser代码段可以看出ansible对于参数的解析是通过python标准库operator来实现的。baseparser 函数的具体内容可以去源码看,就是一些参数个数和说明(ansible -h)
我们继续看parse()函数, super(AdHocCLI, self).parse()。可见调用了CLI类的parse()函数:
运行阶段--cli.run()
对应入口文件cli.run()
参数解析完成后,到了最关键的运行阶段--cli.run(),部分代码和代码执行流程如下:
定义通配符:pattern
加载所有模块--get_all_plugin_loaders():
作用是将模块 ansible.plugins.loader 中符合(isinstance(obj, PluginLoader))这个条件的加载器加载
语句:loader, inventory, variable_manager = self._play_prereqs(self.options)的作用是:生成加载器loader, inventory(实际工作就是将source解析成inventory对象), 变量管理器实例variable_manager
匹配目标hosts--hosts = inventory.list_hosts(pattern)
判断调用模块和模块参数是否合法
生成运行对象--运行的模块,参数(seconds参数对应ansible -B参数(后台运行长时任务),poll_interval对应ansible -P 表示对后台任务的轮询的间隔时间)
根据条件确定回调函数(ansible 命令返回结果的处理函数)
创建一个任务队列去运行paly(运行对象)
返回运行结果
主要来看一下生成 inventory 对象的过程,函数_play_prereqs代码和相关解析如下:
梳理运行流程
通过对代码的分析,根据这个流程自定义运行过程如下:
采用 ssh 的秘钥模式, 管理节点和被管理节点已经互信
常用的ansible参数为:
关键的inventory,从源码我们知道 inventory是通过InventoryManager类实现的:
hosts定义:
创建任务
根据任务创建运行对象
定义callback
启动任务
写成一个工具类
参考:
http://docs.ansible.com/ansible/latest/intro.html
http://docs.ansible.com/ansible/latest/dev_guide/developing_api.html#python-api-2-0
领取专属 10元无门槛券
私享最新 技术干货