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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mwangblog

Linux中的管道命令(一)

1754
来自专栏程序员互动联盟

【专业技术】C语言EOF如何使用?

存在问题: 又一次遇到有人问EOF的用法,到底如何来使用那? 解决方案: 这里有一篇文章写的不错,希望对EOF没有理解的同学能有所帮助。 我学习C语言的时候,遇...

3888
来自专栏dizhiling专栏

一行命令实现cpu占用率100%

cat /proc/cpuinfo |grep "physical id" | wc -l 可以获得CPU的个数, 我们将其表示为N.

1201
来自专栏CaiRui

Python之简单的用户登录和注册

#!/bin/bash/env python # -*- coding:utf-8 -*- def login(username,password): ...

28610
来自专栏闵开慧

mapreduce主程序如何传递变量到map或者reduce函数中使用

    一般我们写的mapreduce主程序放在客户端机器上,执行任务时是在集群机器上,所以要将变量从主程序传递到我们自己写的map或者reduce函数中就不能...

4135
来自专栏各种机器学习基础算法

php链式操作的实现

一、什么是链式操作? 直接说链式操作,也许大家不清楚是什么,但是在平时使用框架的过程中,大家肯定见到过这样子的使用: $db->where()->limit()...

3587
来自专栏企鹅号快讯

Python模块

Python模块 可以将代码量较大的程序分割成多个有组织的、彼此独立但又能相互交互的代码片段,这些自我包含的有组织的代码段就是模块 模块在物理形式上表现为以.p...

2347
来自专栏Python小屋

Python多线程编程中daemon属性的作用

在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一: 如果某个子线程的daem...

3405
来自专栏云霄雨霁

了解Jalangi2

1240
来自专栏Python小屋

Python导入标准库和扩展库对象的几种方式

Python中的对象大概可以分为三类:内置对象、标准库对象和扩展库对象。其中内置对象是直接编译进解释器的可以直接使用,没有对应的Python源代码;标准库对象是...

5248

扫码关注云+社区

领取腾讯云代金券