Ansible使用动态inventory

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"
}


猜你喜欢

转载自blog.csdn.net/u011244839/article/details/80070648