#!/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