Ansible可以灵活的匹配hosts文件的内容。hosts文件需要手动添加删除来维护其有效性,那么可以通过读取数据库服务器来动态的获取服务器,减少服务器列表的维护操作。
代码如下:python/dbhosts.py at main · laufei90/python (github.com)
现在就来编写python来读取mariadb数据库中的host信息。
数据库hosts表的结果如下:

动态获取服务器列表的脚本需要按ansible约定进行返回,用于生成 JSON 的脚本对实现语言没有要求,它可以是一个可执行脚本、二进制文件,或者其他任何可以运行文件,但是必须输出为 JSON 格式,同时必须支持两个参数:--list 和 --host <hostname>。
1、--list ,用于列出群组以及群组中的服务器。
2、--host=hostname ,列出某台服务器的具体信息。
那么可以使用argparse来解析命令行参数,运行接入如下所示:

现在我们来按模块解析各个功能。
1、argparse来解析命令行参数

2、字典转为json

3、list_all_hosts函数列出所有数据库
读取数据表hosts中的所有服务器类表信息,Python字典不支持重复键,简单的方法是使用defaultdict获得一个列表字典。

4、get_host_detail函数累出某台host具体信息
函数根据参数host来查询数据库,将读取到的信息根据类别存入detail字典中。

5、main主函数连接数据库并根据命令行参数返回数据
笔者使用PyMySQL来操作数据库 ,是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。在使用中需要import pymysql 。

为了让动态获取服务器列表的脚本功能应用在ansible中,需要为这个py文件添加可执行权限。
最后的测试如下:

网友评论