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常用内置模块之xml模块(详解)
May 23 Python
django中的setting最佳配置小结
Nov 21 Python
python使用mysql的两种使用方式
Mar 07 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
Python操作MySQL数据库的方法
Jun 20 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
解决flask接口返回的内容中文乱码的问题
Apr 03 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
python的json包位置及用法总结
Jun 21 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
详解Python中的进程和线程
Jun 23 Python
利用Python实现模拟登录知乎
May 25 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
php学习之 循环结构实现代码
2011/06/09 PHP
PHP数组相关函数汇总
2015/03/24 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
开启BootStrap学习之旅
2016/05/04 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
python提示No module named images的解决方法
2014/09/29 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
python ---lambda匿名函数介绍
2019/03/13 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Python实现括号匹配方法详解
2020/02/10 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
python如何爬取网页中的文字
2020/07/28 Python
Python使用xpath实现图片爬取
2020/09/16 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
电子信息工程专业推荐信
2014/02/14 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
学习教师法的心得体会
2014/09/03 职场文书
简单租房协议书
2014/10/21 职场文书
2014年班组工作总结
2014/11/20 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers