#!/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
评论区