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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。