ansible2.4 源码分析-自定义inventory解析插件实现

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

通过上一篇文章,初步的分析了ansible2.4的一个运行流程,没有对 ansible 解析 source 的过程进行详细分析。本文通过分析 ansible 解析 source 并生成 inventory 对象的过程,从而进一步理解 inventory。

入口文件分析

解析 source 的入口函数为:parse_sources()。源文件位置:ansible/inventory/manager.py

host_list插件分析

host_list 源文件位置: ansible/plugins/inventory/host_list.py。如下:

解析类 InventoryModule 继承自 BaseInventoryPlugin,BaseInventoryPlugin 的源文件位置:ansible/plugins/inventory/__init__.py

super(InventoryModule, self).parse(inventory, loader, host_list) 的作用是初始化了 host_list 插件中的几个属性:

InventoryData 类分析

InventoryData 类主要作用是用来保存 inventory 的数据(主机,组)。源文件位置:ansible/inventory/data.py

首先来看 InventoryData 的源码(部分):

通过对以上源码的分析,可以知道解析 source 的整个过程就是实例化存储 groups 对象和 hosts 对象的 InventoryData 。

当 ansible 提供的默认解析插件都不能满足我们的条件的时候,就需要我们自定义插件。

比如通过cmdb接口获取到的 inventory 的格式如下:

{"group1":{"hosts":[{"ip":"192.168.100.101","port":22,"ansible_ssh_pass":"soft123"},{"ip":"192.168.100.102","port":22,"ansible_ssh_pass":"soft123"}]}}

注意:在2.0中ssh的参数有所改变,具体参考:http://docs.ansible.com/ansible/latest/intro_inventory.html

自定义解析插件 host_dict.py

确认插件的目录(C.DEFAULTINVENTORYPLUGIN_PATH)

默认为:~/.ansible/plugins/inventory:/usr/share/ansible/plugins/inventory

将插件脚本放到目录:~/.ansible/plugins/inventory

确认插件的名字(C.INVENTORY_ENABLED)

默认为:['host_list', 'script', 'yaml', 'ini']

要在 ansible 配置文件中定义,如下:

[inventory]

在 base.yml 中插件的格式为 list,此处如果有多个解析插件可以写成 pl,pl2 即可

enable_plugins = host_dict,host_list,script,yaml,ini

编写插件 host_dict.py

测试

使用上一篇文章中 ansible api 脚本来测试

可以看到如下的错误输出,说明需要密码:

将hosts改为如下形式,测试自定义解析插件脚本

hosts = '{"group1":{"hosts":[{"ip":"192.168.100.103","port":22,"ansiblesshpass":"soft123"},{"ip":"192.168.100.102","port":22,"ansiblesshpass":"soft123"}]}}'

再次运行脚本,可以正常执行并返回(结果太长这里就不贴了)。

参考:

官方文档:http://docs.ansible.com/ansible/latest/intro.html

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏栗霖积跬步之旅

springboot启动异常:java.lang.IllegalArgumentException: Could not resolve placeholder 'xxx.xxx.xxx' in va

在打包到服务器上时指定的配置文件命名会去查找对应的配置文件,发现不了,导致属性注入失败,最终导致tomcat启动失败。

17300
来自专栏行者常至

003.多线程-主线程、守护线程、用户线程的区别

守护线程: 主要是指 在进程中,为主线程提供一种通用服务的线程。 比如 gc线程 因为,主线程一旦结束或者销毁, 守护线程没有了守护对象, 也将同步进...

27940
来自专栏JavaEdge

Spring Security 实战 - Session管理管理

39530
来自专栏专业duilib使用+业余界面开发

SxsTrace工具使用方法

19650
来自专栏自动化测试实战

Git教程——撤销内容修改和版本回退

1.8K100
来自专栏linux系统运维

安装PHP5,安装PHP7

38780
来自专栏geekidea

Spring Boot项目使用maven-assembly-plugin根据不同环境打包成tar.gz或者zip

https://github.com/geekidea/spring-boot-assembly

26610
来自专栏散尽浮华

linux下的缓存机制及清理buffer/cache/swap的方法梳理

1)缓存机制介绍 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存...

57780
来自专栏nummy

python安装私有包

你想要安装一个第三方包,但是没有权限将它安装到系统Python库中去。 或者,你可能想要安装一个供自己使用的包,而不是系统上面所有用户。

13130
来自专栏Java技术分享

手把手教你用Mysql-Cluster-7.5搭建数据库集群

当你的业务到达一定的当量,肯定需要一定数量的数据库来负载均衡你的数据库请求,我在之前的博客中已经说明了,如何实现负载均衡,但是还有一个问题就是数据同步,因为负载...

55180

扫码关注云+社区

领取腾讯云代金券