ansible動(dòng)態(tài)Inventory主機(jī)清單配置遇到的坑
坑1 : 動(dòng)態(tài)主機(jī)清單配置,需要按照ansible的要求的格式返回給ansible命令的
源代碼如下:
但是在ansible-playbook中使用動(dòng)態(tài)主機(jī)配置文件的時(shí)候,發(fā)生了錯(cuò)誤?。?!

提示沒(méi)有匹配的主機(jī)信息
分析: 數(shù)據(jù)庫(kù)已配置好,python腳本也能輸出,問(wèn)題在于輸出的結(jié)果不是ansible想要的格式作為ansible的命令輸入,因此排查如下
下面看下我的動(dòng)態(tài)inventory輸出的格式吧
[root@ansible fang]# python ansible_inventory.py --list
{
"all": [
"192.168.10.104"
]
}
[root@ansible fang]# python ansible_inventory.py --host 192.168.10.104
{
"ansible_ssh_host": "192.168.10.104",
"ansible_ssh_user": "root",
"hostname": "clone-node1"
}
在網(wǎng)上找的方法,雖然實(shí)現(xiàn)了—list --host的輸出,但是格式不滿足ansible格式輸出的要求,ansible需求的格式有哪些呢,請(qǐng)看解決辦法中….
輸出結(jié)果:
這是出錯(cuò)的信息,提示還是找不到主機(jī)的信息
[root@ansible fang]#
ansible-playbook -i ansible_inventory.py bb.yml運(yùn)行出錯(cuò)
解決方法:
先說(shuō)個(gè)知識(shí)點(diǎn)(ansible所要求的格式):
動(dòng)態(tài) Inventory 指通過(guò)外部腳本獲取主機(jī)列表,并按照 ansible 所要求的格式返回給 ansilbe 命令的
因此,需要清楚ansible需要那種inventory的格式呢
必須輸出為 JSON 格式
同時(shí)必須支持兩個(gè)參數(shù):--list 和 --host <hostname>。
--list:用于返回所有的主機(jī)組信息,每個(gè)組所包含的主機(jī)列表 hosts、所含子組列表 children、主機(jī)組變量列表 vars 都應(yīng)該是字典形式的,_meta 用來(lái)存放主機(jī)變量。
正確的輸出格式是什么樣子的呢,請(qǐng)看下面:
以下的是正確的動(dòng)態(tài)inventory的輸出格式,其中就是ansible的第三點(diǎn)要求 每個(gè)組所包含的主機(jī)列表 hosts、所含子組列表 children、主機(jī)組變量列表 vars 都應(yīng)該是字典形式的,_meta 用來(lái)存放主機(jī)變量。
[root@ansible fang]# vim tt.py
[root@ansible fang]# python tt.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@ansible fang]#
按照以上的格式,來(lái)編寫我們的輸出吧,
SQL表格內(nèi)容如下:

我想要輸出的json格式是這樣的
{組名:{
hosts:[‘ip1','ip2'],
vars:{
“ansible_ssh_port”:22,
“ansilble_connection”:'ssh'
……….
}
}
}
腳本代碼列出來(lái)了如下:
#_*_coding:utf-8_*_
__author__ = 'fang'
import pymysql
import json
import argparse
import sys
def execude_sql(table): #定義一個(gè)執(zhí)行SQL的函數(shù)
sql = 'select * from {0};'.format(table)
cur.execute(sql) #args即要傳入SQL的參數(shù)
sys_result = cur.fetchall()
#index = cur.description
hostlist = {}#放入主機(jī)清單的信息
for i in sys_result:
hostlist[i[2]] = []
for i in sys_result:
hostlist[i[2]].append([i[1], i[5], i[6]])
host_lists = dict()
for i in hostlist.iteritems():
dict_item = dict()
for index in i[1]:
dict_item[index[0]] = {'ansible_connection': index[1], 'ansible_ssh_port': index[2]}
host_lists[i[0]] = dict_item
# print json.dumps(host_lists, indent=4)
return host_lists
def group(data):
'''
all hostip
:param data:
:return:
'''
count_ip = dict()
count_ip['all'] = {}
count_ip['all']['hosts'] = []
index = []
for i in data:
index.extend(data[i].keys())
count_ip['all']['hosts'].extend(list(set(index)))
print json.dumps(count_ip, indent=4)
def host(data, ip):
dict_host = {}
for i in data:
if data[i].keys() == [ip]:
dict_host[i] = {}
dict_host[i]['hosts'] = [ip]
dict_host[i]['vars'] = data[i][ip]
print json.dumps(dict_host, indent=4)
break
if __name__ == "__main__":
global file, con, cur #文件對(duì)象,連接和游標(biāo)對(duì)象
#連接數(shù)據(jù)庫(kù)
con = pymysql.connect('127.0.0.1', 'root', '', 'ansible', charset='utf8') # 連接數(shù)據(jù)庫(kù)
cur = con.cursor() # 定義一個(gè)游標(biāo)
data = execude_sql('hosts_table')
# parser = argparse.ArgumentParser()#定義參數(shù)解析器
#獲取參數(shù)的方法1:
#以下是參數(shù)解析器添加參數(shù)格式,有—list和—host dest表示都可以通過(guò)args.list或者args.host來(lái)獲取到可變參數(shù)的值,action中store_true表存儲(chǔ)的是布爾值,當(dāng)沒(méi)有—list的時(shí)候默認(rèn)false,當(dāng)有—list的時(shí)候,但是沒(méi)有值,默認(rèn)則為true,help表示幫助時(shí)候提示的信息,argparse很好用,在這里恰當(dāng)好處
# parser.add_argument('--list',action='store_true',dest='list',help='get all hosts')
# parser.add_argument('--host',action='store',dest='host',help='get sigle host')
# args = parser.parse_args()
# if args.list:
# group(data)
# if args.host:
# host(data, args.host)
#獲取參數(shù)的方法2:
if len(sys.argv) == 2 and (sys.argv[1] == '--list'):
group(data)
elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):
host(data, sys.argv[2])
else:
print "Usage %s --list or --host <hostname>"% sys.argv[0]
sys.exit(1)
坑 2: 動(dòng)態(tài)inventory腳本要制定python的解釋器,否則無(wú)法執(zhí)行
問(wèn)題分析:
Ansible-playbook –I ansbile_inventory.py bb.yml執(zhí)行
提示:無(wú)法識(shí)別host,還是出現(xiàn)了問(wèn)題
對(duì)比ansible要求的格式,沒(méi)有差別,最后進(jìn)行代碼的比對(duì),問(wèn)題出現(xiàn)在腳本沒(méi)有制定Python解釋器,導(dǎo)致出現(xiàn)的問(wèn)題
解決辦法:
添加python解釋器的路徑

