如何将MySQL查询结果按status分组存入Python字典(Ansible场景)
解决Ansible动态清单:从MySQL按status分组主机IP的问题
没问题,我来帮你搞定这个需求!核心就是从MySQL查询数据后按status值分组IP,再把这个结构转化为Ansible能识别的动态清单格式,我给你一步步拆解:
1. 先装MySQL Python驱动
首先确保你的环境能连接MySQL,推荐用pymysql,执行安装命令:
pip install pymysql
2. 编写Python脚本实现分组与清单生成
下面是完整的脚本,你只需要替换自己的MySQL连接信息和表名即可:
#!/usr/bin/env python3 import pymysql import json def get_mysql_hosts(): # 替换成你的MySQL实际配置 db_config = { 'host': '你的MySQL主机地址', 'user': '数据库用户名', 'password': '数据库密码', 'database': '目标数据库名', 'charset': 'utf8mb4' } # 初始化分组字典,用来存status对应的IP列表 status_groups = {} try: # 建立数据库连接 conn = pymysql.connect(**db_config) cursor = conn.cursor() # 查询IP和status数据 query = "SELECT Ip, status FROM 你的表名;" cursor.execute(query) results = cursor.fetchall() # 遍历查询结果,按status分组IP for ip, status in results: # 如果当前status还没在字典里,先初始化空列表 if status not in status_groups: status_groups[status] = [] status_groups[status].append(ip) finally: # 确保数据库连接关闭 if conn: conn.close() return status_groups def build_ansible_inventory(status_groups): # 把分组字典转化为Ansible动态清单的标准格式 inventory = {} # 给每个status创建对应的分组,比如status_21、status_23 for status, hosts in status_groups.items(): group_name = f"status_{status}" inventory[group_name] = { 'hosts': hosts } # 添加_meta字段,避免Ansible重复查询主机信息,提升性能 inventory['_meta'] = { 'hostvars': {} } return inventory if __name__ == '__main__': # 获取分组数据 groups = get_mysql_hosts() # 生成并输出符合要求的JSON格式清单 inventory = build_ansible_inventory(groups) print(json.dumps(inventory, indent=2))
3. 配置为Ansible动态清单
- 给脚本添加执行权限:
chmod +x mysql_inventory.py
- 测试脚本是否正常输出:
./mysql_inventory.py
你会看到类似这样的JSON输出(就是你要的分组结构,适配Ansible格式):
{ "status_23": { "hosts": [ "1.1.1.1", "3.3.3.3", "4.4.4.4" ] }, "status_21": { "hosts": [ "2.2.2.2", "5.5.5.5" ] }, "_meta": { "hostvars": {} } }
- 在Ansible中使用这个清单:
ansible status_21 -i mysql_inventory.py -m ping
额外提示
如果需要给特定主机添加变量(比如ssh端口、用户名),可以在build_ansible_inventory函数的hostvars里补充,比如:
inventory['_meta']['hostvars']['2.2.2.2'] = { 'ansible_ssh_port': 2222, 'ansible_user': 'admin' }
内容的提问来源于stack exchange,提问作者Diler Singh
相关产品推荐
相关产品推荐

