基于EXSi Shell的快照自动化创建和删除

1,创建

脚本文件需要放在/vmfs/volumes目录,即虚拟机的存放目录,
放到其他目录EXSi主机重启后会被清除。

  1. vim-cmd vmsvc/getallvms 此命令用来获取ESXi主机的所有VM;
  2. 对于有些不需要快照的主机,可以在网页的vm note信息添加过滤,例如此处过滤了note信息包含‘nosnap’的虚拟机;
    注意:在网页添加虚拟机的note备注信息时,尽量不要换行或过长。
  3. 获取其他VM的vm id, 用来执行创建快照命令;
  4. 快照命名使用日期(date “+%F”);
  5. 获取的vname用来输出日志;
  6. 输出执行日志,日志格式如下:

[root@ESXi01:~] cat /schedule_snap.log
2019-03-02 01:00:33 : vmxxxxxx snapshot create success…
2019-03-02 01:01:04 : vmxxxx snapshot create success…
2019-03-02 01:01:36 : vmxxxxx snapshot create success…
2019-03-02 01:02:07 : vmx snapshot create success…
2019-03-02 01:02:39 : vmxx snapshot create success…
2019-03-02 01:03:11 : vmxxxx snapshot create success…
2019-03-02 01:03:42 : vmxxxxxx snapshot create success…
2019-03-02 01:04:14 : vmxxxx snapshot create success…

#!/bin/sh
#auto create ESXi snapshots
for i in `vim-cmd vmsvc/getallvms |  grep -v nosnap | awk '{print $1}' | grep -e "[0-9]"`
do
	vname=$(vim-cmd vmsvc/get.summary $i | grep name | awk '{ print $3 }' | cut -d \" -f 2)
	vim-cmd vmsvc/snapshot.create $i $(date "+%F")
	sleep 30s
	if [ $? -eq 0 ];then
		echo "$(date "+%F %T") : $vname snapshot create success.." >> ./schedule_snap.log
	else
		echo "$(date "+%F %T") : $vname snapshot create FAILED.." >> ./schedule_snap.log
	fi
done

2,删除

  1. 获取ESXi主机的所有VM ID;
  2. 根据VM ID获取该VM的快照数量;
  3. 是否需要删除/需要删除多少快照;

变量的数学计算,在不同的shell版本中可能有不同的写法,注意先测试
此处 DELETE_COUNT= $(($SNAPSHOT_COUNT-$DAY))
而使用中括号[ ]的写法却无法计算

  1. 根据VM ID和快照ID 执行删除命令;
    此处只保留了最近的一次快照,根据实际使用的感受,快照数量过多确实会一定程度影响虚拟机的磁盘性能,特别是对于数据库/文件服务这些对磁盘IO要求较高的场景。
#!/bin/sh
DAY=1 #保留数量
for i in `vim-cmd vmsvc/getallvms | awk '{print $1}' | grep -e "[0-9]"`
do
    SNAPSHOT_COUNT=`vim-cmd vmsvc/snapshot.get $i | egrep -- '--\|-CHILD|^\|-ROOT' | wc -l`
    if [ $SNAPSHOT_COUNT -gt $DAY ]; then
		DELETE_COUNT=$(($SNAPSHOT_COUNT-$DAY))
		OLD_SNAPSHOT_ID=`vim-cmd vmsvc/snapshot.get $i | grep Id | head -$DELETE_COUNT | awk -F: '{print $2}'`
		for n in $OLD_SNAPSHOT_ID
		do
			vim-cmd vmsvc/snapshot.remove $i $n > /dev/null
			sleep 30s
		done
    fi
done

3,添加crond任务

  1. 主机的root crond目录在/var/spool/cron/crontabs/root ;
  2. 直接编辑/var/spool/cron/crontabs/root ,ESXi主机重启后会被删除;
  3. 编辑/etc/rc.local.d/local.sh,当主机启动时添加crond任务。
  4. 此处的任务为每周执行一次;

“5c64e4b5-5ae69e88-dbb3-9cdc71dab878”是存储卷名

##/etc/rc.local.d/local.sh
#!/bin/sh
/bin/echo "0    1   *   *   6   sh /vmfs/volumes/5c64e4b5-5ae69e88-dbb3-9cdc71dab878/crontabs/snapshot_creat.sh" >>/var/spool/cron/crontabs/root 
/bin/echo "30   1   *   *   6   sh /vmfs/volumes/5c64e4b5-5ae69e88-dbb3-9cdc71dab878/crontabs/snapshot_del.sh" >>/var/spool/cron/crontabs/root
kill $(cat /var/run/crond.pid)
crond
exit 0

你可能感兴趣的:(基于EXSi Shell的快照自动化创建和删除)