Add or delete VMS in batches using KVM scripts

Source: Internet
Author: User

[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

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.