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


Posted in Python onJanuary 19, 2020

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 相关文章推荐
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
Python中实现对list做减法操作介绍
Jan 09 Python
Python实现计算两个时间之间相差天数的方法
May 10 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
PyQt5 加载图片和文本文件的实例
Jun 14 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
Python散点图与折线图绘制过程解析
Nov 30 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
Mar 01 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
解决jupyter notebook 出现In[*]的问题
Apr 13 Python
基于Pycharm加载多个项目过程图解
Jan 19 #Python
使用Python脚本从文件读取数据代码实例
Jan 19 #Python
Python安装tar.gz格式文件方法详解
Jan 19 #Python
Python : turtle色彩控制实例详解
Jan 19 #Python
使用python 的matplotlib 画轨道实例
Jan 19 #Python
Python求平面内点到直线距离的实现
Jan 19 #Python
Python PyPDF2模块安装使用解析
Jan 19 #Python
You might like
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
浅谈Vue数据响应
2018/11/05 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
详解Python中的type和object
2018/08/15 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
Pycharm pyuic5实现将ui文件转为py文件,让UI界面成功显示
2020/04/08 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
高二地理教学反思
2014/01/24 职场文书
小学语文教学反思
2014/02/10 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
总经理年会致辞
2015/07/29 职场文书
2019年思想汇报
2019/06/20 职场文书
Python实现拼音转换
2021/06/07 Python