兩台不同的主機間如果都執行了libvirtd,就可以透過virsh的指令集來對於虛擬機VM做許多的操作,這個我們在之前的文章中有提到過。現在我們有了Python API,當然可以更進一步地做自動化批次作業。除了前一篇文章中介紹到的把所有的VM關閉或是打開之外,這一篇文章我們就來做Live Migration的自動化操作,一個程式把所有正在執行中的VM在不停機的情況下全部搬到另外一台主機Node上。程式如下(Python 2):

#! /usr/bin/python
import libvirt
import sys

conn = libvirt.open("qemu:///system")
dest_conn = libvirt.open("qemu+ssh://192.168.1.50/system")

alldom = conn.listAllDomains()
for dom in alldom:
  if dom.isActive():
    print dom.name() + " is migrating..."
    new_dom = dom.migrate(dest_conn, 0, None, None, 0)
    if new_dom == None:
      print dom.name() + " is fail to migrate!"
    else:
      print dom.name() + " was migrated successfully!"
dest_conn.close()
conn.close()

程式其實也很簡單,就是把自己本地端的主機連接打開放在conn中,同時也把對方連線的主機連結打開放在dest_conn中。接下來在本地端透過listAllDomains()取出所有定義的domain(不管是有沒在執行的),透過for迴圈一個一個檢視,只有isActive()(正在執行中的)虛擬機doman才做live migration的動作。執行live migration的函數就是dom.migrate(dest_conn…)這個函數而已。

由於連線需使用SSH通道,所以如果你沒有做SSH免密碼設定的話,在執行的過程中會跟你要求輸入密碼。

另外,Live Migration時,兩台電腦的指令集需要相容。如果不相容的話,是沒有辦法順利遷移過去了。例如站長使用的兩台電腦,一台的CPU是Intel i3-4130 (Node A),另外一台則是Intel i5 M460(Node B),結果那個i5的CPU居然不支援AES指令集,在不做任何調整的情況下,在Node A安裝的虛擬機沒有辦法migrate到Node B,但是在Node B建立安裝的虛擬機則可以自由地在兩台Node之間migrate。這是要特別留意的地方。

所以,我們如果把程式命名為migrateall.py,那麼只要執行./migrateall.py,本地端Node中所有的虛擬機就全部被搬到另外一台Node上了。那麼如何搬回來呢?就把來源和目標換一下,另外再寫一個叫做./migratebackall.py囉:

#! /usr/bin/python
import libvirt
import sys

conn = libvirt.open("qemu+ssh://192.168.1.50/system")
dest_conn = libvirt.open("qemu:///system")

alldom = conn.listAllDomains()
for dom in alldom:
  if dom.isActive():
    print dom.name() + " is migrating..."
    new_dom = dom.migrate(dest_conn, 0, None, None, 0)
    if new_dom == None:
      print dom.name() + " is fail to migrate!"
    else:
      print dom.name() + " was migrated successfully!"
dest_conn.close()
conn.close()

(19)