此脚本通过已有的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
- }
- ......
转载于:https://blog.51cto.com/rolandqu/961671