KVM虚拟机管理系统(基于python libvirt实现)

import tkinter as tk
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import libvirt
import os
import paramiko
root = tk.Tk()
host_id=1
def create():
    def updata():
        global host_id
        host_id=r.get()
    def definekvm():
        virt_name = e_virt_name.get()
        num_cpu = e_num_cpu.get()
        meo_size = e_meo_size.get()
        disk_size = e_disk_size.get()
        path1='/home/manxu/Desktop/CentOS-7-x86_64-DVD-2003.iso'
        path2='/home/mpiuser/CentOS-7-x86_64-DVD-2009.iso'
        if host_id==1:
            iso_path=path1
            conn=libvirt.open('qemu:///system')
            instruction = 'cd /usr/local/img && qemu-img create -f qcow2 {}.qcow2 {}G'.format(virt_name, disk_size)
            os.system(instruction)
        else:
            iso_path=path2
            conn = libvirt.open('qemu+ssh://root@node2/system')
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            command='cd /usr/local/img'+';'+'qemu-img create -f qcow2 {}.qcow2 {}G'.format(virt_name,disk_size)
            ssh.connect('192.168.0.14', '22', 'root')
            ssh.exec_command(command)
        qcow_path='/usr/local/img/{}.qcow2'.format(virt_name)
        domain_list1 = conn.listDomainsID()
        domain_list2=conn.listDefinedDomains()
        xmldesc = '''
        <domain type='kvm'>
        <name>{}</name>
        <memory unit='KiB'>{}</memory>
        <currentMemory unit='KiB'>{}</currentMemory>
        <vcpu placement='static'>{}</vcpu>
        <os>
        <type arch='x86_64' machine='rhel6.5.0'>hvm</type>
        <boot dev='cdrom'/>
        </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='qcow2'/>
        <source file='{}'/>
        <target dev='hda' bus='ide'/>
        </disk>
        <disk type='file' device='cdrom'>
        <source file='{}'/>
        <target dev='hdc' bus='ide'/>
        </disk>
        <controller type='usb' index='0'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
        </controller>
        <controller type='ide' index='0'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
        </controller>
        <interface type='bridge'>
        <virtualport type='openvswitch'/>
        <source bridge='br0'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
        <serial type='pty'>
        <target port='0'/>
        </serial>
        <console type='pty'>
        <target type='serial' port='0'/>
        </console>
        <graphics type='vnc' port='{}' autoport='no' listen='0.0.0.0'>
        <listen type='address' address='0.0.0.0'/>
        </graphics>
        <input type='mouse' bus='ps2'/>
        <video>
        <model type='cirrus' vram='9216' heads='1'/>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
        </video>
        <memballoon model='virtio'>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
        </memballoon>
        </devices>
        </domain>
        '''.format(virt_name,int(meo_size)*1024*1024,int(meo_size)*1024*1024,int(num_cpu),qcow_path,iso_path,5900+len(domain_list1)+len(domain_list2))
        conn.defineXML(xmldesc)
        if host_id==1:
            information=[virt_name,'closed','host1']
        else:
            information=[virt_name,'closed','host2']
        tree.insert('',END,values=information)
        conn.close()
    child_window=tk.Toplevel()
    child_window.geometry('300x520')
    child_window.title('创建虚拟机')
    r = tk.IntVar()
    r.set(1)
    label1 = tk.Label(child_window, text='选择创建的主机:', font=20)
    label1.pack(anchor="w",pady=10)
    radio1 = tk.Radiobutton(child_window, text="host1", value=1, variable=r,command=updata,font=12)
    radio1.pack(anchor="w")
    radio2 = tk.Radiobutton(child_window, text="host2", value=2, variable=r,command=updata,font=12)
    radio2.pack(anchor="w")
    label2=tk.Label(child_window,text='虚拟机名称:',font=20)
    label2.pack(anchor="w",pady=20)
    e_virt_name=tk.Entry(child_window,width=15,font=20)
    e_virt_name.pack(anchor="w")
    label3 = tk.Label(child_window, text='CPU个数:', font=20)
    label3.pack(anchor="w", pady=20)
    e_num_cpu = tk.Entry(child_window, width=15, font=20)
    e_num_cpu.pack(anchor="w")
    label4 = tk.Label(child_window, text='内存空间(GB):', font=20)
    label4.pack(anchor="w", pady=20)
    e_meo_size = tk.Entry(child_window, width=15, font=20)
    e_meo_size.pack(anchor="w")
    label5 = tk.Label(child_window, text='磁盘空间(GB):', font=20)
    label5.pack(anchor="w", pady=20)
    e_disk_size = tk.Entry(child_window, width=15, font=20)
    e_disk_size.pack(anchor="w")
    button = tk.Button(child_window, text='信息输入完毕', font=16,command=definekvm)
    button.pack(anchor="w", pady=20)
    child_window.mainloop()
def onClick(event):
    button2.config(state=tk.DISABLED)
    button3.config(state=tk.DISABLED)
    button4.config(state=tk.DISABLED)
    global item
    item=tree.selection()[0]
    virt_name=tree.item(item)['values'][0]
    mach_states=tree.item(item)['values'][1]
    host_name=tree.item(item)['values'][2]
    if mach_states=='closed':
        button2.config(state=tk.NORMAL)
    if mach_states=='open':
        button3.config(state=tk.NORMAL)
        button4.config(state=tk.NORMAL)
