[Background] There have been a lot of things recently. Some time ago, I was engaged in openstack and found that it was complicated. I wanted to learn KVM first and then try it. due to work relationship, I developed a c/s monitoring program with twisted, but it has not been released yet. if you don't want to force yourself, I think it may take a few days for me to release this tool. if you don't talk about this, let's just say that I can do this tool. to put it simply, it is like the image function of openstack. However, if people provide Web Gui, click it twice and I need to modify the configuration file vm. ini, but it's not always okay at that point. I tried it, but it's not that clever. my configuration file is simple, that is, to tell me whether to add or delete a virtual machine. If I add a virtual machine, I need to tell the template where the image file is? Where are the template xml files? Of course, these files must be defined. That is, the image files should be prepared in advance. The glance of openstack is also required.
[Process]
(1) install the template System
Omitted
(2) copy the template imgfile and xml file to/template/img,/template/xml respectively. Of course, you can change the template. However, the program also needs to be modified.
(3) modify the vm. ini file
Reference
Template xml file
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 name='qemu' 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_file
Add, web01, Template_Centos55x64_LAMP.img, Template_Centos55x64_LAMP.xml
Delete, web01, none, none
Now I want to add two virtual machines, web01 and 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
Run the script. Result:
650) this. width = 650; "src =" http://www.bkjia.com/uploads/allimg/131227/1Q6415164-0.jpg "style =" float: none; "title =" result.jpg "/>
650) this. width = 650; "src =" http://www.bkjia.com/uploads/allimg/131227/1Q6413351-1.jpg "style =" float: none; "title =" result2.jpg "/>
[Provide Code]
#!/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)
Later, we will provide scripts for modifying Virtual Machine configurations through scripts. Write these scripts first.
This article is from the "bad boy" blog, please be sure to keep this source http://5ydycm.blog.51cto.com/115934/1211630