全自動部署KVM虛擬機腳本一例

此腳本通過已有的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. ......
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章