def open_virt():
    virt_name = tree.item(item)['values'][0]
    host_name = tree.item(item)['values'][2]
    if host_name=='host1':
        conn = libvirt.open('qemu:///system')
    else:
        conn = libvirt.open('qemu+ssh://root@node2/system')
    dom = conn.lookupByName(virt_name)
    dom.create()
    value=[virt_name,'open',host_name]
    tree.item(item,values=value)
    conn.close()
def delete_virt():
    virt_name = tree.item(item)['values'][0]
    host_name = tree.item(item)['values'][2]
    if host_name=='host1':
        conn = libvirt.open('qemu:///system')
    else:
        conn = libvirt.open('qemu+ssh://root@node2/system')
    dom = conn.lookupByName(virt_name)
    dom.destroy()
    tree.delete(item)
    conn.close()
def close_virt():
    virt_name = tree.item(item)['values'][0]
    host_name = tree.item(item)['values'][2]
    if host_name=='host1':
        conn = libvirt.open('qemu:///system')
    else:
        conn = libvirt.open('qemu+ssh://root@node2/system')
    dom = conn.lookupByName(virt_name)
    dom.shutdown()
    value=[virt_name,'closed',host_name]
    tree.item(item,values=value)
    conn.close()
def update_state():
    x = tree.get_children()
    for item in x:
        tree.delete(item)
    conn1 = libvirt.open('qemu:///system')
    vms_list = []
    domain_list = conn1.listDomainsID()
    for id in domain_list:
        vms_list.append(conn1.lookupByID(id).name())
    for item_ in vms_list:
        value = [item_, 'open', 'host1']
        tree.insert('', END, values=value)
    vms_list = []
    for id in conn1.listDefinedDomains():
        vms_list.append(id)
    for item_ in vms_list:
        value = [item_, 'closed', 'host1']
        tree.insert('', END, values=value)
    conn1.close()
    conn2 = libvirt.open('qemu+ssh://root@node2/system')
    vms_list = []
    domain_list = conn2.listDomainsID()
    for id in domain_list:
        vms_list.append(conn2.lookupByID(id).name())
    for item_ in vms_list:
        value = [item_, 'open', 'host2']
        tree.insert('', END, values=value)
    vms_list = []
    for id in conn2.listDefinedDomains():
        vms_list.append(id)
    for item_ in vms_list:
        value = [item_, 'closed', 'host2']
        tree.insert('', END, values=value)
    conn2.close()
root.geometry('600x400')
root.title('虚拟机管理系统')
button1=tk.Button(root,text='创建虚拟机',font=('Arial', 16),command=create)
button1.place(relx=0.04,rely=0.08)
button5=tk.Button(root,text='更新状态',font=('Arial', 16),command=update_state)
button5.place(relx=0.34,rely=0.08)
yscroll = Scrollbar(root, orient=VERTICAL)
tree = ttk.Treeview(root,height=10,show='headings',  yscrollcommand=yscroll.set)
tree.place(relx=0.04,rely=0.25)
tree["columns"] = ("虚拟机名称", "虚拟机状态",'虚拟机来源')
tree.column("虚拟机名称", width=200)
tree.column("虚拟机状态", width=200)
tree.column("虚拟机来源", width=150)
tree.heading("虚拟机名称", text="虚拟机名称")
tree.heading("虚拟机状态", text="虚拟机状态")
tree.heading("虚拟机来源", text="虚拟机来源")
yscroll.pack(side=RIGHT, fill=Y)
yscroll.config(command=tree.yview)
button2=tk.Button(root,text='开启虚拟机',font=('Arial', 16),command=open_virt)
button2.place(relx=0.04,rely=0.85)
button2.config(state=tk.DISABLED)
button3=tk.Button(root,text='关闭虚拟机',font=('Arial', 16),command=close_virt)
button3.place(relx=0.34,rely=0.85)
button3.config(state=tk.DISABLED)
button4=tk.Button(root,text='删除虚拟机',font=('Arial', 16),command=delete_virt)
button4.place(relx=0.64,rely=0.85)
button4.config(state=tk.DISABLED)
conn1 = libvirt.open('qemu:///system')
vms_list = []
domain_list = conn1.listDomainsID()
for id in domain_list:
    vms_list.append(conn1.lookupByID(id).name())
for item_ in vms_list:
    value=[item_,'open','host1']
    tree.insert('', END, values=value)
vms_list = []
for id in conn1.listDefinedDomains():
    vms_list.append(id)
for item_ in vms_list:
    value=[item_,'closed','host1']
    tree.insert('', END, values=value)
conn1.close()
conn2 = libvirt.open('qemu+ssh://root@node2/system')
vms_list = []
domain_list = conn2.listDomainsID()
for id in domain_list:
    vms_list.append(conn2.lookupByID(id).name())
for item_ in vms_list:
    value=[item_,'open','host2']
    tree.insert('', END, values=value)
vms_list = []
for id in conn2.listDefinedDomains():
    vms_list.append(id)
for item_ in vms_list:
    value=[item_,'closed','host2']
    tree.insert('', END, values=value)
conn2.close()
tree.bind("<ButtonRelease-1>", onClick)
root.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值