Ansible Inventory实际上是包含静态Inventory和动态Inventory两部分,静态Inventory指的是在文件/etc/ansible/hosts中指定的主机和组,动态Inventory指通过外部脚本获取主机列表,并按照ansible所要求的格式返回给ansilbe命令的。这部分一般会结合CMDB资管系统、zabbix监控系统、crobble安装系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的API或者接入库查询等方式返回主机列表。
比如为了结合资产管理系统(CMDB),所以要使用到动态获取inventory的方法,这样可以省去配置ansible服务端的hosts,所有的客户端IP,帐号,密码,端口都可以从CMDB中获取到。
怎么写一个自己的数据源?
很简单!我们仅仅需要写一个在适当参数下,能够返回正确JSON格式数据的脚本或者程序,你可以使用任何语言来实现。
注意,动态inventory脚本必须支持如下两个命令行参数(新本版ansible好像有其中一个就行):
–host :(用来列出主机的详细信息)
–list :(用来列出群组)
脚本如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/env python3.5 #coding:utf8 import json import sys def group():     host1 = ['10.10.0.112']     host2 = ['10.10.0.112','10.10.0.109']     group1 = 'test1'     group2 = 'test2'     hostdata = {         group1:{"hosts":host1},         group2:{"hosts":host2}     }     print(json.dumps(hostdata,indent=4)) if len(sys.argv) == 2 and (sys.argv[1] == '--list'):     group() else:     print("Usage: %s --list" % sys.argv[0])     sys.exit(1) | 
注:
1、主机部分必须是列表格式的;
2、hostdata行,其中的”hosts” 部分可以省略,但如果使用时,必须是”hosts” ,不能是其他如‘‘hostlist’’ 等字符串。
执行结果如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ python inventory.py --list {     "test1": {         "hosts": [             "10.10.0.112"         ]     },     "test2": {         "hosts": [             "10.212.52.16",             "10.212.52.14"         ]     } } | 
测试ansible(脚本需要可执行权限,可别忘了,chmod a+x inventory.py):
| 1 2 3 4 | $ ansible -i inventory.py test1 -m command -a 'uptime' -u 'root' -k SSH password:  10.10.0.112 | SUCCESS | rc=0 >>  04:43:31 up 93 days, 18:30,  3 users,  load average: 0.00, 0.01, 0.05 | 
下面提供一个支持all、group、host的脚本,可以自己进行修改:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #!/usr/bin/env python3.5 #coding:utf8 import json import sys def all():     info_dict = {     "all":[         "10.10.0.109",         "10.10.0.112"]     }     print(json.dumps(info_dict,indent=4)) def group():     host1 = ['10.10.0.112']     host2 = ['10.10.0.112','10.10.0.109']     group1 = 'test1'     group2 = 'test2'     hostdata = {         group1:{"hosts":host1},         group2:{"hosts":host2}     }     print(json.dumps(hostdata,indent=4)) def host(ip):     info_dict = {         "10.10.0.112": {             "ansible_ssh_host":"10.10.0.112",             "ansible_ssh_port":22,             "ansible_ssh_user":"root",             "ansible_ssh_pass":"123457"         },         "10.10.0.109": {             "ansible_ssh_host":"10.10.0.109",             "ansible_ssh_port":22,             "ansible_ssh_user":"root",             "ansible_ssh_pass":"xxxx"         }     }     print(json.dumps(info_dict,indent=4)) if len(sys.argv) == 2 and (sys.argv[1] == '--list'):     group() elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):     host(sys.argv[2]) else:     print("Usage: %s --list or --host <hostname>" % sys.argv[0])     sys.exit(1) | 
有其他需求或者高级用法,自己参考下面两篇文档即可:
http://www.linuxyw.com/749.html
http://www.ansible.com.cn/docs/developing_inventory.html#inventory-script-tuning





