KVM脚本批量添加删除虚拟机

[背景]最近事情特别多,前段时间搞搞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

<!–WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BEOVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh edit Template_Centos55x64_LAMPor other application using the libvirt API.–><domain type=’kvm’> <name>Template_Centos55x64_LAMP</name> <uuid>e7bbc1b0-e9b1-a0f2-bd1e-dd9f3fd48823</uuid> <memory unit=’KiB’>524288</memory> <currentMemory unit=’KiB’>524288</currentMemory> <vcpu placement=’static’>2</vcpu> <os><type arch=’x86_64′ machine=’rhel6.3.0′>hvm</type><boot dev=’hd’/> </os> <features><acpi/><apic/><pae/> </features> <clock offset=’utc’/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices><emulator>/usr/libexec/qemu-kvm</emulator><disk type=’file’ device=’disk’><driver type=’raw’/><source file=’/var/lib/libvirt/images/Template_Centos55x64_LAMP.img’/><target dev=’hda’ bus=’ide’/><address type=’drive’ controller=’0′ bus=’0′ target=’0′ unit=’0’/></disk><interface type=’bridge’><mac address=’52:54:00:88:d0:51’/><source bridge=’br0’/><model type=’virtio’/></interface><serial type=’pty’><target port=’0’/></serial><console type=’pty’><target type=’serial’ port=’0’/></console><input type=’mouse’ bus=’ps2’/><graphics type=’vnc’ port=’-1′ autoport=’yes’/><video><model type=’cirrus’ vram=’9216′ heads=’1’/></video> </devices></domain>

[root@localhost xml]# more /template/scripts/vm.ini #Action,Vm_name,Template_img_file,Template_xml_fileadd,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_fileadd,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 1else:return 0def copy_vm_img_file(src_img_file,dst_img_file):print “Start Copy”,src_img_file,”to”,dst_img_fileif file_exists(dst_img_file):print “File %s exists, abort” % dst_img_filesys.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 = Trueif 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 etry: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_filevm_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_filesys.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 VMprint “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 esys.exit(1)if server.isActive():print “VM %s will be shutdown!” %vm_nametry:#server.shutdown()#VM need install acpidserver.destroy()except Exception,e:print esys.exit(1)print “VM %s will be delete!” %vm_nametry:server.undefine()except Exception,e:print esys.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_nametry:server.undefine()except Exception,e:print esys.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 fileprint “Copy Template VM image file”copy_vm_img_file(src_img_file,dst_img_file)#Function1.2 Create VM XML fileprint “Create VM Xml file”create_vm_xml_file(src_xml_file,vm_name,dst_img_file)elif action==”delete”:#Function3 Delete VMprint “Delete VM”delete_vm(vm_name)

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

本文出自 “坏男孩” 博客,请务必保留此出处

乐观者在灾祸中看到机会;悲观者在机会中看到灾祸

KVM脚本批量添加删除虚拟机

相关文章:

你感兴趣的文章:

标签云: