python3连接mysql获取ansible动态inventory脚本
AnsibleInventory 介绍
AnsibleInventory是包含静态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.6invscript.py-h
1)、查询某个分组中包含哪些主机,oracle_nj_all为inventory_group.py中的组名
python3.6invscript.py--grouporacle_nj_all
2)、查询所有
python3.6invscript.py--list
3)、查询某分组主机中主机名,脚本也可以在play-book中使用-i指定inventory
ansible-iinvscript.pymysql_nj_all-mshell-a“hostname”
2、更新数据库主机列表,sql中最好对ip进行去除空格并排序,否则可能会有warning
inventory_group.py中格式:
mygrp2就是ansible使用的组名
‘ssh_user':‘root'root用户代表连到目标主机的用户。如果ansibleserver主机的test用户和目标的root用户有互信,那么ansible脚本在test用户下执行。
例子如下:
mygrp2={‘sql':""" select‘1.1.3.8'asips unionall select‘1.1.3.112'asips unionall select‘1.1.3.113'asips “”", ‘ssh_user':‘root'}
部分脚本内容:
#!/usr/bin/envpython #-*-coding:UTF-8-*- #========================================================================= """ --FileName:invscript.py --Purpose:从mysql数据中动态获取主机列表,动态inventory,不用维护主机列表 --Date:2020/01 --Author:陈晴阳 Vervisons: --202001061.0,陈晴阳,实现了动态获取主机列表,按照默认互信方式获取主机信息。 --202001162.0,陈晴阳,增加--group参数,并统计各个分组主机个数;重构了group_all所有主机按照各组设置的互信用户来抓信息;增加对IP地址排序功能。 """ #========================================================================= importargparse importsys importjson importsettings importinventory_groupasinvgrp fromconnect_mysqlimportMysql_Conn classDynamicInventory(object): defread_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() defGetItemList(self): list_item=[] foritemindir(invgrp): ifnotitem.startswith("__"): list_item.append(item) returnlist_item defGetGrpList(self): list_grpinfo=[] list_item=self.GetItemList() foriteminlist_item: itemcontent=getattr(invgrp,item) tmp_dic={} tmp_dic[item]=itemcontent list_grpinfo.append(tmp_dic) returnlist_grpinfo defget_groups(self): hostgroups=self.GetGrpList() #allhost=[] forhostdicinhostgroups:#hostgroup为字典 forhostgroupinhostdic:#获取字典的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]forhostinhosts] grp_host_list=sorted(grp_host_list,key=lambdax:(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]需要字符串值 foripinhosts: 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() returnself.result defget_host(self,ipaddr): ip='' foriinipaddr: ip=i data={'ansible_ssh_host':ip} returndata defget_group_hosts(self,grpname): ifgrpname=='group_all': allhosts=[] #查询出来所有的主机列表 hostgroups=self.GetGrpList() forhostdicinhostgroups:#hostgroup为字典 forhostgroupinhostdic:#获取字典的key v_sql=hostdic[hostgroup]['sql']#获取sql hosts=self.connection.execsql(v_sql) allhosts.extend([host[0]forhostinhosts]) allhosts=set(allhosts)#去重 allhosts=sorted(allhosts,key=lambdax:(int(x.split('.')[0]),int(x.split('.')[1]),int(x.split('.')[2])))#排序 cnt=0 foriinallhosts: print(cnt+1,i) cnt=cnt+1 print('Group'+grpname+'Totalhosts:',cnt) else: txt_grp='invgrp.'+grpname+"""['sql']""" v_sql=eval(txt_grp)#这里偷懒用了邪恶函数eval hosts=self.connection.execsql(v_sql) cnt=0 foriinhosts: print(cnt+1,i[0]) cnt=cnt+1 print('Group'+grpname+'Totalhosts:',cnt) def__init__(self): try: self.connection=Mysql_Conn(settings.my_usr,settings.my_pass,settings.my_ip,settings.my_port,settings.my_db) exceptExceptionaserr: print("connectwrong",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']={} ifself.options.host: data=self.get_host(self.options.host) print(json.dumps(data,indent=4)) elifself.options.list: data=self.get_groups() print(json.dumps(data,indent=4)) elifself.options.group: data=self.get_group_hosts(self.options.group) else: sys.exit("usage:--listor--hostHOSTNAMEor--groupGROUPNAME") if__name__=='__main__': DynamicInventory()
总结
以上所述是小编给大家介绍的python3连接mysql获取ansible动态inventory脚本,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。