python3连接mysql获取ansible动态inventory脚本

作者:独孤清扬@AlbertCQY 时间:2024-01-19 23:13:54 

Ansible Inventory  介绍

Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚本获取主机列表,并按照 ansible 所要求的格式返回给 ansilbe 命令的。这部分一般会结合 CMDB 资管系统、云计算平台等获取主机信息。由于主机资源一般会动态的进行增减,而这些系统一般会智能更新。我们可以通过这些工具提供的 API 或者接入库查询等方式返回主机列表。

脚本地址:https://github.com/AlbertCQY/scripts/tree/master/ansible

脚本用法:README.txt

1、脚本用法

bestpay用户 cd /tools/scripts/ansible

python3.6 invscript.py -h

1)、查询某个分组中包含哪些主机,oracle_nj_all为inventory_group.py中的组名

python3.6 invscript.py --group oracle_nj_all

2)、查询所有

python3.6 invscript.py --list

3)、查询某分组主机中主机名,脚本也可以在play-book中使用-i指定inventory

ansible -i invscript.py mysql_nj_all -m shell -a “hostname”

2、更新数据库主机列表,sql中最好对ip进行去除空格并排序,否则可能会有warning

inventory_group.py中格式:

mygrp2就是ansible使用的组名

‘ssh_user':‘root' root用户代表连到目标主机的用户。如果ansible server主机的test用户和目标的root用户有互信,那么ansible脚本在test用户下执行。

例子如下:


mygrp2 = {‘sql':"""
select ‘1.1.3.8' as ips
union all
select ‘1.1.3.112' as ips
union all
select ‘1.1.3.113' as ips
“”",
‘ssh_user':‘root'}

部分脚本内容:


#!/usr/bin/env python
#-*- coding: UTF-8 -*-
# =========================================================================
"""
-- File Name : invscript.py
-- Purpose : 从mysql数据中动态获取主机列表,动态inventory,不用维护主机列表
-- Date : 2020/01
-- Author:陈晴阳
Vervisons:
-- 20200106 1.0,陈晴阳,实现了动态获取主机列表,按照默认互信方式获取主机信息。
-- 20200116 2.0,陈晴阳,增加--group参数,并统计各个分组主机个数;重构了group_all 所有主机按照各组设置的互信用户来抓信息;增加对IP地址排序功能。
"""
# =========================================================================
import argparse
import sys
import json
import settings
import inventory_group as invgrp
from connect_mysql import Mysql_Conn
class DynamicInventory(object):
 def read_cli(self):
   parser = argparse.ArgumentParser()
   parser.add_argument('--host', nargs=1)
   parser.add_argument('--list', action='store_true')
   parser.add_argument('--group')
   self.options = parser.parse_args()
 def GetItemList(self):
   list_item = []
   for item in dir(invgrp):
     if not item.startswith("__"):
       list_item.append(item)
   return list_item
 def GetGrpList(self):
   list_grpinfo = []
   list_item = self.GetItemList()
   for item in list_item:
     itemcontent = getattr(invgrp, item)
     tmp_dic = {}
     tmp_dic[item] = itemcontent
     list_grpinfo.append(tmp_dic)
   return list_grpinfo
 def get_groups(self):
   hostgroups = self.GetGrpList()
   #allhost = []
   for hostdic in hostgroups:#hostgroup为字典
     for hostgroup in hostdic: #获取字典的key
       self.result[hostgroup] = {}
       v_sql = hostdic[hostgroup]['sql'] #获取sql
       v_ssh_user = hostdic[hostgroup]['ssh_user'] # 获取sql
       hosts = self.connection.execsql(v_sql)
       #print(hosts)
       # 构建每个分组
       grp_host_list = [host[0] for host in hosts]
       grp_host_list = sorted(grp_host_list, key=lambda x: (int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2]))) #排序
       self.result[hostgroup]['hosts'] = grp_host_list
       self.result[hostgroup]['vars'] = {'ansible_ssh_user': v_ssh_user}
       #构建_meta,注意ip为元组,需要做个小转换ip[0] 需要字符串值
       for ip in hosts:
         tmp_dic = {}
         tmp_dic['ansible_ssh_host'] = ip[0]
         self.result['_meta']['hostvars'][ip[0]] = tmp_dic
   # 构建group_all
   self.result[self.defaultgroup]['hosts']=[]
   self.result[self.defaultgroup]['children'] =self.GetItemList()
   return self.result
 def get_host(self,ipaddr):
   ip = ''
   for i in ipaddr:
     ip = i
   data = {'ansible_ssh_host': ip}
   return data
 def get_group_hosts(self,grpname):
   if grpname == 'group_all':
     allhosts = []
     #查询出来所有的主机列表
     hostgroups = self.GetGrpList()
     for hostdic in hostgroups: # hostgroup为字典
       for hostgroup in hostdic: # 获取字典的key
         v_sql = hostdic[hostgroup]['sql'] # 获取sql
         hosts = self.connection.execsql(v_sql)
         allhosts.extend([host[0] for host in hosts])
     allhosts = set(allhosts) # 去重
     allhosts = sorted(allhosts, key=lambda x: (int(x.split('.')[0]), int(x.split('.')[1]), int(x.split('.')[2]))) #排序
     cnt = 0
     for i in allhosts:
       print(cnt + 1, i)
       cnt = cnt + 1
     print('Group ' + grpname + ' Total hosts:', cnt)
   else:
     txt_grp ='invgrp.'+grpname+"""['sql']"""
     v_sql = eval(txt_grp) #这里偷懒用了 * 函数eval
     hosts = self.connection.execsql(v_sql)
     cnt = 0
     for i in hosts:
       print(cnt + 1,i[0])
       cnt = cnt + 1
     print('Group '+grpname+' Total hosts:',cnt)
 def __init__(self):
   try:
     self.connection = Mysql_Conn(settings.my_usr, settings.my_pass, settings.my_ip, settings.my_port, settings.my_db)
   except Exception as err:
     print("connect wrong", err)
   self.defaultgroup = 'group_all'
   self.options = None
   self.read_cli()
   self.result = {}
   self.result[self.defaultgroup] = {}
   self.result[self.defaultgroup]['hosts'] = []
   self.result[self.defaultgroup]['vars'] = {'ansible_ssh_user': 'bestpay'}
   self.result['_meta'] = {}
   self.result['_meta']['hostvars'] = {}
   if self.options.host:
     data = self.get_host(self.options.host)
     print(json.dumps(data,indent=4))
   elif self.options.list:
     data = self.get_groups()
     print(json.dumps(data,indent=4))
   elif self.options.group:
     data = self.get_group_hosts(self.options.group)
   else:
     sys.exit("usage: --list or --host HOSTNAME or --group GROUPNAME")
