[背景]最近事情特别多,前段时间搞搞openstack,发现过与复杂,就想把KVM先好好学学,再过来搞它.因为工作关系,又用twisted开发了一个c/s的监控程序,但因还没有写完,所以暂时没有发出来.如果不是强逼自己,我想我这个工具,也可能需要再等几日才能发布吧.扯远了,先不说这些,就说我这款工具能干嘛吧.简单的说就像openstack的镜像功能一般,不过,人家是提供Web Gui,点两下就OK了,我这需要修改下配置文件vm.ini,不过它那个点两下,不一定OK噢,反正我试过,没那么灵光.我的配置文件很简单,就是告诉我是添加还是删除虚拟机,如果添加则需要告诉模板镜像文件在哪?模板xml文件在哪.当然这些都是要定义好的.也就是提前将镜像文件做好嘛.openstack的glance也是需要的嘛.

[过程]

(1)安装模板系统

(2)将模板img文件和xml文件分别copy到/template/img,/template/xml下,当然,你也可以更改,不过,程序也需要做修改.

(3)修改vm.ini文件

参考

模板xml文件

more /template/xml/Template_Centos55x64_LAMP.xml

  
Template_Centos55x64_LAMP
  
e7bbc1b0-e9b1-a0f2-bd1e-dd9f3fd48823
  
524288  
524288  
2  
    
hvm    
  
  
    
    
    
  
  
  
destroy
  
restart
  
restart
  
    
/usr/libexec/qemu-kvm
    
      
      
      
      
        
      
      
      
        
      
        
      
        
    
    
  

[root@localhost xml]# more /template/scripts/vm.ini

#Action,Vm_name,Template_img_file,Template_xml_file
add,web01,Template_Centos55x64_LAMP.img,Template_Centos55x64_LAMP.xml

delete,web01,none,none

现在我来做一个工作,就是添加两个虚拟机,一个叫web01,一个叫web02

[root@localhost xml]# more /template/scripts/vm.ini

#Action,Vm_name,Template_img_file,Template_xml_file
add,web01,Template_Centos55x64_LAMP.img,Template_Centos55x64_LAMP.xml

add,web02,Template_Centos55x64_LAMP.img,Template_Centos55x64_LAMP.xml

执行脚本,结果:

[提供代码]

