Ansible 2 Api 源码分析及实现

微信公众号:进击的大杂烩

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171221G07JDD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券