[背景]最近事情特别多,前段时间搞搞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 BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:virsh edit Template_Centos55x64_LAMP
or 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

现在我来做一个工作,就是添加两个虚拟机,一个叫web01,一个叫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

执行脚本,结果:

[提供代码]

#!/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 module
import shutil
import os,sys
from virtinst.util import *
import libvirt
import re
if sys.version_info < (2,5):import lxml.etree as ET
else:import xml.etree.ElementTree as ET
#Define variables
template_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 0
def 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 "="*100
def 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 file
fh=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)

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

如果想了解更多,请关注我们的公众号
公众号ID:opdevos
扫码关注

KVM脚本批量添加删除虚拟机相关推荐

  1. linux小脚本批量添加/删除用户

    批量添加/删除用户,当输入add时,判断用户是否存在,存在则显示存在,不存在则添加:当输入del时,判断用户是否存在,存在则删除用户,不存在则显示不存在. #!/bin/bash if [ $1 == ...

  2. 利用脚本批量添加域用户账户

    以下内容摘自笔者编著的<网管员必读--网络管理>(第2版)一书: 2.4.6 利用脚本批量添加域用户账户  以上两种方法是比较常用的批量用户账户添加方法,但是不够灵活(不可以设置密码),而 ...

  3. Windows 批量添加删除路由资源性能优化

    首先,本文只涉及如何优化Windows批量添加删除路由资源的速度优化. 基于虚拟网卡来实现虚拟网络的组建的架构图如下所示: 图片来自网络 起因: 一般来说,私有网络的一个资源对应本地的一条路由(比如: ...

  4. python编写arcgis脚本_ArcGis Python脚本——批量添加字段

    插个广告,制作ArcGIS的Tool工具学习下面的教程就对了: 以下是正文: 先看如何增加一个字段 函数:arcpy.AddField_management 语法:AddFields_manageme ...

  5. 用户管理(一):使用shell脚本批量添加指定数量的用户

    运行环境 CentOS 6.9.Xshell 5 前言 我们在需要创建多个用户的时候,使用手工单独创建是比较耗费精力的事情,我们可以通过shell脚本实现批量添加用户,实现指定数量用户.创建用户默认名 ...

  6. KVM新增扩容修改删除虚拟机

    新建虚拟机服务器 以新建以下三台服务器为例 服务器 CPU数 内存 磁盘 映射端口 docker_test01 8 8G 300G 5932 docker_test02 4 4G 300G 5933 ...

  7. linux shell脚本批量添加用户

    有时有需求要批量添加用户所以写了个脚本 从user.list中读取数据每一行就是一个用户名 #!/bin/bash for username in $(more user.list) do if [ ...

  8. Android批量添加删除联系人

    项目中的一个小需求,需要批量导入电话号码进入手机里面,号段固定了,可以自己添加号段的选项 XML布局文件 <LinearLayout xmlns:android="http://sch ...

  9. 【MOS】OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1)

    [MOS]OCR/Vote disk 维护操作: (添加/删除/替换/移动) (文档 ID 1674859.1) 文档内容 目标 解决方案   准备磁盘   1. 磁盘大小   2. 裸设备或者块设备 ...

最新文章

  1. 【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数
  2. 《C++成员函数重载、覆盖与隐藏》
  3. JAVA实现变态跳台阶问题(《剑指offer》)
  4. WEB 进程的查看和关闭(kill)
  5. Python3的unittest用例按编写顺序执行
  6. php源码怎样安装mysql_安装MySQL
  7. 由左右像点坐标反求世界坐标点
  8. json串转成list
  9. APPCAN学习笔记006_创建第一个APPCAN应用
  10. SQL截断增强功能:SQL Server 2019中的静默数据截断
  11. NetBeans 时事通讯(刊号 # 143 - Apr 19, 2011)
  12. spring 事务隔离级别和传播行为_Spring 事务传播行为
  13. SVN创建分支-查看分支创建之前文件的历史记录
  14. 宇视手机客户端共享/分享设备配置操作
  15. 印度电影,又一次让我们不得不服
  16. 1371: 三位数求解
  17. 微信开发(三)微信模板消息接口设计
  18. 《学会提问》读书笔记
  19. Ngrok(内网穿透工具)使用教程详解
  20. 蚂蚁通讯框架SOFABolt之私有通讯协议设计

热门文章

  1. nginx配置 yii2 URL重写规则 SSI配置使shtml
  2. react-router5.x 的配置及其页面跳转方法和js跳转方法
  3. iOS中安全结束 子线程 的方法
  4. [Oracle] Enable Row Movement
  5. JS报错:Uncaught RangeError: Maximum call stack size exceeded
  6. vue项目使用npm run dev 编译到一半不动了
  7. JQuery中的.attr()与.removeAttr()
  8. Node.js 安装及配置
  9. 第一个鸿蒙程序hello world
  10. mac如何将本地服务暴露到外网?