ansible动态Inventory主机清单配置遇到的坑
坑1:动态主机清单配置,需要按照ansible的要求的格式返回给ansible命令的
源代码如下:
但是在ansible-playbook中使用动态主机配置文件的时候,发生了错误!!!
提示没有匹配的主机信息
分析:数据库已配置好,python脚本也能输出,问题在于输出的结果不是ansible想要的格式作为ansible的命令输入,因此排查如下
下面看下我的动态inventory输出的格式吧
[root@ansiblefang]#pythonansible_inventory.py--list
{
"all":[
"192.168.10.104"
]
}
[root@ansiblefang]#pythonansible_inventory.py--host192.168.10.104
{
"ansible_ssh_host":"192.168.10.104",
"ansible_ssh_user":"root",
"hostname":"clone-node1"
}
在网上找的方法,虽然实现了—list --host的输出,但是格式不满足ansible格式输出的要求,ansible需求的格式有哪些呢,请看解决办法中….
输出结果:
这是出错的信息,提示还是找不到主机的信息
[root@ansiblefang]#
ansible-playbook-iansible_inventory.pybb.yml运行出错
解决方法:
先说个知识点(ansible所要求的格式):
动态Inventory指通过外部脚本获取主机列表,并按照ansible所要求的格式返回给ansilbe命令的
因此,需要清楚ansible需要那种inventory的格式呢
必须输出为JSON格式
同时必须支持两个参数:--list和--host
--list:用于返回所有的主机组信息,每个组所包含的主机列表hosts、所含子组列表children、主机组变量列表vars都应该是字典形式的,_meta用来存放主机变量。
正确的输出格式是什么样子的呢,请看下面:
以下的是正确的动态inventory的输出格式,其中就是ansible的第三点要求每个组所包含的主机列表hosts、所含子组列表children、主机组变量列表vars都应该是字典形式的,_meta用来存放主机变量。
[root@ansiblefang]#vimtt.py
[root@ansiblefang]#pythontt.py
{
"group1":{
"hosts":[
"192.168.10.104"
]
},
"group2":{
"hosts":[
"192.168.10.103",
"192.168.13.5"
],
"vars":{
"ansible_ssh_port":22,
"ansible_connection":"ssh"
}
}
}
[root@ansiblefang]#
按照以上的格式,来编写我们的输出吧,
SQL表格内容如下:
我想要输出的json格式是这样的
{组名:{
hosts:[‘ip1','ip2'],
vars:{
“ansible_ssh_port”:22,
“ansilble_connection”:'ssh'
……….
}
}
}
脚本代码列出来了如下:
#_*_coding:utf-8_*_
__author__='fang'
importpymysql
importjson
importargparse
importsys
defexecude_sql(table):#定义一个执行SQL的函数
sql='select*from{0};'.format(table)
cur.execute(sql)#args即要传入SQL的参数
sys_result=cur.fetchall()
#index=cur.description
hostlist={}#放入主机清单的信息
foriinsys_result:
hostlist[i[2]]=[]
foriinsys_result:
hostlist[i[2]].append([i[1],i[5],i[6]])
host_lists=dict()
foriinhostlist.iteritems():
dict_item=dict()
forindexini[1]:
dict_item[index[0]]={'ansible_connection':index[1],'ansible_ssh_port':index[2]}
host_lists[i[0]]=dict_item
#printjson.dumps(host_lists,indent=4)
returnhost_lists
defgroup(data):
'''
allhostip
:paramdata:
:return:
'''
count_ip=dict()
count_ip['all']={}
count_ip['all']['hosts']=[]
index=[]
foriindata:
index.extend(data[i].keys())
count_ip['all']['hosts'].extend(list(set(index)))
printjson.dumps(count_ip,indent=4)
defhost(data,ip):
dict_host={}
foriindata:
ifdata[i].keys()==[ip]:
dict_host[i]={}
dict_host[i]['hosts']=[ip]
dict_host[i]['vars']=data[i][ip]
printjson.dumps(dict_host,indent=4)
break
if__name__=="__main__":
globalfile,con,cur#文件对象,连接和游标对象
#连接数据库
con=pymysql.connect('127.0.0.1','root','','ansible',charset='utf8')#连接数据库
cur=con.cursor()#定义一个游标
data=execude_sql('hosts_table')
#parser=argparse.ArgumentParser()#定义参数解析器
#获取参数的方法1:
#以下是参数解析器添加参数格式,有—list和—hostdest表示都可以通过args.list或者args.host来获取到可变参数的值,action中store_true表存储的是布尔值,当没有—list的时候默认false,当有—list的时候,但是没有值,默认则为true,help表示帮助时候提示的信息,argparse很好用,在这里恰当好处
#parser.add_argument('--list',action='store_true',dest='list',help='getallhosts')
#parser.add_argument('--host',action='store',dest='host',help='getsiglehost')
#args=parser.parse_args()
#ifargs.list:
#group(data)
#ifargs.host:
#host(data,args.host)
#获取参数的方法2:
iflen(sys.argv)==2and(sys.argv[1]=='--list'):
group(data)
eliflen(sys.argv)==3and(sys.argv[1]=='--host'):
host(data,sys.argv[2])
else:
print"Usage%s--listor--host"%sys.argv[0]
sys.exit(1)
坑2:动态inventory脚本要制定python的解释器,否则无法执行
问题分析:
Ansible-playbook–Iansbile_inventory.pybb.yml执行
提示:无法识别host,还是出现了问题
对比ansible要求的格式,没有差别,最后进行代码的比对,问题出现在脚本没有制定Python解释器,导致出现的问题
解决办法:
添加python解释器的路径
执行结果:
Yml文件
命令执行结果:
[root@ansiblefang]#ansible-playbook-iansible_inventory.pybb.yml
PLAY[192.168.10.104]*********************************************************************
TASK[debug]*********************************************************************
ok:[192.168.10.104]=>{
"msg":"thisistestblock"
}
TASK[file]*********************************************************************
ok:[192.168.10.104]
TASK[debug]*********************************************************************
ok:[192.168.10.104]=>{
"msg":"thisisalways"
}
PLAYRECAP*********************************************************************
192.168.10.104:ok=3changed=0unreachable=0failed=0
[root@ansiblefang]#pythonansible_inventory.py--host192.168.10.104
{
"xiaoming":{
"hosts":[
"192.168.10.104"
],
"vars":{
"ansible_ssh_port":22,
"ansible_connection":"ssh"
}
}
}
另外注意点: --list --host正是通过yml中的hosts指定的内容,即为脚本中命令行的参数的内容
总结
以上所述是小编给大家介绍的ansible动态Inventory主机清单配置遇到的坑,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。