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实现的百度站长自动URL提交小工具
Jun 27 Python
Python中的super用法详解
May 28 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
windows下numpy下载与安装图文教程
Apr 02 Python
python定时任务 sched模块用法实例
Nov 04 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
Keras使用ImageNet上预训练的模型方式
May 23 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
python怎么提高计算速度
Jun 11 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
python获取命令行参数实例方法讲解
Nov 02 Python
python中24小时制转换为12小时制的方法
Jun 18 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
漫威DC即将合作联动,而双方早已经秘密开始
2020/04/09 欧美动漫
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
2017/03/30 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
python self,cls,decorator的理解
2009/07/13 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
python使用opencv进行人脸识别
2017/04/07 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python3实现高效的端口扫描
2019/08/31 Python
tensorflow之并行读入数据详解
2020/02/05 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
敬老院活动总结
2014/04/28 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
Golang 实现超大文件读取的两种方法
2021/04/27 Golang
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers