具体的安装我就不做演示了,具体请看以下参考文献。老规矩,时空穿梭器:
https://www.cnblogs.com/anttech/p/12554201.html
那我就废话不多说,直接上代码了:
先来看一下大体框架:
1.首先是vm_create.py(总入口):
#anliu
'''
interface
'''
import os,sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from core import main
if __name__ == '__main__':
main.run()
2.其次是vm_config.py(配置文件和镜像以及数据库的路径):
conf = {
"src_conf_path" :"/etc/libvirt/qemu",
"det_conf_path" : "/opt/vmcreate/tmp"
}
image = {
"src_image_path" : "/var/lib/libvirt/images",
"det_image_path" : "/data"
}
db = {
"db_path":"/opt/vmcreate/db"
}
在这里,原来本人这只小菜鸟python还没学到数据库,只能先写到文件中了,求大佬放过
3.接下来是main.py:
#anliu
'''
main
'''
import os,sys,json
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from conf import vm_config
from core import vmcreate
message = {
"vm_name":None,
"vm_type":None,
"vm_cpu_max":None,
"vm_cpu_curr":None,
"vm_mem_max":None,
"vm_mem_curr":None,
"vm_vnc_port":None,
}
def interactive():
message["vm_name"] = input("vm_name:")
message["vm_type"] = input("vm_type:")
message["vm_cpu_max"] = input("vm_cpu_max:")
message["vm_cpu_curr"] = input("vm_cpu_curr:")
message["vm_mem_max"] = 1024*1024*int(input("vm_mem_max:"))
message["vm_mem_curr"] = 1024*1024*int(input("vm_mem_curr:"))
message["vm_vnc_port"] = input("vm_vnc_port:")
print(message)
with open(os.path.join(vm_config.db["db_path"],message["vm_name"]),"w",encoding="utf-8") as f1:
json.dump(message,f1)
interactive()
def run():
vmcreate.copy_vm_conf(message["vm_type"],message["vm_name"])
vmcreate.copy_vm_image(message["vm_type"],message["vm_name"])
vmcreate.mod_vm_conf(message)
vmcreate.define_vm(message["vm_name"])
4.然后是vmcreate.py(创建虚拟机):
#anliu
'''
the script is used created vm....
'''
import shutil,os,uuid,sys
from xml.etree import ElementTree as ET
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from conf import vm_config
def copy_vm_conf(src_name,det_name):
# shutil.copyfile(src_conf_path + "/" + src_name,det_conf_path + "/" + det_name)
shutil.copyfile(os.path.join(vm_config.conf["src_conf_path"],src_name + ".xml"),os.path.join(vm_config.conf["det_conf_path"],det_name + ".xml"))
#copy_vm_conf("anliu01","test01")
def copy_vm_image(src_name,det_name):
shutil.copyfile(os.path.join(vm_config.image["src_image_path"],src_name + ".img"),os.path.join(vm_config.image["det_image_path"],det_name + ".img"))
#copy_vm_image("anliu01","test01")
#def mod_vm_conf(det_name,memory_max,memory_curr,vcpu_max,vcpu_curr,vnc_port):
def mod_vm_conf(message):
tree = ET.parse(os.path.join(vm_config.conf["det_conf_path"],message["vm_name"] + ".xml"))
root = tree.getroot()
for node1 in root.iter("name"):
# print(node1.tag,node1.text)
node1.text = message["vm_name"]
for node2 in root.iter("uuid"):
# print(node2.tag,node2.text)
node2.text = str(uuid.uuid1())
for node3 in root.iter("memory"):
# print(node3.tag,node3.text)
node3.text = str(message["vm_mem_max"])
for node4 in root.iter("currentMemory"):
# print(node4.tag,node4.text)
node4.text = str(message["vm_mem_curr"])
for node5 in root.iter("vcpu"):
# print(node5.tag,node5.text,node5.attrib)
node5.text = message["vm_cpu_max"]
node5.attrib["current"] = message["vm_cpu_curr"]
for node6 in root.iter("source"):
try:
# print(node6.attrib["file"])
node6.attrib["file"] = os.path.join(vm_config.image["det_image_path"],message["vm_name"] + ".img")
except KeyError as key:
pass
for node7 in root.iter("graphics"):
# print(node7.attrib)
node7.attrib["port"] = message["vm_vnc_port"]
tree.write(os.path.join(vm_config.conf["det_conf_path"],message["vm_name"] + ".xml"))
#mod_vm_conf("test01",2,2,"2","1","5988")
def define_vm(det_name):
os.chdir(vm_config.conf["det_conf_path"])
os.system("virsh define %s"%det_name + ".xml")
os.system("virsh start %s"%det_name)
#define_vm("test01")
我把一些刚开始写的东西都留下来加了注释,只是留给大家一个开始构思的思路。
5.最后给大家分享一个虚拟机的配置文件,练习时候就可以用:
anliu01
814ad4be-8987-493c-98e8-203258ef1e46
2097152
2097152
1
hvm
Broadwell-noTSX-IBRS
destroy
restart
destroy
/usr/libexec/qemu-kvm
优化:1.拉取镜像,配置文件,定义虚拟机后成功与否的状态都可以加日志和时间戳。2.在准备定义虚拟机的时候,加一些镜像和配置文件是否已经就绪等判断。期待你的优化,再会!