Shell script-KVM virtual machine modular installation and management



1. Modular installation and management of KVM virtual machine

#!/bin/bash
##kvm管理脚本
##ShanHai

#source加载模块脚本
source /shanhai/install-virtualhost.sh #创建一个全新虚拟机的模块脚本
source /shanhai/mod.sh #使用虚拟机模板快速创建新虚拟机的模块脚本
source /shanhai/disk.sh #添加硬盘的模块脚本
source /shanhai/net.sh #添加网卡的模块脚本
source /shanhai/snap.sh #创建快照的模块脚本
source /shanhai/vm_del.sh #删除虚拟机硬件,快照的模块脚本

while :
do
cat <<-EOF
————————————————————————————————————————————————————————————————————————————————————————————————
    1.查看当前所有虚拟机
    2.创建一个全新的虚拟机
    3.使用模板快速创建虚拟机
    4.添加虚拟机硬件
    5.创建虚拟机快照
    6.删除虚拟机硬件、快照
    *.退出
———————————————————————————————————————————————————————————————————————————————————————————————
EOF

read -p "请输入要进行的操作:" kvm_num
case "$kvm_num" in
    1)
        virsh list --all
    ;;
    2)
        vm_install
    ;;
    3)
        vm_mod
    ;;
    4)
        read -p "(1)添加硬盘,(2)添加网卡,(Q/q)退出" vm_num
        case "$vm_num" in
            1)
                vm_disk
            ;;
            2)
                vm_net
            ;;
            Q|q)
                exit
        esac
    ;;
    5)
        vm_snap
    ;;
    6)
        read -p "(1)删除硬盘,(2)删除网卡,(3)删除快照,(Q/q):" del_num
        case "$del_num" in
            1)
                disk_del
            ;;
            2)
                net_del
            ;;
            3)
                snap_del
            ;;
            Q|q)
                exit
            ;;
        esac
    ;;
    *)
        exit
    ;;
esac

done

1. Create a new virtual machine module script

#!/usr/bin/env bash
##vm_install
##ShanHai
vm_install(){
    
    
set -ue
set -o pipefail

# 创建相关目录
ls /home/kvm/{
    
    ks,virtualhost,virtual-img} 1>/dev/null 2>&1 || mkdir -p /home/kvm/{
    
    ks,virtualhost,virtual-img}

# 此程序的变量
KVM_HOME=/home/kvm
KVM_ISO=${
    
    KVM_HOME}/iso/CentOS-7-x86_64-Minimal-1708.iso
KVM_KS_FILE=${
    
    KVM_HOME}/ks/ks.cfg
KVM_IMG_DIR=${
    
    KVM_HOME}/virtual-img

OS_TYPE="linux"
DEF_OS_VARIANT="rhel7"
DEF_VM_NAME="centos$(date +%Y%m%dT%H%M%S)"

# 设置默认内存大小 1024 M,这个单位是固定的 M,不支持其他单位
DEF_MEM_SIZE=1024
DEF_VCPUS=1
DEF_DISK_SIZE=10G

#  交互式安装
echo  "输入将要创建的KVM虚拟机名称,不是主机名哦"
read -p "默认值${DEF_VM_NAME}>>:" VM_NAME

echo  "输入将要创建的服务器主机名"
read -p "默认 localhost>>:"  HOST_NAME

read -p "输入虚拟机 CPU 核心数默认 1 示例:2>>:" VCPUS

echo "输入虚拟机内存大小,默认1024M,不支持其他单位"
read -p "只需要添数字即可>>:" MEM_SIZE

echo "输入虚拟机使用的磁盘容量"
read -p "默认 10G,[示例写法:15G]>>:"  DISK_SIZE

# 变量替换, 假如没有输入值, 就使用默认值
VM_NAME=${
    
    VM_NAME:-$DEF_VM_NAME}
HOST_NAME=${
    
    HOST_NAME:-localhost.localdomain}

VCPUS=${
    
    VCPUS:-$DEF_VCPUS}
MEM_SIZE=${
    
    MEM_SIZE:-$DEF_MEM_SIZE}
DISK_SIZE=${
    
    DISK_SIZE:-$DEF_DISK_SIZE}
OS_VARIANT=${
    
    OS_VARIANT:-$DEF_OS_VARIANT}

new_disk=${
    
    KVM_IMG_DIR}/${
    
    VM_NAME}.qcow2

if [[ ! "${DISK_SIZE}" =~ G$ ]] || [[ ! "${DISK_SIZE::-1}" =~ ^[0-9]+$ ]]
then
    echo "格式不正确,正确示例:20G"
    exit
fi

if [ ! -f "${new_disk}" ];then
    qemu-img create -f qcow2 ${
    
    new_disk} ${
    
    DISK_SIZE}
fi

# 开始创建
virt-install -v \
     --arch x86_64 --virt-type kvm \
     --name ${
    
    VM_NAME} \
     --memory ${
    
    MEM_SIZE} \
     --vcpus ${
    
    VCPUS} \
     --os-type ${
    
    OS_TYPE} \
     --location ${
    
    KVM_ISO} \
     --network default \
     --graphics none \
     --os-variant     ${
    
    OS_VARIANT} \
     --initrd-inject  "${KVM_KS_FILE}" \
     --extra-args     "ks=file:/ks.cfg  \
                       console=tty0 console=ttyS0,115200n8 \
                       hostname=${HOST_NAME}" \
     --disk ${
    
    new_disk},cache=writeback,io=threads,bus=virtio
}

2. Use existing virtual machine templates to quickly create module scripts for new virtual machines

