此脚本通过已有的KVM模板磁盘文件全自动部署KVM虚拟机实例,执行包括创建配置文件,拷贝虚拟机磁盘文件,修改虚拟机主机名和IP地址以及定义和启动KVM虚拟机实例等操作。
 
执行脚本时必须指定的参数包括:
“虚拟机名称”,“VCPU数量”,“内存容量”,“虚拟机启动后的IP地址”
可选参数是:
“模板img文件的路径及文件名”,如果不指定此参数则取脚本中的默认值(/troodon/KVM/Templete/CentOS62.raw)
 
一些注意事项:
此脚本必须运行在宿主机环境已经配置完成,可以正常部署KVM虚拟机的环境中。KVM虚拟机基本安装参看(http://rolandqu.blog.51cto.com/3477736/942923)
KVM模板img磁盘文件格式必须为raw,创建的KVM虚拟机实例磁盘文件格式也是raw;
脚本中"oriIpAddr","oriName"这两个字符串是为了脚本能自动替换KVM虚拟机实例IP地址和主机名所设置,在实际使用脚本前需要依照各自不同KVM模板文件的网卡配置和主机名配置的实际值进行替换以便脚本能正常执行;
脚本默认的宿主机桥接口名称为br0,如果实际应用中有不同请注意修改;
脚本会自动解决UUID和MAC问题,VNC端口通过系统自动指定。
 
由于字数限制以下是脚本的部分内容,完整脚本请看附件。
 
 
  
  1. #!/bin/bash 
  2.  
  3. export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" 
  4.  
  5. dateTime=$(date +%Y%m%d%H%M%S) 
  6. tmpDiskFile="/troodon/KVM/Templete/CentOS62.raw" 
  7. vmDir="/troodon/KVM" 
  8. test -d $vmDir || mkdir -p $vmDir 
  9.  
  10. help() { 
  11.     cat >> /dev/stdout <<EOF 
  12. Usage: $(basename $0) vmname vcpu memory ip [TempleteDiskFile] | -h 
  13. Example: ./$(basename $0) vmname=CentOS vcpu=4 memory=6G ip=192.168.10.10 diskfile=CentOS.img 
  14. Example: ./$(basename $0) vmname=CentOS vcpu=2 memory=512M ip=10.10.10.1 
  15. Example: ./$(basename $0) -h     //print help infomations 
  16. EOF 
  17.  
  18. error() { 
  19.     echo -e "input parameter error: $1 \n please try again!" 
  20.  
  21. if [[ "$#" -eq 0 || "$1" == "-h" ]]; then 
  22.     help 
  23.     exit 0 
  24. fi 
  25.  
  26. for line in $@ 
  27.     do 
  28.     case $line in 
  29.     vmname*) 
  30.         vmName=$(echo $line | awk -F "=" '{print $2}') 
  31.         ;; 
  32.     vcpu*) 
  33.         vCpu=$(echo $line | awk -F "=" '{print $2}') 
  34.         if ! echo $vCpu | grep '^[0-9]$' > /dev/null; then 
  35.             error $line 
  36.             help 
  37.             exit 1 
  38.         fi 
  39.         ;; 
  40.     memory*) 
  41.         memTmp=$(echo $line | awk -F "=" '{print $2}') 
  42.         memNum=$(echo ${memTmp:0:${#memTmp}-1}) 
  43.         memUnit=$(echo ${memTmp:0-1} | tr '[a-z]' '[A-Z]') 
  44.         if ! echo $memNum | grep '[0-9]' > /dev/null; then 
  45.             error $line 
  46.             help 
  47.             exit 1 
  48.         fi 
  49.         if [[ "$memUnit" != "G" && "$memUnit" != "M" && "$memUnit" != "K" ]]; then 
  50.             error $line 
  51.             help 
  52.             exit 1 
  53.         fi 
  54.         ;; 
  55.     diskfile*) 
  56.         diskFile=$(echo $line | awk -F "=" '{print $2}') 
  57.         if [ ! -f "$diskFile" ]; then 
  58.             error $line 
  59.             help 
  60.             exit 1 
  61.         fi 
  62.         ;; 
  63.     ip*) 
  64.         vmIp=$(echo $line | awk -F "=" '{print $2}') 
  65.         if ! echo $vmIp | grep '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' > /dev/null; then 
  66.             error $line 
  67.             help 
  68.             exit 1 
  69.         fi 
  70.         ;; 
  71.          
  72.     *) 
  73.         error $line 
  74.         help 
  75.         exit 1 
  76.         ;; 
  77.     esac 
  78. done         
  79.  
  80. if [ -z "$vmName" ] || [ -z "$vCpu" ] || [ -z "$memNum" ] || [ -z "$vmIp" ]; 
  81.     then 
  82.     echo -e "input parameter incomplete: $@" 
  83.     help 
  84.     exit 1 
  85. fi 
  86.  
  87. if [ -z "$diskFile" ]; then 
  88.     echo -e "not assign Templete diskfile, use default Templete diskfile: $tmpDiskFile " 
  89.     diskFile=$tmpDiskFile 
  90. fi 
  91.  
  92. ......
  93.  
  94. create_mac() { 
  95. test -f /tmp/mac.py && rm -f /tmp/mac.py 
  96. cat > /tmp/mac.py <<EOF 
  97. #!/usr/bin/python 
  98. # macgen.py script to generate a MAC address for Red Hat Virtualization guests 
  99. import random 
  100. def randomMAC(): 
  101.         mac = [ 0x54, 0x52, 0x00, 
  102.                 random.randint(0x00, 0x7f), 
  103.                 random.randint(0x00, 0xff), 
  104.                 random.randint(0x00, 0xff) ] 
  105.         return ':'.join(map(lambda x: "%02x" % x, mac)) 
  106. print randomMAC() 
  107. EOF 
  108. vmMac=$(python /tmp/mac.py) 
  109.  
  110. create_uuid() { 
  111. vmUuid=$(uuidgen) 
  112.  
  113. define_kvm() { 
  114. virsh define $vmDir/$vmName/$vmName.xml 
  115. if [ $? -ne 0 ]; then 
  116.     echo -e "virsh define $vmName.xml error!" 
  117.     exit 1 
  118. fi 
  119. virsh start $vmName 
  120. if [ $? -ne 0 ]; then 
  121.     echo -e "virsh start $vmName error!" 
  122.     exit 1 
  123. fi 
  124. virsh list 
  125. vncPort=$(virsh vncdisplay $vmName) 
  126. vncIp=$(ifconfig br0 | awk '/inet addr/{print $2}' | awk -F ":" '{print $2}') 
  127. echo -e "VNC IP and Port is: $vncIp$vncPort" 
  128.  
  129. modify_disk() { 
  130. vmHostName=$(echo $vmIp | awk -F "." '{print "YN-" $3 "-" $4}') 
  131. vmIpPri=192.168.$(echo $vmIp | awk -F "." '{print $3 "." $4}') 
  132. sectorSize=$(parted $vmDir/$vmName/$vmName.raw unit s print | awk '/Sector size/{print $4}' | awk -F "B" '{print $1}') 
  133. sst=$(parted $vmDir/$vmName/$vmName.raw unit s print | awk '/ 1  /{print $2}') 
  134. startSector=${sst:0:${#sst}-1} 
  135. offSet=$(($startSector*$sectorSize)) 
  136. mount -o loop,offset=$offSet $vmDir/$vmName/$vmName.raw /mnt/ 
  137. if [ $? -ne 0 ]; then 
  138.     echo -e "mount $vmDir/$vmName/$vmName.raw failed! " 
  139.     exit 1 
  140. fi 
  141. tmpHost="/mnt/etc/sysconfig/network" 
  142. tmpIp1="/mnt/etc/sysconfig/network-scripts/ifcfg-eth0" 
  143. tmpIp2="/mnt/etc/sysconfig/network-scripts/ifcfg-eth0:1" 
  144. tmpZabbix="/mnt/etc/zabbix/zabbix_agentd.conf" 
  145. sed -i "s/oriHost/$vmHostName/g" $tmpHost 
  146. sed -i "s/IPADDR=oriIpAddr/IPADDR=$vmIp/g" $tmpIp1 
  147. sed -i "s/IPADDR=oriIpAddr/IPADDR=$vmIpPri/g" $tmpIp2 
  148. sed -i "s/Hostname=oriIpAddr/Hostname=$vmIp/g" $tmpZabbix 
  149. umount /mnt 
  150.  
  151. dots() { 
  152. sec=$1 
  153. while true 
  154.     do 
  155.     echo -e ".\c" 
  156.     sleep $sec 
  157. done 
  158.  
  159. ......