首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ansible 2 Api 源码分析及实现

Ansible 2 Api 源码分析及实现

作者头像
企鹅号小编
发布2018-02-05 09:48:33
1.7K0
发布2018-02-05 09:48:33
举报
文章被收录于专栏:编程编程

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

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 全球大搜罗媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档