if __name__ == '__main__':
 DynamicInventory()

总结

以上所述是小编给大家介绍的python3连接mysql获取ansible动态inventory脚本网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://blog.csdn.net/u010033674/article/details/104005394

标签:python,连接,mysql,ansible,inventory
0
投稿

猜你喜欢

  • Python3 pip3 list 出现 DEPRECATION 警告的解决方法

    2021-02-24 10:21:59
  • Python笔试面试题小结

    2022-07-17 12:51:23
  • 5个很好的Python面试题问题答案及分析

    2023-05-12 18:45:23
  • Python Merge函数原理及用法解析

    2021-10-02 00:16:11
  • postman和python mock测试过程图解

    2022-02-19 00:59:57
  • Python字符串切片操作知识详解

    2022-05-17 07:04:35
  • 使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序

    2008-09-29 12:32:00
  • 从np.random.normal()到正态分布的拟合操作

    2023-09-09 18:00:01
  • 如何获得刚插入数据库的记录的ID号?

    2009-09-10 11:33:00
  • sql注入与转义的php函数代码

    2023-07-16 11:20:15
  • Python中隐藏的五种实用技巧分享

    2023-08-23 15:12:05
  • Python导入数值型Excel数据并生成矩阵操作

    2023-05-15 16:59:24
  • 浅谈keras使用预训练模型vgg16分类,损失和准确度不变

    2021-05-25 18:23:40
  • JS实现标签滚动切换效果

    2023-08-24 00:35:37
  • 基于Python中求和函数sum的用法详解

    2022-12-05 23:26:18
  • Go如何实现HTTP请求限流示例

    2023-07-21 00:40:27
  • 为什么要进行CSS缩写?

    2007-10-29 12:56:00
  • Python实现K-means聚类算法并可视化生成动图步骤详解

    2021-06-20 23:10:40
  • MSMQ微软消息队列详解

    2024-05-03 15:32:00
  • python 提取文件的小程序

    2023-02-08 15:43:39
  • asp之家 网络编程 m.aspxhome.com