Ansible不仅可以通过默认的hosts文件获取主机清单,也可以通过外部脚本文件动态管理和获取主机信息。存放主机信息的外部脚本文件可以使用python、PHP等语言进行编写,其运行结果返回的必须为JSON串,Ansible会对JSON格式的字符串进行解析,并最终将其转化为Ansible可用的Inventory文件格式。所以,所谓的动态inventory文件脚本开发,其实就是编写脚本根据具体环境将主机信息及关系(这些数据可用通过抓取数据库,调用外部API或者直接读取文件获得)以JSON格式表示出来,并将其作为脚本输出结果传给Ansible。此处给出形式为如下hosts主机清单的python脚本(其中192.168.13.5是连接不到的):
[group1] 127.0.0.1 [group2] 192.168.13.128 192.168.13.5 [group2:vars] ansible_ssh_port=5555 ansible_connection=ssh
# hostlist.py #!/usr/bin/python #coding = utf-8 import json group1 = 'group1' group2 = 'group2' hosts1 = ['127.0.0.1'] hosts2 = ['192.168.13.128', '192.168.13.5'] vars = {'ansible_ssh_port': 22, 'ansible_connection': 'ssh'} hostdata = {group1:{"hosts": hosts1}, group2:{"hosts": hosts2, "vars": vars}} print(json.dumps(hostdata, indent=4))
执行脚本:
[root@localhost /home/***/***_test/ansible_test]# python hostlist.py { "group1": { "hosts": [ "127.0.0.1" ] }, "group2": { "hosts": [ "192.168.13.128", "192.168.13.5" ], "vars": { "ansible_ssh_port": 5555, "ansible_connection": "ssh" } } }
使用Ansible进行测试:
[root@localhost /home/***/***_test/ansible_test]# ansible -i hostlist.py group1 -m ping 127.0.0.1 | SUCCESS => { "changed": false, "ping": "pong" } [root@localhost /home/***/***_test/ansible_test]# ansible -i hostlist.py group2 -m ping 192.168.13.5 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.13.5 port 22: No route to host\r\n", "unreachable": true } 192.168.13.128 | SUCCESS => { "changed": false, "ping": "pong" }