python3连接mysql获取ansible动态inventory脚本
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脚本,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对猪先飞网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
- 新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
深入研究mysql中的varchar和limit(容易被忽略的知识)
为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15- 这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05