#!/bin/bash PROGNAME="virt_host_add.sh" [ ! -d /opt/kvm_backup ] && mkdir /opt/kvm_backup [ ! -d /opt/kvm_logs ] && mkdir /opt/kvm_logs kvm_back_dir="/opt/kvm_backup" kvm_log_dir="/opt/kvm_logs" #######Call system function###### . /etc/init.d/functions #######Input information######### function Interaction(){ read -p "please input the IP,example 192.168.1.101: " IPADDR read -p "please input the Hard disk location,example /kvm/data05: " DISK read -p "please input the Virtual machine hard disk size location,Unit is GB,example 200: " DSIZE read -p "please input the memory size,Unit is G,example 8: " MEMORY read -p "please input the CPU num,example 2: " CPU read -p "please input the operating system (6/7),example 6: " SYSTEM #####Prepare the configuration information######## cd /opt/scripts/ curl -O file.51niux.com/kvm/gateway_mask >>/dev/null 2>&1 MEMMORY_SIZE=`expr 1048576 \* ${MEMORY}` Template=`/usr/bin/virsh list --all|grep demo|awk {'print $2'}|grep ${SYSTEM}` IP_filter=`echo ${IPADDR}|awk -F "." {'print $1"."$2"."$3 '}` DISK_SIZE=`df -h|grep $DISK|awk {'print $(NF-2)'}|awk -F "G" {'print $1'}` if [ `cat gateway_mask|grep $IP_filter|wc -l` -eq 0 ];then IP_MASK=255.255.255.0 IP_GATEWAY=${IP_filter}.254 else IP_GATEWAY=`cat gateway_mask |grep ${IP_filter}|awk {'print $1'}` IP_MASK=`cat gateway_mask |grep ${IP_filter}|awk {'print $2'}` fi if [ `echo $IP_MASK|grep "255.255"|wc -l` -eq 0 ];then echo "The file:gateway_mask is has a problem,Please check!" fi } ######Judgment input is OK########### ###IP check#### IPADDR_check(){ expr 0 + `echo $IPADDR|awk -F "." {'print $5'}`>>/dev/null 2>&1 if [ $? -eq 0 ];then echo "The IP input is not standard,please input true!" else expr `echo $IPADDR|awk -F "." {'print $1'}` + `echo $IPADDR|awk -F "." {'print $2'}` \ + `echo $IPADDR|awk -F "." {'print $3'}` + `echo $IPADDR|awk -F "." {'print $4'}` if [ $? -eq 0 ];then ping ${IPADDR} -c 1 >>/dev/null 2>&1 if [ $? -eq 0 ];then echo "The IP is on usring!" else DISK_check fi fi fi } ###DISK check#### DISK_check(){ if [ `df -h|grep $DISK|wc -l` -eq 1 ];then CPU_check else echo "The Hard disk partition does not exist!" fi } ###CPU check#### CPU_check(){ if [ $CPU -gt `cat /proc/cpuinfo |grep processor|wc -l` ];then echo "The CPU num is `cat /proc/cpuinfo |grep processor|wc -l`,The number of CPUs you choose is too large" else expr 0 + $CPU if [ $? -eq 0 ];then MEMORY_check else echo "CPU input is incorrect!" fi fi } ###MEMORY check#### MEMORY_check(){ expr 0 + $MEMORY if [ $? -eq 0 ];then SYSTEM_check else echo "MEMORY input is incorrect!" fi } ###SYSTEM check#### SYSTEM_check(){ expr 0 + $SYSTEM if [ $? -eq 0 ];then if [ `echo $SYSTEM` -eq 6 ] || [ `echo $SYSTEM` -eq 7 ];then DSIZE_check else echo "The SYSTEM only choose 6 or 7!" fi else echo "Please enter an integer for the operating system!" fi } ###DSIZE check#### DSIZE_check(){ if [ ${DISK_SIZE} -lt `echo ${DSIZE}` ];then echo "Sorry, the selected character space is not enough!" else if [ ${IPADDR} == ${IP_GATEWAY} ];then echo "The IP not is GATEWAY!" else Create_start fi fi } ####Select a different function.To determine whether to operate######### function Entrance(){ Interaction IPADDR_check } ####Start Create virt host########## function Create_start(){ kvm_add_log=$kvm_log_dir/${IPADDR}_add.`date +%F_%T`.log echo -e "\033[36m `date +%F_%T` the virtual machine:${IPADDR} is create start...... ========================================================================== \033[0m">$kvm_add_log Clone } ######Clone virtual machine###### function Clone(){ cd $DISK if [ $? -eq 0 ];then echo -e "\033[35m virt-clone -o $Template -n $IPADDR -f ${IPADDR}.img \033[0m" >>$kvm_add_log virt-clone -o $Template -n $IPADDR -f ${IPADDR}.img >>$kvm_add_log 2>&1 if [ $? -eq 0 ];then echo -e "\033[35m mv ${IPADDR}.img Extended.${IPADDR}.img.bak \033[0m" >>$kvm_add_log mv ${IPADDR}.img Extended.${IPADDR}.img.bak >>$kvm_add_log 2>&1 echo -e " \033[35m qemu-img create -f raw ${IPADDR}.img ${DSIZE}G \033[0m" >>$kvm_add_log qemu-img create -f raw ${IPADDR}.img ${DSIZE}G >>$kvm_add_log 2>&1 echo -e "\033[35m virt-resize --expand /dev/sda3 Extended.${IPADDR}.img.bak ${IPADDR}.img \033[0m" >>$kvm_add_log virt-resize --expand /dev/sda3 Extended.${IPADDR}.img.bak ${IPADDR}.img >>$kvm_add_log 2>&1 else echo -e "\033[31m The clone host is have same ERR! \033[0m" fi else echo -e "\033[31m The disk does not exist! \033[0m" fi IMG_SIZE=`ls -lh ${IPADDR}.img |awk {'print $5'}|awk -F "G" {'print $1'}` if [ -f ${IPADDR}.img ] && [ $IMG_SIZE -ge `echo ${DSIZE}` ];then echo -e "\033[35m ${IPADDR} clone is OK! \033[0m" >>$kvm_add_log Host_Configuration else echo -e "\033[31m The virt host ${IPADDR} is Expansion fail! \033[0m" fi cd /opt/scripts/ } ###Call the configuration#### function Host_Configuration(){ \cp /etc/libvirt/qemu/${IPADDR}.xml /tmp/ \cp -r /etc/libvirt/qemu $kvm_back_dir/qemu.`date +%F_%T` sed -i "s@`cat /tmp/${IPADDR}.xml |grep currentMemory`@\${MEMMORY_SIZE}\@" \ /tmp/${IPADDR}.xml sed -i "s@`cat /tmp/${IPADDR}.xml |grep memory`@\${MEMMORY_SIZE}\@" /tmp/${IPADDR}.xml sed -i "s@`cat /tmp/${IPADDR}.xml |grep vcpu`@\${CPU}\@" /tmp/${IPADDR}.xml echo -e "\033[32m ${IPADDR}.xml sed is OK! \033[0m" >>$kvm_add_log echo -e "\033[35m cp /tmp/${IPADDR}.xml /etc/libvirt/qemu/${IPADDR}.xml \033[0m" >> $kvm_add_log diff /tmp/${IPADDR}.xml /etc/libvirt/qemu/${IPADDR}.xml>>$kvm_add_log 2>&1 DIFF_NUM=`diff /tmp/${IPADDR}.xml /etc/libvirt/qemu/${IPADDR}.xml|wc -l` if [ ${DIFF_NUM} -le 8 ];then \cp -f /tmp/${IPADDR}.xml /etc/libvirt/qemu/${IPADDR}.xml >>$kvm_add_log virsh define /etc/libvirt/qemu/${IPADDR}.xml >>$kvm_add_log echo -e "\033[32m ${IPADDR} Configuration update is OK! \033[0m" >>$kvm_add_log Disk_expansion else echo -e "\033[31m There is a problem with the file replacement,Please hand diff! \033[0m" fi ###virt host Disk expansion### function Disk_expansion(){ cd /opt/scripts/ Expansion_size=`expr $DSIZE - 20 + 10` if [ `echo $SYSTEM` -eq 6 ];then echo "#!/bin/bash">rc.local echo "touch /var/lock/subsys/local">>rc.local echo "/sbin/lvextend -L ${Expansion_size}G /dev/mapper/kvm-root">>rc.local echo "/sbin/resize2fs /dev/mapper/kvm-root">>rc.local else echo "#!/bin/bash">rc.local echo "touch /var/lock/subsys/local">>rc.local echo "/usr/sbin/lvextend -L ${Expansion_size}G /dev/mapper/kvm-root">>rc.local echo "/usr/sbin/resize2fs /dev/mapper/kvm-root">>rc.local fi chmod +x rc.local virt-copy-in -d ${IPADDR} rc.local /etc/rc.d/ >>$kvm_add_log 2>&1 if [ $? -eq 0 ];then echo -e "\033[32m The Disk expansion is OK!\033[0m" >>$kvm_add_log Change_network else echo -e "\033[31m The Disk expansion is fail!\033[0m" fi } ####Change the network profile####### function Change_network(){ cd /opt/scripts/ curl -O file.51niux.com/kvm/ifcfg-eth0.${Template} if [ ! -f ifcfg-eth0.${Template} ];then virt-cat -d ${Template} /etc/sysconfig/network-scripts/ifcfg-eth0 >ifcfg-eth0.${Template} fi sed -i "s@`cat ifcfg-eth0.${Template} |grep IPADDR=`@IPADDR=${IPADDR}@" ifcfg-eth0.${Template} sed -i "s@`cat ifcfg-eth0.${Template} |grep NETMASK=`@NETMASK=${IP_MASK}@" ifcfg-eth0.${Template} sed -i "s@`cat ifcfg-eth0.${Template} |grep GATEWAY=`@GATEWAY=${IP_GATEWAY}@" ifcfg-eth0.${Template} mv ifcfg-eth0.${Template} ifcfg-eth0 virt-copy-in -d ${IPADDR} ifcfg-eth0 /etc/sysconfig/network-scripts/ >>$kvm_add_log 2>&1 virsh start ${IPADDR} >>$kvm_add_log 2>&1 echo -e "\033[32m The virt Host is create OK!\033[0m" >>$kvm_add_log sleep 10 Echo_success } ###echo success to user##### function Echo_success(){ echo -e "\033[32m The virt HOST ${IPADDR} is create OK!\033[0m" echo -e "\033[32m The virt HOST ${IPADDR} DISK use is:${DISK}\033[0m" echo -e "\033[32m The virt HOST ${IPADDR} CPU num is:${CPU}\033[0m" echo -e "\033[32m The virt HOST ${IPADDR} MEM size is:${MEMORY}GB\033[0m" echo -e "\033[32m The virt HOST ${IPADDR} DISK size is:${DSIZE}G\033[0m" if [ `echo $SYSTEM` -eq 6 ];then echo -e "\033[32m The virt HOST ${IPADDR} SYSTEM is:Centos6.8\033[0m" else echo -e "\033[32m The virt HOST ${IPADDR} SYSTEM is:Centos7.2\033[0m" fi cd /tmp/ cd $DISK >>$kvm_add_log 2>&1 [ -f Extended.${IPADDR}.img.bak ] && rm -f Extended.${IPADDR}.img.bak >>$kvm_add_log 2>&1 cd /tmp >>$kvm_add_log 2>&1 [ -f /tmp/${IPADDR}.xml ] && rm -f /tmp/${IPADDR}.xml >>$kvm_add_log 2>&1 } ####Call functions######### Entrance