微信公众号:进击的大杂烩
通过上一篇文章,初步的分析了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
领取专属 10元无门槛券
私享最新 技术干货