執(zhí)行結(jié)果:
Yml文件

命令執(zhí)行結(jié)果:
[root@ansible fang]# ansible-playbook -i ansible_inventory.py bb.yml
PLAY [192.168.10.104] *********************************************************************
TASK [debug] *********************************************************************
ok: [192.168.10.104] => {
"msg": "this is test block"
}
TASK [file] *********************************************************************
ok: [192.168.10.104]
TASK [debug] *********************************************************************
ok: [192.168.10.104] => {
"msg": "this is always"
}
PLAY RECAP *********************************************************************
192.168.10.104 : ok=3 changed=0 unreachable=0 failed=0
[root@ansible fang]# python ansible_inventory.py --host 192.168.10.104
{
"xiaoming": {
"hosts": [
"192.168.10.104"
],
"vars": {
"ansible_ssh_port": 22,
"ansible_connection": "ssh"
}
}
}
另外注意點(diǎn): --list --host 正是通過(guò)yml中的hosts指定的內(nèi)容,即為腳本中命令行的參數(shù)的內(nèi)容
總結(jié)
以上所述是小編給大家介紹的ansible動(dòng)態(tài)Inventory主機(jī)清單配置遇到的坑,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
詳解如何使用Python實(shí)現(xiàn)過(guò)濾指定進(jìn)程
Python提供了多種方式來(lái)實(shí)現(xiàn)對(duì)進(jìn)程的過(guò)濾和操作,本文將介紹如何利用Python來(lái)過(guò)濾指定進(jìn)程,并展示一些實(shí)用的技巧和方法,希望對(duì)大家有所幫助2024-04-04
Python 讀取.dat 文件的實(shí)現(xiàn)
這篇文章主要介紹了Python 讀取.dat 文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
淺析Python與Mongodb數(shù)據(jù)庫(kù)之間的操作方法
這篇文章主要介紹了Python與Mongodb數(shù)據(jù)庫(kù)之間的操作,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
CentOS安裝pillow報(bào)錯(cuò)的解決方法
本文給大家分享的是作者在centos下為Python安裝pillow的時(shí)候報(bào)錯(cuò)的解決方法,希望對(duì)大家能夠有所幫助。2016-01-01
python使用ctypes調(diào)用dll遇到的坑解決記錄
這篇文章主要為大家介紹了python使用ctypes調(diào)用dll遇到的坑解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
PyTorch基礎(chǔ)之torch.nn.CrossEntropyLoss交叉熵?fù)p失
這篇文章主要介紹了PyTorch基礎(chǔ)之torch.nn.CrossEntropyLoss交叉熵?fù)p失講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說(shuō)明【推薦】
python發(fā)郵件需要掌握兩個(gè)模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import即可使用。這篇文章主要介紹了python自動(dòng)發(fā)郵件總結(jié)及實(shí)例說(shuō)明 ,需要的朋友可以參考下2019-05-05