#!/usr/bin/env python####################################################################Auth:Zhuzhengjun#LastModified:2013/05/27#Version 0.1#Function Description:#Batch automatically generated/delete VM#1.Generated VM##1.1.Copy VM img file##1.2.Create VM XML file###1.2.1.Update UUID###1.2.2.Update MAC###1.2.3.Update img path###1.2.4.Update VM Name#2.Start VM#3.Delete VM#####################################################################import moduleimport shutilimport os,sysfrom virtinst.util import *import libvirtimport reif sys.version_info < (2,5):        import lxml.etree as ETelse:        import xml.etree.ElementTree as ET#Define variablestemplate_img_path="/template/img"template_xml_path="/template/xml"vm_img_path="/var/lib/libvirt/images"vm_xml_path="/etc/libvirt/qemu"vm_file="/template/scripts/vm.ini"uri="qemu:///system"def file_exists(file):    if os.path.exists(file):        return 1    else:        return 0def copy_vm_img_file(src_img_file,dst_img_file):    print "Start Copy",src_img_file,"to",dst_img_file    if file_exists(dst_img_file):        print "File %s exists, abort" % dst_img_file        sys.exit(1)    shutil.copyfile(src_img_file,dst_img_file)    print "Done!"def start_vm(vm_xml_file,vm_name):    try:         conn = libvirt.open(uri)    except Exception,e:        print 'Faild to open connection to the hypervisor'        sys.exit(1)    create = True    if create:        xmlfile=open(vm_xml_file)        xmldesc=xmlfile.read()        xmlfile.close()    try:        vmname = conn.defineXML(xmldesc)    except Exception,e:        print "Failed to define %s:%s" %(vm_name,e)        sys.exit(1)    if vmname is None:        print 'whoops this shouldnt happen!'    try:        vmname.create()    except Exception,e:        print "Failed to create %s:%s" %(vm_name,e)        sys.exit(1)    try:        print "Domain 0:id %d running %s" %(vmname.ID(),vmname.name())    except Exception,e:        print e    try:        conn.close()    except:        print "Faild to close the connection!"        sys.exit(1)    print "Done!"    print "="*100def create_vm_xml_file(src_xml_file,vm_name,dst_img_file):    config = ET.parse(src_xml_file)    name = config.find('name')    name.text = vm_name.strip()    uuid = config.find('uuid')    uuid.text = uuidToString(randomUUID())    mac = config.find('devices/interface/mac')    mac.attrib['address'] = randomMAC(type='qemu')    disk = config.find('devices/disk/source')    disk.attrib['file']=dst_img_file    vm_xml_name=vm_name.strip() + '.xml'    vm_xml_file=os.path.join(vm_xml_path,vm_xml_name)    if file_exists(vm_xml_file):        print "File %s exists, abort" % vm_xml_file        sys.exit(1)    config.write(vm_xml_file)    print "Created vm config file %s" % vm_xml_file    #print "Use disk image %s, you must create it from the template disk: %s" % (disk_image, disk_old)    print "Done!"    #Function 2 Start VM    print "Start VM"    start_vm(vm_xml_file,vm_name)def delete_file(file_name):    if file_exists(file_name):        os.unlink(file_name)def delete_vm(vm_name):    vmimg=vm_name+".img"    vmxml=vm_name+".xml"    img_file=os.path.join(vm_img_path,vmimg)    xml_file=os.path.join(vm_xml_path,vmxml)    try:        conn = libvirt.open(uri)    except Exception,e:        print 'Faild to open connection to the hypervisor'        sys.exit(1)    try:        server=conn.lookupByName(vm_name)    except Exception,e:        print e        sys.exit(1)    if server.isActive():        print "VM %s will be shutdown!" %vm_name        try:            #server.shutdown()#VM need install acpid            server.destroy()        except Exception,e:            print e            sys.exit(1)        print "VM %s will be delete!" %vm_name        try:            server.undefine()        except Exception,e:            print e            sys.exit(1)                                       delete_file(img_file)        delete_file(xml_file)                                             try:            conn.close()        except:            print "Faild to close the connection!"            sys.exit(1)    else:        print "VM %s will be delete!" %vm_name        try:            server.undefine()        except Exception,e:            print e            sys.exit(1)                                              delete_file(img_file)        delete_file(xml_file)    print "Done"    print "="*100#Open config filefh=open(vm_file)vm_config=fh.readlines()fh.close()for line in vm_config:    passline=re.compile("#.*")    if re.search(passline,line)!=None:        continue    (action,vm_name,src_file,xml_file)=line.strip().split(",")    if action=='add':        src_img_file=os.path.join(template_img_path,src_file)        dst_img_file=os.path.join(vm_img_path,vm_name.strip()+".img")        src_xml_file=os.path.join(template_xml_path,xml_file)        if not (file_exists(src_img_file) and file_exists(src_xml_file)):            print "File %s or %s not exists,abort!" %(src_img_file,src_xml_file)            sys.exit(1)                                      #Function1.1 Copy VM img file        print "Copy Template VM image file"        copy_vm_img_file(src_img_file,dst_img_file)        #Function1.2 Create VM XML file        print "Create VM Xml file"        create_vm_xml_file(src_xml_file,vm_name,dst_img_file)    elif action=="delete":        #Function3 Delete VM        print "Delete VM"        delete_vm(vm_name)

后期,将提供通过脚本修改些虚拟机配置的脚本.先写这些吧.

如果想了解更多,请关注我们的公众号

公众号ID:opdevos
扫码关注

gongzhouhao.jpg