
開發(fā)背景:
由于在OpenStack上有過(guò)熱遷移失敗的記錄,虛機(jī)重裝掛載磁盤會(huì)報(bào)錯(cuò),數(shù)據(jù)盤掛載不上,所以需要在OpenStack上找出所有有過(guò)熱遷移并且遷移失敗的虛機(jī)處理,以免后續(xù)重裝掛載不上磁盤。
開發(fā)環(huán)境:
centos,Python 2.7.5,OpenStack
具體思路:
Shell篩選命令
nova list –all 找出所有虛機(jī)
nova instance-action-list 虛機(jī)ID | egrep -in 'live-migration|error' 篩選出具有相應(yīng)動(dòng)作的虛機(jī)。
使用shell腳本篩選,但是由于nova instance-action-list命令執(zhí)行太慢,所以考慮使用Python通過(guò)OS的接口去找出這部分虛機(jī)。
通過(guò)OpenStack的API接口調(diào)用,找出所有虛機(jī),并且查詢每個(gè)虛機(jī)的所有動(dòng)作,篩選出有l(wèi)ive-migration動(dòng)作并且message為Error的虛機(jī)就輸出虛機(jī)名稱和虛機(jī)ID。
關(guān)鍵步驟:
1、登錄認(rèn)證實(shí)現(xiàn):OpenStack主要是通過(guò)keystoneauth組件來(lái)提供認(rèn)證服務(wù),我通過(guò)keystoneauth組件的keystoneauth1.session.Session 類初始化一個(gè)Session對(duì)象,此對(duì)象可以存儲(chǔ)用戶名密碼和token等信息。
2、shell命令對(duì)應(yīng)novaclient庫(kù)的方法查詢,主要通過(guò)OpenStack的官方文檔:https://docs.openstack.org/python-novaclient/latest/reference/index.html?去查詢想要的方法以及方法具有的參數(shù)。
具體源代碼
#!/usr/bin/python2# -*- coding: utf-8 -*-? fromnovaclientimportclientfromkeystoneauth1importsessionfromkeystoneauth1.identityimportv3importrequests#登錄認(rèn)證auth = v3.Password(user_domain_name='Default',? ? ? ? ? ? ? ? ? ? username='******',? ? ? ? ? ? ? ? ? ? password='*********',? ? ? ? ? ? ? ? ? ? project_domain_name='Default',? ? ? ? ? ? ? ? ? ? project_name='admin',? ? ? ? ? ? ? ? ? ? auth_url='http://IP:35357/v3')sess = session.Session(auth=auth)nova = client.Client(2,session=sess)#查詢所有虛機(jī)instances = nova.servers.list(search_opts={'all_tenants':'1'})#循環(huán)forinstanceininstances:#查詢每臺(tái)虛機(jī)的動(dòng)作foriinnova.instance_action.list(instance.id):#篩選出live-migration的動(dòng)作并且結(jié)果是Errorifi.to_dict()['action']=='live-migration'andi.to_dict()['message']=='Error':#輸出虛機(jī)名稱和虛機(jī)IDprintinstance.name ,instance.idbreak
總結(jié)
Python的novaclient庫(kù)和keystoneauth1庫(kù),已經(jīng)封裝了具體的請(qǐng)求過(guò)程,基本只需要填好關(guān)鍵信息就可以直接調(diào)用API接口去獲取虛機(jī)信息,主要遇到的問(wèn)題就是OpenStack的API接口資料網(wǎng)上比較少,基本都是需要閱讀官方文檔。