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