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脚本来实现最简单的FTP下载的教程
May 04 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
python中数据爬虫requests库使用方法详解
Feb 11 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
Python属性和内建属性实例解析
Jan 14 Python
使用python3 实现插入数据到mysql
Mar 02 Python
Django中的AutoField字段使用
May 18 Python
浅谈tensorflow 中的图片读取和裁剪方式
Jun 30 Python
python实现感知机模型的示例
Sep 30 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
Python使用openpyxl批量处理数据
Jun 23 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删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
DOM 中的事件处理介绍
2012/01/18 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
js查找节点的方法小结
2015/01/13 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
vue.js表格分页示例
2016/10/18 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
基于python脚本实现软件的注册功能(机器码+注册码机制)
2016/10/09 Python
OpenCV实现人脸识别
2017/04/07 Python
python实现横向拼接图片
2020/03/23 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
大韩航空官方网站:Korean Air
2017/10/25 全球购物
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
French Connection官网:女装、男装及家居用品
2019/03/18 全球购物
临床医师专业个人自我评价
2014/01/08 职场文书
村居抓节水倡议书
2014/05/19 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
教师党员个人总结
2015/02/10 职场文书
毕业班工作总结
2015/08/10 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
安全生产协议书
2016/03/22 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
Redis数据同步之redis shake的实现方法
2022/04/21 Redis