脚本地址: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_Connclass 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_itemdef GetGrpList(self):list_grpinfo = []list_item = self.GetItemList()for item in list_item:itemcontent = getattr(invgrp, item)tmp_dic = {}tmp_dic[item] = itemcontentlist_grpinfo.append(tmp_dic)return list_grpinfodef get_groups(self):hostgroups = self.GetGrpList()#allhost = []for hostdic in hostgroups:#hostgroup为字典for hostgroup in hostdic: #获取字典的keyself.result[hostgroup] = {}v_sql = hostdic[hostgroup]['sql'] #获取sqlv_ssh_user = hostdic[hostgroup]['ssh_user']  # 获取sqlhosts = 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_listself.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_allself.result[self.defaultgroup]['hosts']=[]self.result[self.defaultgroup]['children'] =self.GetItemList()return self.resultdef get_host(self,ipaddr):ip = ''for i in ipaddr:ip = idata = {'ansible_ssh_host': ip}return datadef get_group_hosts(self,grpname):if grpname == 'group_all':allhosts = []#查询出来所有的主机列表hostgroups = self.GetGrpList()for hostdic in hostgroups:  # hostgroup为字典for hostgroup in hostdic:  # 获取字典的keyv_sql = hostdic[hostgroup]['sql']  # 获取sqlhosts = 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 = 0for i in allhosts:print(cnt + 1, i)cnt = cnt + 1print('Group ' + grpname + ' Total hosts:', cnt)else:txt_grp ='invgrp.'+grpname+"""['sql']"""v_sql = eval(txt_grp) #这里偷懒用了邪恶函数evalhosts = self.connection.execsql(v_sql)cnt = 0for i in hosts:print(cnt + 1,i[0])cnt = cnt + 1print('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 = Noneself.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相关推荐

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

    Ansible Inventory 是包含静态 Inventory 和动态 Inventory 两部分的,静态 Inventory 指的是在文件中指定的主机和组,动态 Inventory 指通过外部脚 ...

  2. python3连接mysql,python3连接MySQL数据库实例详解

    本文实例为大家分享了python3连接MySQL数据库的具体代码,供大家参考,具体内容如下 #python3连接MySQL实例 import pymysql """导入连 ...

  3. python3连接mysql_第七篇:Python3连接MySQL

    第七篇:Python3连接MySQL 连接数据库 注意事项 在进行本文以下内容之前需要注意: 你有一个MySQL数据库,并且已经启动. 你有可以连接该数据库的用户名和密码 你有一个有权限操作的data ...

  4. Python3连接MySQL

    Python3连接MySQL 注意事项:cursor()方法用来创建一个光标对象,用来操作增删改查,cursor.execute(sql,[a,b]).    参数写成可迭代对象,例如:元组.列表.防 ...

  5. Ansible动态Inventory格式

    Ansible可从服务器接口获取动态Inventroy配置 动态Inventory格式如下: {"group1": {"hosts": ["host1 ...

  6. python3连接mysql使用mysqldb_Python3 连接Mysql数据库

    初学Python ,目前无论是电子书还是网上的教程,都是针对于python2.7,但是对于部分语法以及模块都有变化. 比如 urllib2是python自带的模块,不需要下载.urllib2在pyth ...

  7. ubuntu python3 mysql_ubuntu14.04 python3.*连接mysql

    先下载pymysql文件,http://webscripts.softpedia.com/script/Database-Tools/PyMySQL-71606.html 我下载的是:PyMySQL- ...

  8. python3连接mysql数据库_python3.4连接mysql数据库

    1.print ("zjc");打印字符串 //需要添加(),变量如a = 1,b = "zjc",a = 1 其中可以通过id(a)查询a在内存的地址. 2. ...

  9. ansible动态inventory里的针对AWS中国的设置

    如果你想使用ansible来动态管理AWS里的机器和设施,不幸的你用的是国内的AWS服务,你会发现一开始怎么用例子里的ec2.py都会报错说 AWS_ACCESS_KEY_ID 和 AWS_SECRE ...

最新文章

  1. pyqt5动态添加按钮
  2. 缩小sql server 日志文件
  3. C指针原理(21)-C指针基础-ATT汇编
  4. 零基础带你快速入门Ribbon技术(浅显易懂、小白都能看懂)
  5. VTK:图片之PickPixel2
  6. 怎么看python程序卡在哪里_Python程序卡住了
  7. java条件运算符类型转换_Java运算符,条件表达式,类型转换
  8. struts2 jsp跳转action 404_Struts2 学习笔记(三)
  9. 【原】相煎何太急——input的blur事件与button的click事件
  10. Linux下查看显卡PCIE速率x16x8x4及设定
  11. [Ynoi2012]D1T3
  12. 【Qt开发】StyleSheet使用总结
  13. 大数据学习入门规划?
  14. 【017】基于vue.js的网易云web端(实现播放、登录)(Node接口实现)
  15. 两个点 定位_智造讲堂:RFID定位导航技术
  16. 一文了解 Serverless 究竟是什么
  17. 升级iOS13后悔怎么办?手把手教你iOS系统降级,只要简单几步就可以!
  18. 前端之CSS篇(四)——CSS浮动详解
  19. 如何查找python各种路径
  20. 《他们创造了数学》——哥德巴赫 演讲稿

热门文章

  1. Dev c++一些调试方法
  2. 树莓派4b安装windows iot_树莓派4B基于python3安装opencv4全教程
  3. c++tcp接收文件缓存多大合适_linux高性能网络编程之tcp连接的内存使用
  4. Leetcode每日一题:16.3sum-closest(最接近的三数之和)
  5. 经典排序算法总结与Python实现(上)
  6. 花书+吴恩达深度学习(六)优化方法之 Mini-batch(SGD, MBGD, BGD)
  7. 机器学习-吴恩达-笔记-5-神经网络学习
  8. 【差分约束】POJ3159/LG P1993 小K的农场
  9. 获取Button脚本挂载的事件名
  10. 下载网络图片显示在Android手机上