脚本定时拷贝虚机

虚机备份有诸多方式,最直接的方式就是拷贝虚机所在的文件夹,实现完全备份。若要定期自动去实现虚机备份,可先编写一个自动备份虚机的脚本,然后将脚本加入周期性计划任务中。


1、拷贝虚机

  该脚本需要注意三点,一是:虚机的名称,执行脚本时,将虚机名称作为参数传入;二是虚机所在的磁盘,脚本默认虚机所在的磁盘为“datastore1”,可根据实际情况修改SOURCE_DIR变量;三是将虚机文件拷贝到哪个位置,修改DST_DIR参数。

  执行完成后会在/var/log下生成一个bakupvm.log日志,查看日志可看成备份的情况。

  脚本过程:先判断虚机是否关机,若开机,则先关机,然后再拷贝虚机文件到指定位置,将拷贝任务放到后台,使用while循环时刻监控拷贝命令是否完成。

#!/bin/sh                                                                                                                                         
                                                                                                                                                  
VM_NAME=$1                                                                                                                                        
LOG_PATH="/var/log/bakupvm.log"                                                                                                                   
                                                                                                                                                  
echo > $LOG_PATH                                                                                                                                  
                                                                                                                                                  
if [ ! -n "$1" ]                                                                                                                                  
then                                                                                                                                              
        echo "$1 is not exist!" >> $LOG_PATH                                                                                                      
        exit 1                                                                                                                                    
fi                                                                                                                                                
                                                                                                                                                  
SOURCE_DIR="/vmfs/volumes/datastore1/$VM_NAME/"                                                                                                   
DST_DIR="/vmfs/volumes/datastore1/vmbakup_dir"                                                                                                    
                                                                                                                                                  
if [ ! -d $SOURCE_DIR ]                                                                                                                           
then                                                                                                                                              
        echo "SOURCE DIR is not exist! " >> $LOG_PATH                                                                                             
        exit 1                                                                                                                                    
fi                                                                                                                                                
                                                                                                                                                  
if [ ! -d $DST_DIR ]                                                                                                                              
then                                                                                                                                              
        mkdir $DST_DIR                                                                                                                            
fi                                                                                                                                                
                                                                                                                                                  
                                                                                                                                                  
echo "stop vm" >> $LOG_PATH                                                                                                                       
                                                                                                                                                  
vim-cmd vmsvc/getallvms | grep $VM_NAME                                                                                                           
if [ $? -ne 0 ]                                                                                                                                   
then                                                                                                                                              
        echo "$VM_NAME is not exist!" >> $LOG_PATH                                                                                                
        exit 1                                                                                                                                    
else                                                                                                                                              
        echo "$VM_NAME is exist "   >> $LOG_PATH                                                                                                  
        VM_ID=`vim-cmd vmsvc/getallvms | grep -w $VM_NAME | awk '{print $1}'`                                                                     
        echo $VM_ID >> $LOG_PATH                                                                                                                  
fi                                                                                                                                                
                                                                                                                                                  
vim-cmd vmsvc/power.getstate $VM_ID | grep "Powered on"                                                                                           
if [ $? -eq 0 ]                                                                                                                                   
then                                                                                                                                              
        echo "$VM_NAME will shutdown " >> $LOG_PATH                                                                                               
        vim-cmd vmsvc/power.off $VM_ID                                                                                                            
        sleep 10                                                                                                                                  
        echo "$VM_NAME shutdown ok! " >> $LOG_PATH                                                                                                
fi                                                                                                                                                
                                                                                                                                                  
echo "back up $VM_NAME all file,will take 2 - 4 hours! "                                                                                          
                                                                                                                                                  
CP_NUM_OLD=`ps | grep -w cp | wc -l`    

nohup cp -rf $SOURCE_DIR/* $DST_DIR/ &                                                                                                            
echo "start backup......" >> $LOG_PATH                                                                                                            
                                                                                                                                                  
while :                                                                                                                                           
do                                                                                                                                                
        sleep 10                                                                                                                                  
        CP_NUM_NEW=`ps | grep -w cp | wc -l`                                                                                                      
        if [ $CP_NUM_NEW -eq $CP_NUM_OLD ]                                                                                                        
        then                                                                                                                                       
	    echo "cp ok!" >> $LOG_PATH                                                                                                        
                echo "start vm" >> $LOG_PATH                                                                                                      
                vim-cmd vmsvc/power.on $VM_ID                                                                                                     
                sleep 10                                                                                                                          
                echo "OK!" >> $LOG_PATH                                                                                                           
                exit 0                                                                                                            
        else                                                                                                                                      
                echo "cp......" >> $LOG_PATH                                                                                                      
        fi                                                                                                                                        
                                                                                                                                                  
        #CP_PID=`ps | grep -w cp | awk '{print $1}'`                                                                                              
done 

  2、将脚本加入周期性计划任务

   vmware下设置周期性计划任务的文件在 /var/spool/cron/crontabs/root文件下。完全遵循crontab的写法:“分 时 日 月 周 命令”,强制保存。

  新增计划任务的作用是:每分钟往/test.txt文件追加“1”。 

若拷贝虚机的任务是每个月的周日凌晨备份,可以这样写(假设脚本路径是“/var/bakvm.sh”):

0 0 * /3 7  /var/bakvm.sh

  重启crond:

cat /var/run/crond.pid                 #查看crond的pid
kill  $(cat /var/run/crond.pid)            #杀了crond进程的pid号
/usr/lib/vmware/busybox/bin/busybox crond         #启动crond
cat /var/run/crond.pid                     #检查crond是否启动成功

  查看新增的周期性计划任务结果:

  【注】以上仅仅适用于服务器不重启的情况下,若esxi服务器重启,以上新增的周期性计划任务将会失效。此时还需要进行以下操作:

    编辑/etc/rc.local文件,追加3行:

/bin/kill $(cat /var/run/crond.pid)
/bin/echo '* * * * * echo "1" >> /test.txt ' >> /var/spool/cron/crontabs/root
/bin/busybox crond

    运行auto-backup.sh脚本去备份/etc/rc.local文件,放在重启服务器重置/etc/rc.local文件。

    文件位于:

 

 

posted @ 2019-02-25 18:02  一个有故事的devops  阅读(3350)  评论(0编辑  收藏  举报