此腳本通過已有的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端口通過系統自動指定。
由於字數限制以下是腳本的部分內容,完整腳本請看附件。
- #!/bin/bash
- export PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
- dateTime=$(date +%Y%m%d%H%M%S)
- tmpDiskFile="/troodon/KVM/Templete/CentOS62.raw"
- vmDir="/troodon/KVM"
- test -d $vmDir || mkdir -p $vmDir
- help() {
- cat >> /dev/stdout <<EOF
- Usage: $(basename $0) vmname vcpu memory ip [TempleteDiskFile] | -h
- Example: ./$(basename $0) vmname=CentOS vcpu=4 memory=6G ip=192.168.10.10 diskfile=CentOS.img
- Example: ./$(basename $0) vmname=CentOS vcpu=2 memory=512M ip=10.10.10.1
- Example: ./$(basename $0) -h //print help infomations
- EOF
- }
- error() {
- echo -e "input parameter error: $1 \n please try again!"
- }
- if [[ "$#" -eq 0 || "$1" == "-h" ]]; then
- help
- exit 0
- fi
- for line in $@
- do
- case $line in
- vmname*)
- vmName=$(echo $line | awk -F "=" '{print $2}')
- ;;
- vcpu*)
- vCpu=$(echo $line | awk -F "=" '{print $2}')
- if ! echo $vCpu | grep '^[0-9]$' > /dev/null; then
- error $line
- help
- exit 1
- fi
- ;;
- memory*)
- memTmp=$(echo $line | awk -F "=" '{print $2}')
- memNum=$(echo ${memTmp:0:${#memTmp}-1})
- memUnit=$(echo ${memTmp:0-1} | tr '[a-z]' '[A-Z]')
- if ! echo $memNum | grep '[0-9]' > /dev/null; then
- error $line
- help
- exit 1
- fi
- if [[ "$memUnit" != "G" && "$memUnit" != "M" && "$memUnit" != "K" ]]; then
- error $line
- help
- exit 1
- fi
- ;;
- diskfile*)
- diskFile=$(echo $line | awk -F "=" '{print $2}')
- if [ ! -f "$diskFile" ]; then
- error $line
- help
- exit 1
- fi
- ;;
- ip*)
- vmIp=$(echo $line | awk -F "=" '{print $2}')
- if ! echo $vmIp | grep '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' > /dev/null; then
- error $line
- help
- exit 1
- fi
- ;;
- *)
- error $line
- help
- exit 1
- ;;
- esac
- done
- if [ -z "$vmName" ] || [ -z "$vCpu" ] || [ -z "$memNum" ] || [ -z "$vmIp" ];
- then
- echo -e "input parameter incomplete: $@"
- help
- exit 1
- fi
- if [ -z "$diskFile" ]; then
- echo -e "not assign Templete diskfile, use default Templete diskfile: $tmpDiskFile "
- diskFile=$tmpDiskFile
- fi
- ......
- create_mac() {
- test -f /tmp/mac.py && rm -f /tmp/mac.py
- cat > /tmp/mac.py <<EOF
- #!/usr/bin/python
- # macgen.py script to generate a MAC address for Red Hat Virtualization guests
- #
- import random
- #
- def randomMAC():
- mac = [ 0x54, 0x52, 0x00,
- random.randint(0x00, 0x7f),
- random.randint(0x00, 0xff),
- random.randint(0x00, 0xff) ]
- return ':'.join(map(lambda x: "%02x" % x, mac))
- #
- print randomMAC()
- EOF
- vmMac=$(python /tmp/mac.py)
- }
- create_uuid() {
- vmUuid=$(uuidgen)
- }
- define_kvm() {
- virsh define $vmDir/$vmName/$vmName.xml
- if [ $? -ne 0 ]; then
- echo -e "virsh define $vmName.xml error!"
- exit 1
- fi
- virsh start $vmName
- if [ $? -ne 0 ]; then
- echo -e "virsh start $vmName error!"
- exit 1
- fi
- virsh list
- vncPort=$(virsh vncdisplay $vmName)
- vncIp=$(ifconfig br0 | awk '/inet addr/{print $2}' | awk -F ":" '{print $2}')
- echo -e "VNC IP and Port is: $vncIp$vncPort"
- }
- modify_disk() {
- vmHostName=$(echo $vmIp | awk -F "." '{print "YN-" $3 "-" $4}')
- vmIpPri=192.168.$(echo $vmIp | awk -F "." '{print $3 "." $4}')
- sectorSize=$(parted $vmDir/$vmName/$vmName.raw unit s print | awk '/Sector size/{print $4}' | awk -F "B" '{print $1}')
- sst=$(parted $vmDir/$vmName/$vmName.raw unit s print | awk '/ 1 /{print $2}')
- startSector=${sst:0:${#sst}-1}
- offSet=$(($startSector*$sectorSize))
- mount -o loop,offset=$offSet $vmDir/$vmName/$vmName.raw /mnt/
- if [ $? -ne 0 ]; then
- echo -e "mount $vmDir/$vmName/$vmName.raw failed! "
- exit 1
- fi
- tmpHost="/mnt/etc/sysconfig/network"
- tmpIp1="/mnt/etc/sysconfig/network-scripts/ifcfg-eth0"
- tmpIp2="/mnt/etc/sysconfig/network-scripts/ifcfg-eth0:1"
- tmpZabbix="/mnt/etc/zabbix/zabbix_agentd.conf"
- sed -i "s/oriHost/$vmHostName/g" $tmpHost
- sed -i "s/IPADDR=oriIpAddr/IPADDR=$vmIp/g" $tmpIp1
- sed -i "s/IPADDR=oriIpAddr/IPADDR=$vmIpPri/g" $tmpIp2
- sed -i "s/Hostname=oriIpAddr/Hostname=$vmIp/g" $tmpZabbix
- umount /mnt
- }
- dots() {
- sec=$1
- while true
- do
- echo -e ".\c"
- sleep $sec
- done
- }
- ......