KVM安装脚本

#!/bin/bash
#PS:KVM自动安装工具-v1.0
#必要环境检查:
Image_Path="/Vhost/images"
Conf_Path="/etc/libvirt/qemu"
Vhost_name="KVM_host"
Ram_size="1024"
Vcpu="4"
Cdrom="/Vhost/CentOS-7-x86_64-Minimal-2003.iso"
Dsik_size="10G"
Dsik_type="qcow2"

function Check() {
    [ -d ${Image_Path} ] ||{ mkdir -p ${Image_Path};chmod -R 755 ${Image_Path}; }
    [ -d ${Conf_Path} ] || mkdir -p ${Conf_Path}
    [ -f ${Cdrom} ] || { echo "无光盘文件";exit 1; }
    grep -E -i '(vmx|svm)' /proc/cpuinfo || { echo "请开启CPU虚拟化";exit 1; }
    rpm -q {'qemu-kvm','qemu-kvm-tools','libvirt-daemon-kvm','libvirt','libvirt-client','libguestfs','libguestfs-tools','virt-install','tigervnc','tigervnc-server'} || echo "缺少安装包"
    ping -W1 -c1 114.114.114.114 > /dev/null ||  echo "无法连通外部网络,请配置网络"
    yum makecache  > /dev/null || "yum仓库配置错误"
    grep -E -i 'epel' /etc/yum.repos.d/*.repo || echo "未配置epel源"
    
}
#软件安装
function Context(){
     #软件包安装
    read -p "环境安装请确认(y/n)" Option
    case $Option in
    Y|y|yes)
      [ ! -f /etc/yum.repos.d/Base1.repo ] && tee /etc/yum.repos.d/Base1.repo << EOF
	[base]
	name=base
	baseurl=file:///mnt/cdrom
	gpgcheck=0
	enabled=1
	[extras]
	name=extras
	baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch
	gpgcheck=0
	enabled=1
	[epel-1]
	name=epel-1
	baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/\$releasever/x86_64
	baseurl=https://mirrors.cloud.tencent.com/epel/\$releasever/x86_64
	gpgcheck=0
	enabled=1
EOF
    mkdir /dev/cdrom -p;mount /dev/cdrom /mnt/cdrom
    sed -ri 's/^[[:space:]]+(.*)/\1/' /etc/yum.repos.d/Base1.repo
    yum  -y install qemu-kvm qemu-kvm-tools libvirt-daemon-kvm libvirt libvirt-client libguestfs libguestfs-tools virt-install tigervnc tigervnc-server ||{ echo "安装失败,请检查环境";exit 1; } 
        systemctl enable --now libvirtd.service
        systemctl enable --now vncserver@\:1.service
        sleep 30
        #cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
        #sed -ri '/^ExecStart.*%i$/s/<USER>/root/' /etc/systemd/system/vncserver@\:1.service
        systemctl daemon-reload
        systemctl start vncserver@\:1.service
    ;;
    N|n|no)
        exit 1
    ;;
    *)
        echo "输入错误"
    ;;
    esac
}
function Template() {
        Check
        [ -d ${Image_Path} ] || { mkdir -p ${Image_Path};chmod -R 755 ${Image_Path}; }
        [ -d ${Conf_Path} ] || mkdir -p ${Conf_Path}
        [ -f ${Cdrom} ] || { echo "无光盘文件";exit 1; }
        #create_image
        if  [ ! -f ${Image_Path}/Template_host.img ] && [ ! -f ${Conf_Path}/Template_host.xml ];then
            qemu-img create -f ${Dsik_type} ${Image_Path}/Template_host.img  10G
        #create_vhost_cdrom
            virt-install --virt-type kvm --name  Template_host --ram 1024 --vcpus 4  --cdrom ${Cdrom} --disk ${Image_Path}/Template_host.img --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
            sleep 3
            echo "请打开图形化界面,安装模板虚拟机的系统"
            sleep 30
            virsh start  Template_host || { echo "请安装模板虚拟机的系统";sleep 3;vncviewer 127.0.0.1:0; }
            sleep 10
            vncviewer 127.0.0.1:0
                sleep 10
                a=0;j=1;while [ $a -lt 1 ];do 
                    virsh shutdown Template_host
                    echo "请后续将NOBOOT=NO改为NOBOOT=yes"
                    sleep 25
                    virt-edit -d Template_host /etc/sysconfig/network-scripts/ifcfg-eth0
                    virsh start Template_host
                    echo "正在加载IP,请稍等";sleep 25
                    Tem_ip=`virsh domifaddr Template_host | awk -F "[[:space:]]|/" '{if(NR ==3 )print $(NF-1)}'`
                    echo "Template_host the IP is ${Tem_ip}"
                    ping -W1 -c1 ${Tem_ip} && { a=2;j=10;}|| let j++
                    [ $j -gt 10  ] && { echo "网络未启动,无法获取网"; exit 1; } 
                done
                    echo "开始安装数据包,准备中,请等待";sleep 10
                 read -p "default installation net-tools,bash-completion[y/n]" Option_1
                    if [[  $Option_1 =~ Y|y|yes ]] ;then
                        virsh destroy --domain Template_host &> /dev/null
                        sleep 25
                        virt-sysprep --network --install=net-tools -d Template_host
                        virt-sysprep --network --install=bash-completion -d Template_host
                        read -e -p "请输入需要安装的包名(完整),多个包请用空格隔开:" Package
                        declare -a Package_list
                        a=1;for i in $Package;do
                                Package_list[$a]="$i"
                                let a++
                            done
                        for ((i=1;i<=${#Package_list[@]};i++));do
                        virt-sysprep --network --install=${Package_list[$i]} -d Template_host || Package_fail[$i]=${Package_list[$i]}
                        done
                        [ -z ${Package_fail[@]} ] &&  echo "共安装${#Package_list[@]}个包,无安装失败" || echo "共安装${#Package_list[@]}个包,${Package_fail[@]}安装失败" 
                   fi
        else
                    read -p "Only install and outsource[y/n]" Option_2
                        if [[  $Option_2 =~ Y|y|yes ]] ;then
                            virsh destroy --domain Template_host &> /dev/null
                            sleep 25
                            read -e -p "请输入需要安装的包名(完整),多个包请用空格隔开:" Package
                            declare -a Package_list
                            a=1;for i in $Package;do
                                    Package_list[$a]="$i"
                                    let a++
                                done
                            for ((i=1;i<=${#Package_list[@]};i++));do 
                            virt-sysprep --network --install=${Package_list[$i]} -d Template_host || Package_fail[$i]=${Package_list[$i]}
                            done
                            [ -z ${Package_fail[@]} ] &&  echo "共安装${#Package_list[@]}个包,无安装失败" || echo "共安装${#Package_list[@]}个包,${Package_fail[@]}安装失败"
                        fi
        fi
 
}          
function kimchi(){
    wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/kimchi-2.5.0-0.el7.centos.noarch.rpm
    wget https://github.com/kimchi-project/kimchi/releases/download/2.5.0/wok-2.5.0-0.el7.centos.noarch.rpm
    yum -y -q install wok-2.5.0-0.el7.centos.noarch.rpm kimchi-2.5.0-0.el7.centos.noarch.rpm 2> /dev/null
    setenforce 0
    systemctl start wokd  ||  systemctl daemon-reload
    systemctl restart wokd || echo "start failed Check the url availability and package availability"
    iptables -A INPUT -p tcp --dport 8001 -j ACCEPT
}
function VMs() {
    read -p "How many VMS to create" Number
    virsh destroy --domain Template_host
    [  ! -z ${Number} ] || { echo "Please enter the content";exit 1; } 
    [ -f ${Image_Path}/Template_host.img ] || read -p "Please enter the content images store path" new_images_path
    [ -f /etc/libvirt/qemu/Template_host.xml ] || read -p "Enter the path for saving the XML configuration file" new_file_path
    for ((i=1;i<=${Number};i++));do
        #Check whether the path exists 
        [ ! -z ${new_file_path} ] &&  cd ${new_file_path} || cd ${Conf_Path}
        #check conf.xml 
        [ -f /etc/libvirt/qemu/${Vhost_name}_0${i}.xml ] && [ -f $Image_Path/${Vhost_name}_0${i}.img ] && continue
        #Create new vms conf.xml file
        virsh dumpxml --domain Template_host > ${Vhost_name}_0${i}.xml
        #Modifying a conf.xml file
        sed -ri '/^.*<name>/'"s/Template_host/${Vhost_name}_0${i}/" ${Vhost_name}_0${i}.xml
        sed -ri '/.*<uuid>.*<\/uuid>$/d' ${Vhost_name}_0${i}.xml
        sed -ri '/.*<source file='.*'>/'"s@(.*=)'.*'(\/>)@\1'/var/lib/libvirt/images/${Vhost_name}_0${i}.img' \2@" ${Vhost_name}_0${i}.xml
        [ ! -z ${Bridge_Name} ] && sed -ri '/.*source network='.*'/'"s/(.*=)'.*'/\1'$Bridge_Name'/" ${Vhost_name}_0${i}.xml || sed -ri '/.*source network='.*'/'"s/(.*=)'.*'/\1'default'/" ${Vhost_name}_0${i}.xml
        [ $i -le 10 ] && sed -ri "s@(mac address=)'.*'(/>)@\1'52:54:00:4f:00:0$i' \2@" ${Vhost_name}_0${i}.xml || sed -ri "s@(mac address=)'.*'(/>)@\1'52:54:00:4f:00:$i' \2@" ${Vhost_name}_0${i}.xml
        #sed -i '/<\/name>$/a\    <title>'$Vhost_IP'</title>' ${Vhost_name}_0${i}.xml
        #Create new vms disk images
        if [ ! -z $new_images_path ];then  
            cp -p $new_images_path  $Image_Path/${Vhost_name}_0${i}.img
        else 
            cp -p $Image_Path/Template_host.img $Image_Path/${Vhost_name}_0${i}.img && ln -sf $Image_Path/${Vhost_name}_0${i}.img  /var/lib/libvirt/images/
        fi
        virsh create --file ${Vhost_name}_0${i}.xml
    done
        
}
function Bridge() {
        read -p "请输入创建的网桥名称" Bridge_Name
        read -p "请输入DHCP地址段(如:192.168.100.0)" dhcp_field
        if [ ! -z $Bridge_Name ] && [ ! -z $dhcp_field ];then 
            cd /etc/libvirt/qemu/networks
                virsh net-dumpxml --network default > ${Bridge_Name}.xml
                    sed -ri '/^.*<name>/'"s/default/${Bridge_Name}/" ${Bridge_Name}.xml
                    sed -ri '/<uuid>.*<\/uuid>$/d' ${Bridge_Name}.xml
                    sed -ri '/<bridge .*>/s/virbr0/br0/p' ${Bridge_Name}.xml
                    IP=`echo ${dhcp_field} |awk  -F"." '{$NF="";print $0}' |tr -s " " "."`
                    sed -ri "s/(<ip address=)'.*' (.*>)/\1'${IP}1' \2/"  ${Bridge_Name}.xml
                    sed -ri "s/(<range start=)'.*' (end=)'.*'(\/>)/\1'${IP}100' \2'${IP}254' \3/" ${Bridge_Name}.xml
                virsh net-create  ${Bridge_Name}.xml
                sleep 5
                virsh net-destroy ${Bridge_Name}
                sleep 5
                virsh net-define --file ${Bridge_Name}.xml
                sleep 5
                virsh net-autostart --network ${Bridge_Name}
                sleep 5
                virsh net-start ${Bridge_Name}
        fi

}
function Modify_net(){
    read "auto modify Net(y/n):" Option_2
    case $Option_2 in 
    Y|y|yes)
        read -p "Enter the IP address and host name(Use Spaces to separate them):"  Modify_net Modify_host
        #Modify VMs the static Net
            if [ ! -z ${Modify_net} ] &&  [ ! -z ${Modify_host} ];then
                IP=`echo ${Modify_net} |awk  -F"." '{$NF="";print $0}' |tr -s " " "."`
                virsh shutdown ${Modify_host}
                virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/IPV6_DEFROUTE=yes/GATEWAY='${IP}1'/"
                virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e 's/IPV6INIT=yes/PREFIX=24/'
                virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/IPV4_FAILURE_FATAL=no/IPADDR='${Modify_net}'/"
                virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/BOOTPROTO=".*"/="BOOTPROTO=none"/"
                virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0 -e "s/ONBOOT=".*"/="NOBOOT=yes"/"
            else
                echo "Enter the IP address and host name(Use Spaces to separate them)"
            fi
            ;;
    N|n|no)
        #Manually modify Net
            read -p "Enter the IP address the host name:" Modify_host
            virsh shutdown ${Modify_host}
            virt-edit -d ${Modify_host} /etc/sysconfig/network-scripts/ifcfg-eth0
            ;;
    *)
            echo "input Yes|y or No|no"
            exit 3
            ;;
    esac
}
PS3="请选择:(1-9):"
select MENU in 环境检查 软件包安装 网络创建 模板虚拟机创建 批量创建虚拟机 管理平台创建 修改网络 一键安装 退出 ;do
case $REPLY in
1)
    Check
    ;;
2)
    Context
    ;;
3)
    Bridge
    ;;
4)
    Template
    ;;

5)
    VMs
    ;;

6) 
    kimchi
    ;;
7)
    Modify_net
    ;;
8)  
    Check
    Context
    Template
    kimchi
    Bridge
    VMs
    Modify_net
    ;;
9)
    exit
    ;;
esac
done
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值