You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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动态清单

  1. 给脚本添加执行权限:
chmod +x mysql_inventory.py
  1. 测试脚本是否正常输出:
./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": {}
  }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:00:59