本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名原文链接~~~

VMWare 虚拟机管理脚本 for Mac

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:


#!/bin/bash
#
#########################################################################
# File Name: auto_vm.sh
# Author: 张种恩
# mail: 632404164@qq.com
# Created Time: 2020-03-30 13:21:19
# Description: VMware 虚拟机管理
#########################################################################
OLD_IFS=$IFS
IFS=$'\n\n'

if [ $# -gt 3 -o $# -eq 0 ];then
    echo "支持操作如下:
            clone <host>:从模板机链接克隆一台主机;
            start <host>:启动指定虚拟机;
            set_ip <host> <ip_suffix>:设置初始克隆主机的 IP 和主机名;
            set_ip2 <host> <ip_suffix>:设置初始克隆主机的 IP 和主机名(虚拟机需要安装 VMWare Tools 并提供脚本);
            stop <host>:关闭指定虚拟机;
            stop_all:停止所有当前正在运行的主机;
            start_select:启动所有在 auto_vm.conf.d 目录下已配置的主机;
            stop_select:停止所有在 auto_vm.conf.d 目录下已配置的主机;
            revert_all:恢复所有在 auto_vm.conf.d 目录下的主机到初始状态;
            shot <host> <shot_name>:给指定的主机打快照;
            shot_revert <host> <shot_name>:恢复到指定快照;
            shot_del <host> <shot_name>:删除指定主机的指定快照;
            shot_list <host>:查看指定主机的快照列表;
            auto_create:根据 auto_create.conf 配置文件自动创建主机并设置 IP、主机名、打快照;"
    exit 1
fi

# 第一个参数为要执行的函数名
# 第二个参数为要操作的主机
# 第三个参数为扩展参数,在如下场景使用:
#   1. 给指定主机打快照时作为快照的名称;
#   2. 指定恢复的快照名称;
#   3. 指定删除的快照名称;
#   4. 给指定主机设置 IP 时作为主机的 IP 后缀,如传入 12;
func_cmd=$1
hostname=$2
ext=$3

# 虚拟机文件存放目录
vm_dir_path='/Users/zhangzhongen/Virtual Machines.localized'
# 模板机路径
vm_template_path="${vm_dir_path}/centos7_template_100.vmwarevm"
# 被控虚拟机配置文件目录,此配置文件仅用来配置需要自动克隆并配置的虚拟机,格式如下:
# web01 7
# web02 8
# 第一列为主机名,第二列为 IP 后缀
vm_autoconf_path="/Users/zhangzhongen/dev/scripts/auto_vm.conf.d"
# 当前操作的虚拟机路径
curr_vm_path="${vm_dir_path}/${hostname}.vmwarevm"
# 模板机初始 IP
vm_template_ip='10.0.1.100'
# 连接模板机的密码
passwd='root1234'

# 带时间输出信息
date_msg(){
    echo "[$(date +%H:%M:%S)] $1"
}

# 批量配置文件中的虚拟机
op_select(){
    for line in $(cat ${vm_autoconf_path}/*.conf);do
        IFS=' ' arr=($line)
        hostname=${arr[0]}
        curr_vm_path="${vm_dir_path}/${hostname}.vmwarevm"
        $1
    done
}

# 启动 auto_create.conf 已配置的所有虚拟机
start_select(){
    op_select start
}

# 关闭 auto_create.conf 已配置的所有虚拟机
stop_select(){
    op_select stop
}

# 还原配置文件中的所有虚拟机到初始状态
revert_select(){
    ext='CLEAN'
    op_select shot_revert
}

# 关闭当前运行的所有虚拟机
stop_all(){
    for run_vm in $(run_list | awk 'NR>1');do
        vm_name="$(basename ${run_vm})"
        hostname="${vm_name%.vmx*}"
        curr_vm_path=${run_vm}
        stop
    done
}

# 查看正在运行的虚拟机列表
run_list(){
    vmrun list
}

# 关闭指定的虚拟机
stop(){
    date_msg "正在关闭:${hostname}"
    vmrun stop "${curr_vm_path}" soft
}

# 给指定虚拟机打快照
shot(){
    date_msg "正在给 ${hostname} 打快照"
    vmrun -T ws snapshot "${curr_vm_path}" $ext
}

# 启动指定虚拟机
start(){
    date_msg "正在启动:${hostname}"
    vmrun -T ws start "${curr_vm_path}"
}

# 设置模板机的主机名和 IP,方法一
set_ip(){
    date_msg "正在设置 ${hostname} 的 IP 和主机名"
    # 此种方式需保证宿主机中装了 sshpass 可执行程序。
    sshpass -p $passwd ssh root@${vm_template_ip} "sed -i 's/100/${ext}/' /etc/sysconfig/network-scripts/ifcfg-eth[01];hostnamectl set-hostname ${hostname};sync"
}

# 设置模板机的主机名和 IP,方法二
set_ip2(){
    date_msg "正在设置 ${hostname} 的 IP 和主机名"
    # 此种方式需要在虚拟机中准备一个 modify_ip_hostname.sh 脚本文件,该脚本的功能是修改 IP 和主机名,并且需要在虚拟机安装上 VMWare Tools
    vmrun -T ws -gu root -gp $passwd runProgramInGuest "${curr_vm_path}" /bin/bash /scripts/modify_ip_hostname.sh ${hostname} ${ext}
}

# 查看指定主机的快照列表
shot_list(){
    date_msg "${hostname} 的快照列表如下:"
    vmrun listSnapshots "${curr_vm_path}"
}

# 恢复到指定快照
shot_revert(){
    date_msg "正在恢复:${hostname}"
    vmrun -T ws revertToSnapshot "${curr_vm_path}" $ext
}

# 删除指定快照
shot_del(){
    date_msg "正在删除 ${hostname} 的 ${ext} 快照"
    vmrun -T ws deleteSnapshot "${curr_vm_path}" $ext
}

# 克隆主机
clone(){
    mkdir "${curr_vm_path}"
    date_msg "正在克隆:${hostname}"
    vmrun -T ws clone "${vm_template_path}" "${curr_vm_path}/${hostname}.vmx" linked -cloneName=${hostname}
}

# 自动创建虚拟机
auto_create(){
    for line in $(cat ${vm_autoconf_path}/*.conf);do
        echo '---------------------------'
        IFS=' ' arr=($line)
        hostname=${arr[0]}
        ip_suffix=${arr[1]}
        curr_vm_path="${vm_dir_path}/${hostname}.vmwarevm"
        if [ -e "${curr_vm_path}" ];then
            echo "${hostname} 已存在"
            continue
        else
            clone
            start
            ext=$ip_suffix && set_ip
            while [ $? -ne 0 ];do
                sleep 1
                echo '失败重试...' && set_ip
            done
            stop && sleep 2
            ext='CLEAN' && shot
        fi
    done
}

# 执行函数
$func_cmd

IFS=$OLD_IFS

使用方法二设置 IP 时需在模板机中添加如下 shell 脚本文件:

$ cat /scripts/modify_ip_hostname.sh 
#!/bin/bash
hostname=$1
ip_suffix=$2
hostnamectl set-hostname ${hostname}
sed -i "/^IPADDR/c IPADDR=10.0.1.${ip_suffix}" /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i "/^IPADDR/c IPADDR=172.16.1.${ip_suffix}" /etc/sysconfig/network-scripts/ifcfg-eth1
systemctl restart network
# Linux 杂项  

如果这篇文章对您有帮助,可点击下方链接分享给你的朋友们😋,如果遇到问题欢迎评论、留言~~~😇

评论

公众号:zze_coding

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×