#!/usr/bin/bash
##MOD
##ShanHai
vm_mod(){
    
    
read -p "请输入创建的新虚拟机名称:" vm_name
vm_uuid=`uuidgen`
vm_mem=1048576
vm_mac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
#源镜像路径
image=/home/kvm/virtual-img/shanhai.qcow2
#源模板位置
mod=/etc/libvirt/qemu/centos7-mod.xml
#新镜像位置
new_image=/home/kvm/virtual-img/${
    
    vm_name}.qcow2
#新模板位置
new_mod=/etc/libvirt/qemu/${
    
    vm_name}.xml

cp $image $new_image
cp $mod $new_mod
sed -r \
-e  s%vm-name%$vm_name% \
-e  s%vm-uuid%$vm_uuid% \
-e  s%vm-mem%$vm_mem% \
-e  s%vm-disk-path%$new_image% \
-e  s%vm-mac%$vm_mac% \
$mod > $new_mod

echo "查看创建的虚拟机"
virsh define /etc/libvirt/qemu/${
    
    vm_name}.xml &>> /dev/null
systemctl restart libvirtd
virsh start $vm_name
virsh list --all | grep $vm_name
}

3. Add the module script of the virtual machine hard disk

#!/bin/bash
##disk
##ShanHai

#添加虚拟硬盘
vm_disk(){
    
    
virsh list --all
read -p "请输入想要添加硬件的虚拟机:" vm_name
    for i in {
    
    a..z}
    do
        virsh domblklist ${
    
    vm_name} | grep "^vd${i}" > /dev/null
        if [ $? -ne 0 ];then
            break
        fi
    done
    disk=vd${
    
    i}
    
read -p "请输入创建的磁盘容量(如2G):" disk_size
disk_file=/shanhai/${
    
    vm_name}-${
    
    disk}.qcow2

qemu-img create -f qcow2 ${
    
    disk_file} ${
    
    disk_size}G
source /shanhai/disk.mod > /shanhai/disk.xml

virsh attach-device ${
    
    vm_name} /shanhai/disk.xml --persistent
echo "查看虚拟硬盘"
virsh domblklist ${
    
    vm_name}
}

4. Add the module script of the virtual machine network card

#!/bin/bash
##net
##ShanHai

#添加虚拟网卡
vm_net(){
    
    
echo "添加虚拟网卡"
s=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
source /shanhai/net.mod > /shanhai/net.xml
virsh attach-device ${
    
    vm_name} net.xml --persistent
echo "查看虚拟网卡"
virsh domiflist ${
    
    vm_name}
}

5. Module script for creating virtual machine snapshots

#!/bin/bash
##snap
##ShanHai

#创建快照
vm_snap(){
    
    
    virsh list --all
    read -p "请输入想要创建快照的虚拟机名称:" vm_name
    vm_stat=`virsh list --all | grep $vm_name | awk '{print $3" "$4}'`
    qemu-img info /home/kvm/virtual-img/${
    
    vm_name}.qcow2 &>>/dev/null
    disk_type=`qemu-img info /home/kvm/virtual-img/${
    
    vm_name}.qcow2 | grep file | awk '{print $3}'`
    echo $disk_type
    exit
    echo "当前虚拟机磁盘类型为:$disk_type"
    echo "当前虚拟机状态为:$vm_stat"
    read -p "是否继续创建快照?[Y/n]:" snap_num
    case "$snap_num" in
        Y|y)
            if [ "$disk_type" = "qcow2" ];then
                read -p "请输入创建的快照名称:" snap_name
                virsh snapshot-create-as $vm_name ${
    
    vm_name}.${
    
    snap_name}
                echo "查看指定虚拟机的快照:"
                virsh snapshot-list $vm_name
            else
                echo "当前磁盘类型不支持创建快照"
            fi
        ;;
        N|n)
            echo "正在退出..."
        ;;
    esac
}

6. Delete virtual machine hardware, snapshot module script

#!/usr/bin/bash
##vm_del
##ShanHai

#删除虚拟机硬盘
disk_del(){
    
    
    virsh list --all
    read -p "请输入想要删除硬盘的虚拟机:" vm_name
    echo "查看当前虚拟机硬盘信息:"
    virsh domblklist $vm_name
    read -p "请输入想要删除的硬盘:" vm_disk
    virsh detach-disk ${
    
    vm_name} ${
    
    vm_disk} --persistent
}

#删除虚拟机网卡
net_del(){
    
    
    virsh list --all
    read -p "请输入想要删除网卡的虚拟机名称:" vm_name
    echo "查看当前虚拟机网卡信息:"
    virsh domiflist ${
    
    vm_name}
    read -p "请输入想要删除的网卡mac名称:" net_name
    virsh detach-interface ${
    
    vm_name} network ${
    
    net_name} --persistent
}

#删除虚拟机快照
snap_del(){
    
    
    virsh list --all
    read -p "输入想要删除快照的虚拟机名称:" vm_name
    echo "查看当前虚拟机所有快照:"
    virsh snapshot-list ${
    
    vm_name}
    read -p "输入想要删除的快照名称:" snap_name
    virsh snapshot-delete ${
    
    vm_name} --snapshotname ${
    
    snap_name}
}


2. Execution effect

1. View all virtual machines

Insert picture description here

2. Create a new virtual machine

Insert picture description here

3. Templates to quickly create virtual machines

Insert picture description here

4. Add virtual machine hard disk

Insert picture description here

5. Add virtual machine network card

Insert picture description here

6. Create a virtual machine snapshot

Insert picture description here
Insert picture description here

7. Delete virtual machine hardware, snapshot

Delete virtual machine hard disk
Insert picture description here
Delete virtual machine network card
Insert picture description here
Delete virtual machine snapshot
Insert picture description here

Guess you like

Origin blog.csdn.net/AnNan1997/article/details/115304552