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 多进程通信模块的简单实现
Feb 20 Python
Python读取网页内容的方法
Jul 30 Python
python中reduce()函数的使用方法示例
Sep 29 Python
Python实现学生成绩管理系统
Apr 05 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
Django csrf 验证问题的实现
Oct 09 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
python类的实例化问题解决
Aug 31 Python
python3连接kafka模块pykafka生产者简单封装代码
Dec 23 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
pandas分批读取大数据集教程
Jun 06 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实现删除指定目录下相关文件的方法
2014/10/20 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
2018/06/13 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
分析python切片原理和方法
2017/12/19 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
全球度假村:Club Med
2017/11/27 全球购物
高中微机老师自我鉴定
2014/02/16 职场文书
比赛主持人开场白
2015/05/29 职场文书
公司新员工欢迎词
2015/09/30 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记
Python基本知识点总结
2022/04/07 Python
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis