侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

VMWare 虚拟机管理脚本 for Windows

zze
zze
2020-06-08 / 0 评论 / 0 点赞 / 629 阅读 / 7849 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

做下面操作之前需要安装上 git,因为下面虚拟机管理脚本使用的是 bash。

1、将 VMWare 的安装目录添加到 PATH 环境变量,我这里的安装目录如下:
image.png
所以在 PATH 环境变量中添加该目录如下:
image.png

2、添加虚拟机管理脚本,我这里将脚本命名为 auto_vm,将其保存在 C:/scripts/ 中:
image.png

然后赋予它执行权限:
image.png

脚本内容如下:

#!/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 和主机名;
            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='/c/Users/Administrator/Documents/Virtual Machines'
# 模板机路径
vm_template_path="${vm_dir_path}/centos7_template_100/centos7_template_100.vmx"
# 被控虚拟机配置文件目录,此配置文件仅用来配置需要自动克隆并配置的虚拟机,格式如下:
# web01 7
# web02 8
# 第一列为主机名,第二列为 IP 后缀
vm_autoconf_path="/c/vm"
# 当前操作的虚拟机路径
curr_vm_path="${vm_dir_path}/${hostname}/${hostname}.vmx"
# 模板机初始 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}/${hostname}.vmx"
        $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 和主机名"
    # 此种方式需要在虚拟机中准备一个 modify_ip_hostname.sh 脚本文件,该脚本的功能是修改 IP 和主机名,并且需要在虚拟机安装上 VMWare Tools
    vmrun -T ws -gu root -gp ${passwd} runProgramInGuest  "${curr_vm_path}" '//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(){
    date_msg "正在克隆:${hostname}"
    vmrun -T ws clone "${vm_template_path}" "${curr_vm_path}" 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}/${hostname}.vmx"
        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

3、为方便的可以在任意位置使用该脚本,将 C:/scripts 目录也添加到 PATH 环境变量:
image.png

4、创建模板机,对应上面脚本的模板机名称为 centos7_template_100,如下:
image.png

其文件在虚拟机存放目录下如下:
image.png

5、将模板机的 IP 设置为 10.0.1.100,ROOT 用户密码为 root1234,当然你也可以修改上面脚本中使用你自己喜欢的模板机 IP 和 ROOT 密码。

6、在虚拟机中安装上 VMWare Tools。安装 VMWare Tools 的方法很简单,选中 VMWare 【虚拟机】菜单,然后点击【安装VMware Tools】:
image.png

接下来挂载 CD 设备:
image.png

将安装压缩包复制出来解压然后安装:
image.png

按照提示输入 yesno 即可安装成功。

7、创建一个目录存放需自动管理的虚拟机配置文件,我这里就创建在 C:/vm 目录下,添加一个后缀为 .conf 的文件:
image.png

其内容如下:
image.png
该配置将会创建主机名分别为 test01test02 的虚拟机,它们对应的 IP 后缀分别为 101102

IP 和主机名的修改还需要依赖于一个脚本,我将该脚本存放在模板机的 /scripts 目录下,命名为 modify_ip_hostname.sh,其内容如下:

$ 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
systemctl restart network
sync

所以上面的配置配合该脚本执行后最终设定 test01test02 主机的 IP 分别为 10.0.1.10110.0.1.102

8、测试一下,自动创建虚拟机执行 auto_create 子命令即可(更多子命令可参考脚本开头注释),如下:
image.png
查看 VMware 会发现对应创建了这两个虚拟机:
image.png

大功告成~~~

0

评论区